升级PCF8563芯片驱动代码,欢迎各位大大们拍砖指导

2019-07-21 07:11发布

之前和大家分享了一下几个时钟芯片的驱动代码还有原理图什么的“发一个之前玩过的几个RTC芯片程序

最近因为一个项目原因,全部更新了PCF8563这个芯片的驱动代码,主要是直接在函数设置BCD格式和BIN格式的转换输出,全部操作利用结构体的思路,更加清晰明了。

底层IIC驱动用“发一个之前玩过的几个RTC芯片程序”这个帖子3楼附件,或者在文件开头位置的几个函数稍微修改一下即可,具体如下

[mw_shl_code=c,true]/** ***************************************************************************** * @Name : PCF8563某寄存器写入一个字节数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器地址 * dat: 要写入的数据 * * @Output : none * * @Return : none ***************************************************************************** **/ void PCF8563_Write_Byte(unsigned char REG_ADD, unsigned char dat) { IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); IIC_Write_Byte(dat); //发送数据 } IIC_Stop(); } /** ***************************************************************************** * @Name : PCF8563某寄存器读取一个字节数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器地址 * * @Output : none * * @Return : 读取得到的寄存器的值 ***************************************************************************** **/ unsigned char PCF8563_Read_Byte(unsigned char REG_ADD) { unsigned char ReData; IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); //确定要操作的寄存器 IIC_Start(); //重启总线 IIC_Write_Byte(PCF8563_Read); //发送读取命令 ReData = IIC_Read_Byte(); //读取数据 IIC_Ack(1); //发送非应答信号结束数据传送 } IIC_Stop(); return ReData; } /** ***************************************************************************** * @Name : PCF8563写入多组数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器起始地址 * num: 写入数据数量 * *WBuff: 写入数据缓存 * * @Output : none * * @Return : none ***************************************************************************** **/ void PCF8563_Write_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff) { unsigned char i = 0; IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); //定位起始寄存器地址 for(i = 0;i < num;i++) { IIC_Write_Byte(*pBuff); //写入数据 pBuff++; } } IIC_Stop(); } /** ***************************************************************************** * @Name : PCF8563读取多组数据 * * @Brief : none * * @Input : REG_ADD:要操作寄存器起始地址 * num: 读取数据数量 * * @Output : *WBuff: 读取数据缓存 * * @Return : none ***************************************************************************** **/ void PCF8563_Read_nByte(unsigned char REG_ADD, unsigned char num, unsigned char *pBuff) { unsigned char i = 0; IIC_Start(); if(!(IIC_Write_Byte(PCF8563_Write))) //发送写命令并检查应答位 { IIC_Write_Byte(REG_ADD); //定位起始寄存器地址 IIC_Start(); //重启总线 IIC_Write_Byte(PCF8563_Read); //发送读取命令 for(i = 0;i < num;i++) { *pBuff = IIC_Read_Byte(); //读取数据 if(i == (num - 1)) IIC_Ack(1); //发送非应答信号 else IIC_Ack(0); //发送应答信号 pBuff++; } } IIC_Stop(); }[/mw_shl_code]
上面几个函数只要对应移植就可以了。

提供对外的函数有以下几个
[mw_shl_code=c,true]void PCF8563_Write_Byte (unsigned char REG_ADD, unsigned char dat); //PCF8563某寄存器写入一个字节数据 unsigned char PCF8563_Read_Byte (unsigned char REG_ADD); //PCF8563某寄存器读取一个字节数据 void PCF8563_Write_nByte (unsigned char REG_ADD, unsigned char num, unsigned char *pBuff); //PCF8563写入多组数据 void PCF8563_Read_nByte (unsigned char REG_ADD, unsigned char num, unsigned char *pBuff); //PCF8563读取多组数据 unsigned char PCF8563_Check (void); //PCF8563检测是否存在 void PCF8563_Start (void); //PCF8563启动 void PCF8563_Stop (void); //PCF8563停止 void PCF8563_SetMode (unsigned char Mode); //PCF8563设置运行模式 void PCF8563_SetPowerReset (unsigned char NewState); //PCF8563设置电源复位功能开启与关闭 void PCF8563_SetCLKOUT (_PCF8563_CLKOUT_Typedef* PCF_CLKOUTStruct); //PCF8563设置输出频率 void PCF8563_SetTimer (_PCF8563_Timer_Typedef* PCF_TimerStruct); //PCF8563设置定时器 void PCF8563_Set_Times (unsigned char PCF_Format, unsigned char PCF_Century, unsigned char Year, unsigned char Month, unsigned char Date, unsigned char Week, unsigned char Hour, unsigned char Minute); //设置时间,主要用于后台调用,或者初始化时间用 void PCF8563_SetRegister (unsigned char PCF_Format, unsigned char PCF_Century, _PCF8563_Register_Typedef* PCF_DataStruct); //PCF8563写入寄存器 void PCF8563_GetRegister (unsigned char PCF_Format, unsigned char *PCF_Century, _PCF8563_Register_Typedef* PCF_DataStruct); //PCF8563读取寄存器 void PCF8563_SetTime (unsigned char PCF_Format, _PCF8563_Time_Typedef* PCF_DataStruct); //PCF8563写入时间信息 void PCF8563_GetTime (unsigned char PCF_Format, _PCF8563_Time_Typedef* PCF_DataStruct); //PCF8563读取时间信息 void PCF8563_SetDate (unsigned char PCF_Format, unsigned char PCF_Century, _PCF8563_Date_Typedef* PCF_DataStruct); //PCF8563写入日期信息 void PCF8563_GetDate (unsigned char PCF_Format, unsigned char *PCF_Century, _PCF8563_Date_Typedef* PCF_DataStruct); //PCF8563读取日期信息 void PCF8563_SetAlarm (unsigned char PCF_Format, _PCF8563_Alarm_Typedef* PCF_DataStruct); //PCF8563写入闹铃信息 void PCF8563_GetAlarm (unsigned char PCF_Format, _PCF8563_Alarm_Typedef* PCF_DataStruct); //PCF8563读取闹铃信息[/mw_shl_code]
详细代码请看附件,同时欢迎各路高人指点一二

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
49条回答
jonny
1楼-- · 2019-07-26 21:10
本来是想找为什么时间自增到23:59后,日期怎么不变的问题,结果新问题出现了,现在连时间都不走了,但能够设置时间和日期,读取也正确,但sends(02H)寄存器读出一直为0,之前还会自动增加,什么情况,你们遇到过吗?????
一眼万年
2楼-- · 2019-07-26 22:39
 精彩回答 2  元偷偷看……
billypeng
3楼-- · 2019-07-27 01:05
多谢,已下载,正在研究。
不过坦率地说,某些编程习惯可能不符合C语言的惯例。
C语言中,常量定义一般全部用大写,变量或者函数则大小写混杂,这样一看就知道。
另外C语言在函数中传递缓冲区时,一般是排列顺序是先指针,然后大小。
八度空间
4楼-- · 2019-07-27 01:57
billypeng 发表于 2016-4-24 09:14
多谢,已下载,正在研究。
不过坦率地说,某些编程习惯可能不符合C语言的惯例。
C语言中,常量定义一般全 ...

个人习惯,呵呵
huangxiaowei
5楼-- · 2019-07-27 02:54
非常感谢
翼落天使
6楼-- · 2019-07-27 05:35
正点原子 发表于 2015-5-16 23:09
cool,八度老师又出好作品了。

原子哥这么个头像,不怕老板找你事么

一周热门 更多>