2019-07-15 09:53发布
人中狼 发表于 2017-8-14 13:23 不是很明白你的问题,首先1302对同一寄存器的读和写地址是不一样的。其次对于小时来说在12小时制时有AM和PM的区别,按上图的内容看,如果是12小时制,那么如果不判断AM和PM,在12点向1点转换的时候,会将1点读为21点。
人中狼 发表于 2017-8-14 15:24 这里set_time(WRITE_HOUR,23);,我认为你是设置了小时为23点,但是这里第7位为0,所以还是24小时制,如果要设置成12小时制,比如上午11点,那么所写入的十六进制格式应该是0x91,试试看,应该是这样。 在12小时制的情况下,读写小时寄存器时都应该要判断和设置AM,PM标志。 ...
最多设置5个标签!
我截取代码的一部分
//下面是根据图标的写读寄存器的地址
#define WRITE_SECOND 0x80
#define WRITE_MINUTE 0x82
#define WRITE_HOUR 0x84
#define READ_SECOND 0X81
#define READ_MINUTE 0X83
#define READ_HOUR 0X85
#define PROTECT 0x8e
//下面是主函数 readDS writeDS //如下 我实际操作的时候只是写入表中地址以及初始时间就可以运行,如果地址就是包含(12小时 /24小时制选择情况的信息的话)代码中地址/命令小时寄存器的写为 0x84 这里的地址就 二进制1000 0100 七位和三位为一 也就是 12小时制 但是我设定的时间还是正常的24小时的 这个疑点(运行情况见gif)
void main()
{
uchar h,m,s;
init();
set_time(WRITE_HOUR,23);
set_time(WRITE_MINUTE,59);
set_time(WRITE_SECOND,59);
while(1)
{
h=readDS(READ_HOUR);
m=readDS(READ_MINUTE);
s=readDS(READ_SECOND);
h1=h/10;h2=h%10;
m1=m/10;m2=m%10;
s1=s/10;s2=s%10;
display();
}
}
// 设置时间函数 readDS writeDS
void set_time(uchar address,uchar val)
{
set_protect(0);
writeDS(address,BtoBCD(val));
}
void writeDS(uchar address,uchar date)
{
uchar i;
SCLK=0;
_nop_();
RST=1;
for(i=8;i>0;i--)
{
DSIO=address&0x01;
address>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
for(i=8;i>0;i--)
{
DSIO =date&0x01;
date>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
RST=0;
}
uchar readDS(uchar address)
{
uchar i,date,date1;
SCLK=0;
_nop_();
RST=1;
for(i=8;i>0;i--)
{
DSIO=address&0x01;
address>>=1;
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
for(i=8;i>0;i--)
{
date>>=1;
date1=DSIO;
date=(date|(date1<<7));
SCLK=1;
_nop_();
SCLK=0;
_nop_();
}
RST=1;
return BCDtoB(date);
}
在12小时制的情况下,读写小时寄存器时都应该要判断和设置AM,PM标志。
抱歉啊,我的图片少了一部分
bit7是最高位啊,我也试了地址变了,数据好像就写不进去了,还有另一张图我也看不懂,控制位最高位(位7)一定是1?和前面说的是不同的控制字吗,但实际程序没有管这个啊
一周热门 更多>