关于DS1302的时钟/日历寄存器的疑问
附图上,小时寄存器的7位来选择 12进制还是24进制 当为高时是12小时 低时是24小时 最左侧一栏有读地址和写地址 在写入地址/命令后就可以设定7位
图上小时寄存器7位为1;
但是我按照表格左侧的地址写代码的时候,通过数码管显示的时候还是24小时制的,这和数据手册描述的不一样啊!
为很么会出现这样的情况?
对于1302的操作分两部分,一部分是控制字,也就是地址及命令字节,另一部分是数据。
比如向小时寄存器写入24小时制的13点,应该是先发送0x84h,这个是写小时寄存器的地址,再发送0x13h,这个是小时的数据13点。
如向小时寄存器写入12小时制的下午1点,应该是先发送0x84h,再发送0xc1h。
读取小时寄存器数据则是先发送0x85h,这个是读小时寄存器的地址,再读取小时寄存器的数据。
附图在这
表示关注中
不是很明白你的问题,首先1302对同一寄存器的读和写地址是不一样的。其次对于小时来说在12小时制时有AM和PM的区别,按上图的内容看,如果是12小时制,那么如果不判断AM和PM,在12点向1点转换的时候,会将1点读为21点。
我截取代码的一部分
//下面是根据图标的写读寄存器的地址
#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);
}
这里set_time(WRITE_HOUR,23);,我认为你是设置了小时为23点,但是这里第7位为0,所以还是24小时制,如果要设置成12小时制,比如上午11点,那么所写入的十六进制格式应该是0x91,试试看,应该是这样。
在12小时制的情况下,读写小时寄存器时都应该要判断和设置AM,PM标志。
抱歉啊,我的图片少了一部分
bit7是最高位啊,我也试了地址变了,数据好像就写不进去了,还有另一张图我也看不懂,控制位最高位(位7)一定是1?和前面说的是不同的控制字吗,但实际程序没有管这个啊
感谢,我想通了
我试了0x91,结果显示为了0,第四位应该不是10时吧? 但我也试了0x8b,结果也不行
已解决