升级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条回答
正点原子
1楼-- · 2019-07-21 07:23
cool,八度老师又出好作品了。
八度空间
2楼-- · 2019-07-21 11:44
回复【2楼】正点原子:
---------------------------------
军哥,你这速度令人惊叹啊,我才刚发完你就来了,实在是感动啊
正点原子
3楼-- · 2019-07-21 13:09
回复【3楼】八度空间:
---------------------------------
必须的
taizonglai
4楼-- · 2019-07-21 15:59
 精彩回答 2  元偷偷看……
八度空间
5楼-- · 2019-07-21 21:45
回复【5楼】zuozhongkai:
---------------------------------
好吧,还是你牛
rush9838465
6楼-- · 2019-07-21 23:20
回复【6楼】八度空间:
---------------------------------
麻烦问下:我用的你的代码,IIC_Write_Byte()返回 结果都是没有应答信号,我用示波器看了还是没有SDA拉低,我用示波器看的输出信号都是对的,就是没有应答

一周热门 更多>