数码管 动态扫描 难了

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条回答
小萃米
1楼-- · 2019-07-16 03:50
闪的话应该是显示时间太短了
zhihuizhou
2楼-- · 2019-07-16 04:09
楼主的帖子怎么仅作者可见
pelixiaoyao
3楼-- · 2019-07-16 04:16
不错
chenengood
4楼-- · 2019-07-16 06:40
小萃米 发表于 2013-2-21 11:48
闪的话应该是显示时间太短了

16个数码管 动态扫描,有其他更好的办法吗?
fsss007
5楼-- · 2019-07-16 10:56
 精彩回答 2  元偷偷看……
Mr Liu
6楼-- · 2019-07-16 11:21
锁存

一周热门 更多>