升级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条回答
chenyh85
2019-07-22 23:14
八度大神,我对您的敬仰如滔滔江水,绵绵不绝!如黄河泛滥,一发不可收拾!如泰山压顶,。。。。。好了,言归正传,大神,这几次弄pcf8563,正好用到了您的程序,开始一直用 CF8563检测是否存在  这个函数,一直检测不到,害我检查了半天,又重新焊了块板,还是检测不到,我就试试其他函数,试了设置日期和读取日期,竟然可以耶,所以大神,你这个PCF8563检测存在的函数,是不是不行啊~~

一周热门 更多>