之前和大家分享了一下几个时钟芯片的驱动代码还有原理图什么的“
发一个之前玩过的几个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]
详细代码请看附件,同时欢迎各路高人指点一二
不过坦率地说,某些编程习惯可能不符合C语言的惯例。
C语言中,常量定义一般全部用大写,变量或者函数则大小写混杂,这样一看就知道。
另外C语言在函数中传递缓冲区时,一般是排列顺序是先指针,然后大小。
个人习惯,呵呵
原子哥这么个头像,不怕老板找你事么
一周热门 更多>