数码管 动态扫描 难了

2019-07-16 02:26发布

本帖最后由 chenengood 于 2013-2-22 10:36 编辑

我用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();
   }
}
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
sfwjqwnl
1楼-- · 2019-07-16 14:04
很棒好喜欢纳
5768340
2楼-- · 2019-07-16 19:24
对于这个问题,我觉得可能是硬件的驱动没做好,如果仿真没问题的话,就应该是硬件的原因了。不过可以这么改把年月日改为静态显示。
chenengood
3楼-- · 2019-07-16 19:54
5768340 发表于 2013-2-22 15:29
对于这个问题,我觉得可能是硬件的驱动没做好,如果仿真没问题的话,就应该是硬件的原因了。不过可以这么改 ...

年月日  改为静态显示?51单片机哪有这么多IO资源啊?难道每个数码管都加一个锁存器?
xv8276
4楼-- · 2019-07-17 00:36
 精彩回答 2  元偷偷看……
索菲斯
5楼-- · 2019-07-17 05:06

sqbijia.com

一周热门 更多>