数码管 动态扫描 难了
时间:10-02
整理:3721RD
点击:
我用4个4位一体的数码管做一个万能历,
如:2个4位一体的数码管显示年月日:13-02-21,
还有2个4位一体的数码管显示时分秒:11-34-53。
问下大家 16位(个)数码管动态扫描 显示不清楚,不知道怎么调整 延时时间长了,一闪一闪,延时时间短了,看不清楚 。如果少显示几个数码管,效果又好一点。
附上程序,望大家参考一下(仿真完全OK,硬件使用的话,数码管多了,就不行了)。
#include <intrins.H>
#define uchar unsigned char
#define uint unsigned int
sbit ds1302_sclk = P3^6;
sbit ds1302_rst = P3^5;
sbit ds1302_io = P3^4;
uchar code gongyin[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //共阴0~9,-,熄灭
uchar code weixuan[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
uchar tab[16];
void delay() //延时计算约等于 a*0.011ms
{ uint a;
for(a=30;a>0;a--); //a*0.011ms
}
void write1302byte(uchar dat)
{uchar i;
ds1302_rst=1;
ds1302_sclk=0;
for(i=8;i>0;i--)
{
ds1302_io=dat&0x01;
_nop_();
_nop_();
ds1302_sclk=1;
_nop_();
_nop_();
ds1302_sclk=0;
dat>>=1;
}
}
uchar read1302byte()
{
uchar i,dat=0;
for(i=8;i>0;i--)
{
dat>>=1;
if(ds1302_io)
dat|=0x80; //dat=dat|0x80;
ds1302_sclk=1;
_nop_();
_nop_();
ds1302_sclk=0;
_nop_();
_nop_();
}
return dat; //返回读取的数
}
void write1302(uchar cmd,uchar dat)
{
ds1302_rst=0;
ds1302_sclk=0;
_nop_();
_nop_();
ds1302_rst=1;
write1302byte(cmd);
_nop_();
write1302byte(dat);
ds1302_sclk=1;
ds1302_rst=0;
}
uchar read1302(uchar cmd)
{uchar dat;
ds1302_rst=0;
ds1302_sclk=0;
_nop_();
_nop_();
ds1302_rst=1;
_nop_();
_nop_();
write1302byte(cmd);
dat=read1302byte();
ds1302_sclk=1;
ds1302_rst=0;
return dat;
}
void init1302() //初始化DS1302
{ //写入2013-02-28星期三 23:58:51
write1302(0x8e,0x00);
write1302(0x80,(51/10*16+51%10)); //写入51秒 0101.0001
write1302(0x82,(58/10*16+58%10)); //写入58分 0101.1000
write1302(0x84,(23/10*16+23%10)); //写入23时 0010.0011
write1302(0x86,(28/10*16+28%10)); //写入28日
write1302(0x88,( 2/10*16+ 2%10)); //写入2月
write1302(0x8a,( 3/10*16+ 3%10)); //写入星期三
write1302(0x8c,(13/10*16+13%10)); //写入13年,2013
write1302(0x8e,0x80);
}
void main()
{
init1302();
while(1)
{ uchar i;
//时-分-秒
tab[0]=read1302(0x85)/16; //存放时,十位
tab[1]=read1302(0x85)&0x0f; //存放时,个位
tab[2]=10;
tab[3]=read1302(0x83)/16; //存放分,十位
tab[4]=read1302(0x83)&0x0f; //存放分,个位
tab[5]=10;
tab[6]=read1302(0x81)/16; //存放秒,十位
tab[7]=read1302(0x81)&0x0f; //存放秒,个位
//年-月-日
tab[8]=read1302(0x8D)/16; //存放年,十位
tab[9]=read1302(0x8D)&0x0f; //存放年,个位
tab[10]=10; //数码管显示“—”
tab[11]=read1302(0x89)/16; //存放月,十位
tab[12]=read1302(0x89)&0x0f; //存放月,个位
tab[13]=10;
tab[14]=read1302(0x87)/16; //存放日,十位
tab[15]=read1302(0x87)&0x0f; //存放日,个位
for(i=0;i<16;i++)
{
P2=weixuan; //数码管位选
P0=gongyin[tab]; //数码管段选
delay();
P2=0X00; //消影
P0=0X00;
delay();
}
}
}
闪的话应该是显示时间太短了
小编的帖子怎么仅作者可见
不错
16个数码管 动态扫描,有其他更好的办法吗?
不懂,但支持能人,加强学习.
锁存
很棒好喜欢纳
对于这个问题,我觉得可能是硬件的驱动没做好,如果仿真没问题的话,就应该是硬件的原因了。不过可以这么改把年月日改为静态显示。
年月日 改为静态显示?51单片机哪有这么多IO资源啊?难道每个数码管都加一个锁存器?
主程序中,FOR循环前面那一连串用来读取年月日的,不用随时读取,LED扫秒速度被拖慢了,
1秒左右读一次可以了!
char j=0;
j++
if(j>=200) //按实际需要可以修改,控制在1秒左右
{
j=0;
在这儿加入读取年月日和时间的代码
}
sqbijia.com