找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2638|回复: 5
打印 上一主题 下一主题
收起左侧

单片机+74ls164级联编程问题

[复制链接]
跳转到指定楼层
楼主
首先,实现单个74ls164点亮共阳数码管。详细的74ls164资料网上有,这一步也实现了
#include "reg51.h"
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char

//IO口定义
sbit DAT=P2^7;
sbit CLK=P2^6;


//0-9,-,全灭
//D0 D1 D2 D3 D4 D5 D6 D7
//a  b  c  d  e  f  g  sp
uchar code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};

/**********************
* *函 数 名:dispbyte
* *函数功能:取出段码送入到数码管显示
* *返 回 值:无返回值
***********************/
void dispbyte(uchar byte)
{   
         uchar num,i;
         num=tab[byte];//取出段码
    for(i=0;i<8;i++)   //循环八次送至led数码管
    {
             CLK=0;               
                        if(num&0x01)  DAT=1;//判断最高位,并取出最高位
                        else          DAT=0;//
                   CLK=1;        //上升沿有效
        num>>=1;     //左移一位(每次移动一位,共8次)
    }
}

void delay(uint ms)
{
        uchar i;
        for(;ms!=0;ms--)
                for(i=0;i<250;i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
}

main()
{
    unsigned char h;
        while(1)
        {
      for(h=0;h<11;h++)
      {
                        dispbyte(h);
                        delay(1000);
      }
                h=0;
    }
}

第二步:通过级联的方式驱动三个数码管
程序如下,编译没什么问题。就是不知道是不是逻辑上的错误,还是程序哪里有问题,仿真不能够正常运行
#include"reg52.h"
#define u16 unsigned int
#define u8 unsigned char
sbit CLK=P2^0;
sbit DAT=P2^1;
u8 code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9 全灭    
//函数声明
void Send_Byte(u8 byte);
void Delay_ms(u16 z);
void Display(u16 number);
//主函数
void main()
{
        while(1)
        {
                 Display(111);
                 Delay_ms(3000);//
                 Display(222);//
                 Delay_ms(3000);
        }        
}
//数码管显示函数
void Display(u16 number)
{
        u8 bai,shi,ge;
        /* qian = number/1000;
        Send_Byte(qian); */
        Delay_ms(5);
        bai = number%1000/100;
        Send_Byte(bai);
        Delay_ms(5);
        shi = number%100/10;
        Send_Byte(shi);
        Delay_ms(5);
        ge = number%1000;
        Send_Byte(ge);
        Delay_ms(5);
}
//发送数据函数
void Send_Byte(u8 byte)
{
        u8 num,d;
        num = tab[byte];
        for(d=0;d<8;d++)
        {
                CLK = 0;
                DAT=num&0x01;
                CLK =1;
                num>>=1;
        }
}
//延时函数
void Delay_ms(u16 z)
{
        u16 x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
仿真运行如图:



IMG_0725.JPG (4.95 MB, 下载次数: 62)

164级联驱动数码管

164级联驱动数码管
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:373095 发表于 2020-5-10 22:05 | 只看该作者
将段码更改了一下:
tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff}

第一个数码管还是现实8,其余两个分别现实1,1  
                                                           2,2
回复

使用道具 举报

板凳
ID:373095 发表于 2020-5-10 22:08 | 只看该作者
第二个程序的IO口设置忘记改了,也是
sbit CLK=P2^6;
sbit DAT=P2^7;
回复

使用道具 举报

地板
ID:373095 发表于 2020-5-10 22:19 | 只看该作者
已经解决
回复

使用道具 举报

5#
ID:373095 发表于 2020-5-10 22:20 | 只看该作者
为什么我自己给自己写评论都要被删除啊
回复

使用道具 举报

6#
ID:373095 发表于 2020-5-11 07:50 | 只看该作者
可实现代码如下:
#include"reg52.h"
#include<intrins.h>
#define u16 unsigned int
#define u8 unsigned char
//74ls164IO口定义
sbit CLK=P2^6;
sbit DAT=P2^7;

//
u8 code tab[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0xff};//0-9 全灭,无小数
u8 code tab1[]={0x02,0x9e,0x24,0x0c,0x98,0x48,0x40,0x1e,0x00,0x08,0xfe};//共阳数码管,带小数

u16 code Data[]={323,456,789};
//函数声明
void dispbyte(u8 byte);
void dispbyte1(u8 Byte);
void Delay_ms(u16 z);
void Display(u16 number);
//主函数
void main()
{
        u8 h;
        while(1)
        {
                for(h=0;h<3;h++)
                {
                         Display(Data[h]);
                         Delay_ms(3000);
//                         Display(222);
//                         Delay_ms(3000);
                }
        }       
}
//数码管显示函数
void Display(u16 number)
{
        u8 bai,shi,ge;
        Delay_ms(5);
        bai = number/100;
        dispbyte(bai);
        Delay_ms(5);
        shi = number%100/10;
        dispbyte1(shi);
        Delay_ms(5);
        ge = number%10;
        dispbyte(ge);
        Delay_ms(5);
}
//发送数据函数
void dispbyte(u8 byte)
{
        u8 num,d;
        num = tab[byte];
        for(d=0;d<8;d++)
        {
                CLK = 0;
                DAT=num&0x01;
                CLK =1;
                num>>=1;
        }
}

void dispbyte1(u8 Byte)
{
        u8 num,d;
        num = tab1[Byte];
        for(d=0;d<8;d++)
        {
                CLK = 0;
                DAT=num&0x01;
                CLK =1;
                num>>=1;
        }
}
//延时函数
void Delay_ms(u16 ms)
{
        u8 i;
        for(;ms!=0;ms--)
                for(i=0;i<250;i++)
                {
                        _nop_();
                        _nop_();
                        _nop_();
                        _nop_();
                }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表