首先,实现单个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--);
}
仿真运行如图:
74ls164级联驱动数码管
|