⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8563.c

📁 该代码为时钟芯片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 + -