之前一直有在问DS1302的问题,这几天又想到一个问题。先上整个程序
#include<reg52.h>
#define uchar unsigned char
#define uint
unsigned int
sbit DU=P2^6;
sbit WE=P2^7;
sbit IO=P2^0;
sbit
CLK=P2^1;
sbit RST=P2^4;
uchar code
tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管断码表
uchar
second,minute,hour;
void delay(void)
{
uchar
i,j;
for(j=1;j>0;j--)
for(i=110;i>0;i--) ;
}
void
input(uchar byte)//写一个字节
{
uchar
i;
for(i=8;i>0;i--)
{
IO=byte&0x01;
CLK=1;
CLK=0;
byte>>=1;
}
}
uchar
output(void)//读一个字节
{
uchar i,dat=0;
for(i=8;i>0;i--)
{
dat>>=1;
if(IO)dat|=0x80;
CLK=1;
CLK=0;
}
return
(dat);
}
void write(uchar addr,uchar dat)//在特定地址写数据
{
CLK=0;
RST=0;
RST=1;
input(addr);
input(dat);
CLK=1;
RST=0;
}
uchar read(uchar addr)//从特定地址读数据
{
uchar
dat;
RST=0;
CLK=0;
RST=1;
input(addr);
dat=output();
CLK=1;
RST=0;
return(dat);
}
void
init()//初始化时间,我想显示12点30分0秒
{
write(0x8e,0x00);//写保护
write(0x80,0x00);//秒 钟从0开始
write(0x82,0x30);//分钟设为30
write(0x84,0x12);//时钟设为12
}
void read_time()//读时间
{
second=read(0x81);
minute=read(0x83);
hour=read(0x85);
}
void
display()//显示程序
{
WE=1;
P0=0xfe;
WE=0;
DU=1;
P0=tab[hour/16];//时钟十位
DU=0;
delay();
WE=1;
P0=0xfd;
WE=0;
DU=1;
P0=tab[hour%16];//时钟各位
DU=0;
delay();
WE=1;
P0=0xfb;
WE=0;
DU=1;
P0=tab[minute/16];
DU=0;
delay();
WE=1;
P0=0xf7;
WE=0;
DU=1;
P0=tab[minute%16];
DU=0;
delay();
WE=1;
P0=0xef;
WE=0;
DU=1;
P0=tab[second/16];
DU=0;
delay();
WE=1;
P0=0xdf;
WE=0;
DU=1;
P0=tab[second%16];
DU=0;
delay();
}
main()
{
init();
while(1)
{
read_time();
display();
}
}
问题是这样的,我想显示12点30分0秒,原本的程序是在相应的寄存器用16进制初始化,比如0x00,0x30,0x12。但我一开始不知道问什么16进制也可以写成10进制的形式“12:30:00“,毕竟10进制好理解些,我就尝试把对应的寄存器用十进制去初始化,然后在显示程序display中分别改成hour/10
hour%10 minute/10 minute%10 second/10 second%10
但这样结果是开发板上电初始化的一瞬间数码管显示是正确的,但是接下来就不正确 了,秒开始乱跳,越到后来都乱跳了,想问下为什么不能用十进制去初始化? |