两片74HC595级联动态驱动8位数码管 51单片机
本帖最后由 Stone_up 于 2013-3-29 12:30 编辑功能 : 用2片74HC595驱动8位数码管, 级联的最低1片595控制位选,那么第一片控制段选
时间 : 2013-3-28 21:11:59
作者 : Stone
版本 : REV1
平台 : STC89C52 11.0592MHz
现象 : 8位数码管从第一位开始从0计数,满10进位
版本说明 : 第0版本没有使用定时器中断,同时定义了一个 unsigned long int 变量计数
再把这个数的每位分离出来显示,所以导致有点闪屏,此版本使用定时器中断,
而且没有用 unsigned long int 之类的变量,而是用数组 Val 来计数,
主函数只负责显示,其它的在中断函数里面处理,这样显示一点都不闪屏,
备注 : 可以用 ULN2003A 接在数码管的 com 口来提高驱动能力,ULN2003A里面有7个NPN三极管,
可以大大提高驱动能力
联系 : 欢迎访问本人签名中的博客,进行互动交流。
#include <reg52.h>
sbit SCK = P1^1; // 数据输入时钟线,脉冲
sbit SI= P1^0; // 数据线
sbit RCK = P1^2; // 锁存
unsigned char code SMG = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};// 段码
unsigned char code Wei = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位选
unsigned char Val= {0}; // 要显示的数据
************************ 函数声明 ************************
void interrupt_init(void);
void timer_init(void);
控制74HC595输出数据
void Output(void)
{
RCK = 0;
RCK = 1;
}
向74HC595中写入一字节数据
void Write_Byte(unsigned char dat)
{
unsigned char i = 0;
for(i=0; i<8; i++)
{
SCK = 0;
SI= dat & 0x80;
SCK = 1;
dat <<= 1;
}
}
显示函数
void Display(unsigned char * p)
{
unsigned char * pt = Wei;
Write_Byte(*(pt+0));
Write_Byte(SMG[*(p+7)]);
Output();
Write_Byte(*(pt+1));
Write_Byte(SMG[*(p+6)]);
Output();
Write_Byte(*(pt+2));
Write_Byte(SMG[*(p+5)]);
Output();
Write_Byte(*(pt+3));
Write_Byte(SMG[*(p+4)]);
Output();
Write_Byte(*(pt+4));
Write_Byte(SMG[*(p+3)]);
Output();
Write_Byte(*(pt+5));
Write_Byte(SMG[*(p+2)]);
Output();
Write_Byte(*(pt+6));
Write_Byte(SMG[*(p+1)]);
Output();
Write_Byte(*(pt+7));
Write_Byte(SMG[*(p+0)]);
Output();
}
int main(void)
{
timer_init();
interrupt_init();
while(1)
{
Display(Val);
}
return 0;
}
void interrupt_init(void)
{
EA= 1;//开总中断
ET0 = 1;//开定时器0中断
ET1 = 1;//开定时器1中断
}
void timer_init(void)
{
TMOD = TMOD | 0x01;//定时器0工作方式1
TMOD = TMOD & 0xFD;
TH0= 0x4B; //装初值,50ms计数
TL0= 0xFF;
TR0= 1; //开启定时器0
}
void timer0() interrupt 1
{
static unsigned char counter0 = 0;
counter0++;
TH0= 0x4B; //重新装入初值,定时器0从头开始计数,计数50ms
TL0= 0xFF;
if(2 == counter0)//2*50 ms = 100ms = 0.1s
{
counter0 = 0;//counter0置零,定时器0从头开始计数
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
Val++;
if(10==Val)
{
Val = 0;
}
}
}
}
}
}
}
}
}
} 刚好用上!{:lol:} 不错谢谢分享我是用了 3 个 59516个5401 驱动16位数码管滴... angler12 发表于 2013-3-30 13:06 static/image/common/back.gif
刚好用上!
能帮助到大家是我最大的鼓励。
呵呵,能用 fqc168 发表于 2013-3-31 10:42 static/image/common/back.gif
呵呵,能用
经过实践验证 不错,正想用{:smile:} 我写也会用很多的if
........ 你好有两片HC595驱动八位数码管的仿真图吗?
顶贴!!! 不错,我也要用这个代码 可以把显示放定时中断中吗?如果放main的while中,遇到定时高优先级会暂停主函数的显示
页:
[1]