对于面向复制粘贴编程的我来说可真不容易,折腾了整整一上午才搞定。
试了多家的代码才测试成功。MCU为STC8H3K32S2,PCF8563T为马宝2.11大洋买的:
13点设置好RTC数据时差不到一秒,17点再看时,已经差了2秒了,
这时钟模块也不靠谱啊:
寄存器里面是BCD码格式,往里面写、读出来显示的时候都要做转换,
一开始直接读、写十进制发现咋整都不对,后面才改正过来。
粘上代码备查备用:
- #include "bsp_pcf8563.h"
- unsigned char timeBuffer[7];
- void IIC_Delay()
- {
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
- _nop_(); _nop_(); _nop_();
- }
- void IIC_Start(void)
- {
- IIC_SDA = 1; //为SDA下降启动做准备
- IIC_SCL = 1; //在SCL高电平时,SDA为下降沿时候总线启动
- IIC_Delay();
- IIC_SDA = 0; //突变,总线启动
- IIC_Delay();
- IIC_SCL = 0;
- IIC_Delay();
- }
- void IIC_Stop(void)
- {
- IIC_SDA = 0; //为SDA上升做准备
- IIC_Delay();
- IIC_SCL = 1; //在SCL高电平时,SDA为上升沿时候总线停止
- IIC_Delay();
- IIC_SDA = 1; //突变,总线停止
- IIC_Delay();
- }
- void IIC_Ack(unsigned char a)
- {
- if(a) IIC_SDA = 1; //放上应答信号电平
- else IIC_SDA = 0;
- IIC_Delay();
- IIC_SCL = 1; //为SCL下降做准备
- IIC_Delay();
- IIC_SCL = 0; //突变,将应答信号发送过去
- IIC_Delay();
- }unsigned char IIC_Write_Byte(unsigned char dat)
- {
- unsigned char i;
- unsigned char iic_ack=0; //iic应答标志
- for(i = 0;i < 8;i++)
- {
- if(dat & 0x80) IIC_SDA = 1; //判断发送位,先发送高位
- else IIC_SDA = 0;
- IIC_Delay();
- IIC_SCL = 1; //为SCL下降做准备
- IIC_Delay();
- IIC_SCL = 0; //突变,将数据位发送过去
- dat<<=1; //数据左移一位
- } //字节发送完成,开始接收应答信号
- IIC_SDA = 1; //释放数据线
- IIC_Delay();
- IIC_SCL = 1; //为SCL下降做准备
- IIC_Delay();
- //字节发送完成,开始接收应答信号
- iic_ack |= IIC_SDA; //读入应答位
- IIC_SCL = 0;
- return iic_ack; //返回应答信号
- }
复制代码
读到数据后串口发送出来即可:
- void main(void)
- {
- sTime timeNow;
- char timeString[50];
- EAXSFR(); /* 扩展寄存器访问使能 */
- //开启中断0:INT0
- IT0 = 1;//0为上升下降沿触发;1为低电平触发;
- EX0 = 1;
- GPIO_config();
- Uart1Init();
- ES = 1;
- EA = 1;
- Timer0_Init();
- timeNow.year=25;
- timeNow.mon=2;
- timeNow.week = 0;
- timeNow.day=16;
- timeNow.hour=13;
- timeNow.min=0;
- timeNow.sec = 0;
- Bsp_Pcf8563_Init();
- while(1)
- {
- KeyTask();
- if(test1000ms == 1000)
- {
- P54 = !P54;
- test1000ms = 0;
- MyGetTime(&timeNow);
- sprintf(timeString, " 20%02d-%02d-%02d %02d:%02d:%02d",(int)timeNow.year,(int)timeNow.mon,(int)timeNow.day,(int)timeNow.hour,(int)timeNow.min,(int)timeNow.sec);
- Uart1SendStr(timeString);
- }
- }
- }
复制代码
完整工程“Clock-STC8H3K32S2点灯+串口+按键+定时器+iic读PCF8563.rar”:
Clock-STC8H3K32S2点灯 串口 按键 定时器 iic读PCF8563.rar
(106.05 KB, 下载次数: 4)
|