今天在调试程序的时候遇到这样一个问题:开始的时候DS12C887的每一个寄存器的实时信息都能读出来,并在1602液晶上显示正确,但后来调试过程中不小心写了这样一条程序:write_ds(0x06);
我原本的意思是想把寄存器B的最高位清零。正确形式应该是write_ds(0x0b,0x06);不小心把0x0b漏写了,结果问题出现了。887的06寄存器就是星期读不回来,把write_ds(0x06);改正过来也读不回来,因为写的程序比较大到了600多行,下午就翻来复去,以为是哪里不小心弄错了,或者中文输入法的时候不小心输入了空格等等。仔细检查没发现这些问题,觉得奇怪了,明明是好好的程序怎么就突然不行了。后来换了一个887,可以读回06寄存器的信息。后来我就想,是不是这个寄存器坏了,读不回来了,想想觉得这很不可能,后来突然想到了,把06寄存器初始化一下,先给它写个数进去,这样对了,读取成功。后总结,一定是这条语句write_ds(0x06);改动了06寄存器里面的数据,写入了一个未知的数(它正常的话数据是1-7循环)。还有在操DS12C887时发现总结了一点点东西在这里也共享一下:
1)新的DS12C887一定要开启内部晶振,write_ds(0x0a,0x20);内部晶振一旦开启了好像不能关闭 了,我尝试了write_ds(0x0a,0x00);但实时时钟信息还会更新;
2)B寄存器最高为1时不能进行更新显示,就是不能读取寄存器里面的实时信息,但内部时钟会继续更新,只是禁止读取,在B最高位为1或0是都可以向寄存器里面写数据的,开始我也误解了,以为数据更新的时候不能往里面写数据,其实也可以的;
3)时钟格式,编码设置按控制寄存器B来就可以了;
4)昨天还遇到了这样一个问题,(我是用P0口连接887的通信并口的)读取到了秒信息,更新也完全正确,但是小时,分钟在几个不确定的数字中循环跳动,但是秒钟到了59之后,分种循环跳动中的有个数字会相应的加1,(开始没发现这个问题,后来仔细看,观察的到了,分钟循环跳动的频率跟秒一样),开始也检查了很多地方没发现问题,后来在P0口上加了个上拉电阻,OK了!
|