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

📄 rtc.c

📁 MCU:c8051f040用自带的IIC控制器读写实时钟芯片PCF8563,该驱动代码接口简单,已完成BCD码到十进制码转换.
💻 C
字号:
#include "LZK.H"


/****************************************************************************
** 函数名称: BCDConvert()  
** 功能描述: BCD转十进制程序  
** 入口参数: ucBCD为待转换的BCD码
** 出口参数: 转化后的十进制数.
** 全局变量: 无.
** 调用模块: 无.
** 说明:
****************************************************************************/
uint8  BCDConvert(uint8 ucBCD)//ucBCD为待转换的BCD码;
{
	unsigned char TempH, TempL;
	
	TempH = (ucBCD&0xF0)>>4;          //TempH保存十进制数的高位
	
	TempL = ucBCD&0x0f;               //TempL保存十进制数的低位
	
	return TempH*10+TempL;            //返回相应的十进制数
}
/****************************************************************************
** 函数名称: DecimalToBCD()  
** 功能描述: 十进制转BCD程序  
** 入口参数: ucDecimal为待转换的十进制码
** 出口参数: 转化后的BCD.
** 全局变量: 无.
** 调用模块: 无.
** 说明:
****************************************************************************/
uint8 DecimalToBCD(uint8 ucDecimal)
{
   uint8 a,b,c;

   a=ucDecimal/10;

   b=ucDecimal%10;

   c=a*16+b;

   return (c);
}
/**************************************************************************
** 函数名称: RTC8563_Read()
** 功能描述: 读取时间
** 入口参数: 无
** 出口参数: 无.
** 全局变量: 无.
** 调用模块: 无.
** 说明:
****************************************************************************/
void RTC8563_Read(void)
{
    SFRPAGE = 0x00;
	STA = 1;
	while(SMB0STA != 0x08);
	SMB0DAT = 0xa2;
    STA = 0;
	SI = 0;
	while(SMB0STA != 0x18);
    SMB0DAT = 0x02;
	SI = 0;
    while(SMB0STA != 0x28); //重启
	STA = 1;
	SI = 0;
	while(SMB0STA!=0x10);
	SMB0DAT=0xa3;
    STA = 0;
	SI = 0;
	while(SMB0STA != 0x40);
	AA = 1;
	SI = 0;
	//////////////////////////////
	while(SMB0STA != 0x50);//秒
    RTCData[0] = SMB0DAT;
	SI = 0;
	SI = 0;//特殊之处

	while(SMB0STA != 0x50);//分
    RTCData[1] = SMB0DAT;
	SI = 0;
	SI = 0;//特殊之处
	
	while(SMB0STA != 0x50);//时
    RTCData[2] = SMB0DAT;
	SI = 0;
	SI = 0;//特殊之处
	
	while(SMB0STA != 0x50);//日
	RTCData[3] = SMB0DAT;
	SI = 0;
	SI = 0;//特殊之处
	
	while(SMB0STA != 0x50);//星期
	RTCData[4] = SMB0DAT;
	SI = 0;
	SI = 0;//特殊之处
	
	while(SMB0STA != 0x50);//月
	RTCData[5] = SMB0DAT;
	AA = 0;
	SI = 0;
	
	while(SMB0STA != 0x58);//年
	RTCData[6] = SMB0DAT;
	STO = 1;
	SI = 0;
 
	RTCData[0] = BCDConvert(RTCData[0] & 0x7f); //秒
    RTCData[1] = BCDConvert(RTCData[1] & 0x7f); //分
	RTCData[2] = BCDConvert(RTCData[2] & 0x3f); //小时
    RTCData[3] = BCDConvert(RTCData[3] & 0x3f); //日
    RTCData[4] = BCDConvert(RTCData[4] & 0x07); //星期
    RTCData[5] = BCDConvert(RTCData[5] & 0x1f); //月/世纪
    RTCData[6] = BCDConvert(RTCData[6]);        //年
}

/****************************************************************************
** 函数名称: RTC8563_Write()
** 功能描述: 读取时间
** 入口参数: 无
** 出口参数: 无.
** 全局变量: 无.
** 调用模块: 无.
** 说明:
****************************************************************************/
void RTC8563_Write()
{   
    uint8 i; 
	for(i=0; i<7; i++)  //RTCWriteData[0~6]: 秒、分、时、日、月、星期、月、年
	{
	 RTCData[i]=DecimalToBCD(RTCData[i]);

	 SFRPAGE = 0x00;
	 STA = 1;
	 STA = 1;
	 STA = 1;
	 while(SMB0STA != 0x08);

	 SMB0DAT = 0xa2;
     STA = 0;
	 SI  = 0;
 	 while(SMB0STA != 0x18);

     SMB0DAT = i + 2;
	 SI = 0;
	 while(SMB0STA != 0x28);

	 SMB0DAT = RTCData[i];
	 SI = 0;
	 SI = 0;//特殊之处
	 while(SMB0STA != 0x28);

     STO = 1;
	 SI  = 0;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -