一、首先搞明白“数据存放地址”和“写入格式”
BCD码(8421码),前四位二进制数表示十进制数的十位,后四位二级制数表示十进制数的歌位
二、官方文档
解释:例如“秒”:读取地址 81h,写入地址 80h ;bit6,bit5,bit4,用三位二进制数表示“秒”的十位(“秒”的十位最多是5);bit3,bit2,bit1,bit0,用四位二级制数表示秒的个位。
三、CH和WP解释
四、底层代码解释
首先我们要怎么写,怎么写“一个字节”(8个bit)进去?
先看左代码块(其实左代码块是为右代码块服务的,往下看就知道了)
1.定义一个写的函数,然后他的入口参数是我们要写的数据
2.然后看到unsigned char i ,定义了一个变量i让他循环八次,即把每一位都写进去
3.看到SCK=0,即把SCLK拉低
4.在看到SDA=temp&0x01,SDA就是IO输入,任何数"与(&)"1都是它本身,这样我们便把入口参数(即要输入的数据,它有八位)的第一位取出来给到了SDA
5.temp>>=1,即把temp右移一位,为下次做准备,下次便可把“要输入的数据”的第二位取出来给到了SDA
6.SCK=1,又把SCLK拉高,便把数据写入到芯片里了
再看右代码块
1.RST=0,先把RST拉低,nop()是“等待一会”
2.SCK=0,再把SCLK拉低,nop()是“等待一会”
3.RST=1,把RST拉高,准备输入了,nop()是“等待一会”
4.利用到左代码块(即左边定义的那个函数),写入地址
5.利用到左代码块(即左边定义的那个函数),写入数据
6.RST=0,最后再把RST拉低,即完成“地址”和“数”的写入了
同理,只读取也是一样
1.定义i循环八次,定义一个空的temp用于接收读取到的数值
2.按图中时序操作拉低
3.按图中时序操作拉低
4.按图中时序操作拉高,准备开始
5.首先前八位写入地址(图所示也是如此)
6.SCLK拉低时开始读,所以先让SCK=0
7.
8.if(SDA),即如果SDA为真,即SDA有数据,就让它“或”上0x80(1000 000)
(SDA是一位一位的)SDA有数据,即SDA为1,那么temp那一位就“或”上0x80,因为temp初始是第八位是1,而后会进行移位,那一位位假,即0,那时候就不或上1
最后就temp就把数读出来 了
temp一直都在变
最后就把temp的值返回