📄 pcf8563.c
字号:
#include "tx_api.h"
#include "board.h"
UCHAR CCR_READ;
UCHAR retc;
extern UCHAR DsYear;
extern UCHAR DsMonth;
extern UCHAR DsDate;
extern UCHAR DsHour;
extern UCHAR DsMinute;
extern UCHAR DsSecond;
extern UCHAR SysYearSet;
extern UCHAR SysMonthSet;
extern UCHAR SysDateSet;
extern UCHAR SysMinuteSet;
extern UCHAR SysHourSet;
extern UCHAR SysSecondSet;
extern TX_EVENT_FLAGS_GROUP event_flags_date_set;
extern TX_EVENT_FLAGS_GROUP event_flags_hour_set;
void StartI2c(void); //启动I2C
void StopI2c(void); //停止I2C
void SendByte(UCHAR c); //发送1个字节
void RcvByte(void); //接收1个字节
void AckI2c(void); //发出应答信号
extern void thread_PCF8563_entry(ULONG thread_input);
void thread_PCF8563_entry(ULONG thread_input)
{
UCHAR Low4;
UCHAR High4;
UINT status;
ULONG actual_flags;
*PIO_PER=SCL|SDA;
*PIO_OER=SCL|SDA;
*PIO_SODR=SCL|SDA;
StartI2c();
SendByte(0xA2);
SendByte(0xD);
SendByte(0x83);
StopI2c();
while(1)
{
status=tx_event_flags_get(&event_flags_date_set, 0x1, TX_OR_CLEAR, &actual_flags, 1);
if (status == TX_SUCCESS)
{
StartI2c();
SendByte(0xA2);
SendByte(0x8);
SendByte(SysYearSet/10*16+(SysYearSet % 10));
StopI2c();
StartI2c();
SendByte(0xA2);
SendByte(0x7);
SendByte(SysMonthSet/10*16+(SysMonthSet % 10));
StopI2c();
StartI2c();
SendByte(0xA2);
SendByte(0x5);
SendByte(SysDateSet/10*16+(SysDateSet % 10));
StopI2c();
}
status=tx_event_flags_get(&event_flags_hour_set, 0x1, TX_OR_CLEAR, &actual_flags, 1);
if (status == TX_SUCCESS)
{
StartI2c();
SendByte(0xA2);
SendByte(0x2);
SendByte(SysSecondSet/10*16+(SysSecondSet % 10));
SendByte(SysMinuteSet/10*16+(SysMinuteSet % 10));
SendByte(SysHourSet/10*16+(SysHourSet % 10));
StopI2c();
}
StartI2c();
SendByte(0xA2);
SendByte(0x2);
StartI2c();
SendByte(0xA3);
RcvByte();
AckI2c();
Low4=retc & 0xF;
High4=retc & 0x70;
DsSecond=High4/16*10+Low4;
RcvByte();
AckI2c();
Low4=retc & 0xF;
High4=retc & 0x70;
DsMinute=High4/16*10+Low4;
RcvByte();
AckI2c();
Low4=retc & 0xF;
High4=retc & 0x30;
DsHour=High4/16*10+Low4;
RcvByte();
AckI2c();
Low4=retc & 0xF;
High4=retc & 0x30;
DsDate=High4/16*10+Low4;
RcvByte();
AckI2c();
RcvByte();
AckI2c();
Low4=retc & 0xF;
High4=retc & 0x10;
DsMonth=High4/16*10+Low4;
RcvByte();
AckI2c();
Low4=retc & 0xF;
High4=retc & 0xF0;
DsYear=High4/16*10+Low4;
StopI2c();
tx_thread_sleep(300);
}
}
/*------------------------------*/
/* 启动I2C */
/*------------------------------*/
void StartI2c() //启动I2C
{
int i;
*PIO_OER=SDA;
*PIO_SODR=SDA;
i=0;
*PIO_SODR=SCL;
for (i=0;i<=4;i++);
*PIO_CODR=SDA;
for (i=0;i<=4;i++);
*PIO_CODR=SCL;
for (i=0;i<=1;i++);
}
/*------------------------------*/
/* 停止I2C */
/*------------------------------*/
void StopI2c() //停止I2C
{
int i;
*PIO_OER=SDA;
*PIO_CODR=SDA;
i=0;
*PIO_SODR=SCL;
for (i=0;i<=4;i++);
*PIO_SODR=SDA;
for (i=0;i<=4;i++);
}
/*------------------------------*/
/* 发送1个字节 */
/*------------------------------*/
void SendByte(UCHAR c) //发送1个字节
{
int i;
UCHAR BitCnt;
*PIO_OER=SDA;
for(BitCnt=0; BitCnt<8; BitCnt++) //发送8位数据
{
if ((c<<BitCnt) & 0x80) *PIO_SODR=SDA;
else *PIO_CODR=SDA;
i=0;
*PIO_SODR=SCL;
for (i=0;i<=4;i++);
*PIO_CODR=SCL;
}
for (i=0;i<=1;i++);
*PIO_SODR=SDA; //释放数据线
*PIO_ODR=SDA;
for (i=0;i<=1;i++);
*PIO_SODR=SCL;
for (i=0;i<=2;i++);
i=*PIO_PDSR; //判断应答信号
if ((i & SDA) == 0) i=1;
else i=2;
*PIO_CODR=SCL;
for (i=0;i<=2;i++);
}
/*------------------------------*/
/* 接收1个字节 */
/*------------------------------*/
void RcvByte() //接收1个字节
{
int i;
//UCHAR retc;
UCHAR BitCnt;
retc=0;
*PIO_OER=SDA;
*PIO_SODR=SDA;
*PIO_ODR=SDA; //置数据线为输入方式
for(BitCnt=0; BitCnt<8; BitCnt++)
{
i=1;
*PIO_CODR=SCL; //置时钟线为低,准备接收数据位
for (i=0;i<=5;i++); //时钟低电平周期大于4.7us
*PIO_SODR=SCL; //置时钟线为高使数据线上数据有效
for (i=0;i<=2;i++); //
retc=retc<<1;
i=*PIO_PDSR;
if ((i & SDA) == SDA) retc=retc+1; //读数据位,接受的数据位放入retc
for (i=0;i<=2;i++);
}
*PIO_CODR=SCL;
for (i=0;i<=2;i++);
//return(retc);
}
/*------------------------------*/
/* 发出应答信号 */
/*------------------------------*/
void AckI2c() //发出应答信号
{
int i;
*PIO_OER=SDA; //发出应答信号
*PIO_CODR=SDA;
for (i=0;i<=2;i++);
*PIO_SODR=SCL;
for (i=0;i<=4;i++);
*PIO_CODR=SCL;
for (i=0;i<=2;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -