📄 rtc.c
字号:
#include "..\inc\option.h"
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\rtc.h"
char *date[8] = {"","日","一","二","三","四","五","六"};
volatile unsigned int sec_tick;
//***************************************************************************
/****************************************************************************
【功能说明】显示实时时钟
****************************************************************************/
void Display_Rtc(void)
{
int year;
int month,day,weekday,hour,min,sec;
rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
while(1)
{
if (rBCDYEAR == 0x99) year = 0x1999;
else year = 0x2000 + rBCDYEAR;
month=rBCDMON;
day=rBCDDAY;
weekday=rBCDDATE;
hour=rBCDHOUR;
min=rBCDMIN;
sec=rBCDSEC;
if(sec!=0) break;
}
Uart_Printf("RTL当前时间:%4x年%2x月%2x日 周%s %2x:%2x:%2x\n",year,month,day,date[weekday],hour,min,sec);
rRTCCON = 0x0; //RTC读写禁止,选择BCD时钟、计数器,无复位,1/32768
}
//***************************************************************************
/****************************************************************************
【功能说明】
****************************************************************************/
volatile int isRtcInt;
void __irq Rtc_Int(void)
{
rI_ISPC=BIT_RTC;
//rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0
Uart_Printf("RTC报警中断发生,定时时间到!\n");
isRtcInt=1;
}
//***************************************************************************
/****************************************************************************
【功能说明】实时时钟定时报警
****************************************************************************/
int Test_Rtc_Alarm(void)
{
int m;
Uart_Printf("\n【实时时钟的定时报警程序测试:】\n");
rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
m = rBCDSEC;
rALMSEC = m + 5; //定时的秒信号,设在5秒以后
isRtcInt = 0;
pISR_RTC = (unsigned int)Rtc_Int;
rRTCALM = 0x01; //全局警报使能控制,年、月、日、星期、时分秒警报使能控制
rRTCCON = 0x0; //RTC读写禁止,选择BCD时钟、计数器,无复位,1/32768
rINTMSK = ~(BIT_GLOBAL|BIT_RTC);
while(isRtcInt == 0);
rINTMSK = BIT_GLOBAL;
return 1;
}
//***************************************************************************
/****************************************************************************
【功能说明】
****************************************************************************/
void __irq Rtc_Tick(void)
{
rI_ISPC=BIT_TICK;
Uart_Printf(" %04d秒",sec_tick++);
}
//***************************************************************************
/****************************************************************************
【功能说明】
****************************************************************************/
void Test_Rtc_Tick(void)
{
Uart_Printf("\n【实时时钟的滴答声测试:】\n");
Uart_Printf("按任意键退出本程序!!!\n");
pISR_TICK = (unsigned)Rtc_Tick;
sec_tick = 1;
rINTMSK = ~(BIT_GLOBAL|BIT_TICK);
rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
rTICINT = 127+(1<<7); //TICK中断使能,TICK间隔=(127+1)/128秒
Uart_Getch(); //等待串口输入字符
rINTMSK |= (BIT_GLOBAL | BIT_TICK); //串口收到字符停止TICK测试
rRTCCON = 0x0; //RTC读写禁止,选择BCD时钟、计数器,无复位,1/32768
}
//***************************************************************************
/****************************************************************************
【功能说明】十进制转换成BCD码
****************************************************************************/
int Algorism_BCD(int a)
{
int x,y,z;
x = a / 1000;
a = a % 1000;
y = a / 100;
a = a % 100;
z = a / 10;
a = a % 10;
a = a | (z << 4) | (y << 8) | (x << 12);
return a;
}
//***************************************************************************
/****************************************************************************
【功能说明】实时时钟时间设定
****************************************************************************/
void Rtc_Time_Set(void)
{
int m;
Display_Rtc(); //
rRTCCON = 0x01; //RTC读写使能,选择BCD时钟、计数器,无复位,1/32768
Uart_Printf("\n请输入新的年份(1999-2098,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDYEAR = m; //年
}
Uart_Printf("请输入新的月份(1-12,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDMON = m; //月
}
Uart_Printf("请输入新的日期(1-31,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDDAY = m; //日
}
Uart_Printf("请输入新的星期(1-7,1指周日,2指周一,3指周二,4指周三\n");
Uart_Printf(" 5指周四,6指周五,7指周六,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDDATE = m; //星期
}
Uart_Printf("请输入新的小时(0-24,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDHOUR = m; //小时
}
Uart_Printf("请输入新的分钟(0-59,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDMIN = m; //分
}
Uart_Printf("请输入新的秒(0-59,直接回车将不作修改):");
m = Uart_GetIntNum(); //
if(m != 0)
{
m =Algorism_BCD(m); //
rBCDSEC = m; //秒
}
rRTCCON = 0x0; //RTC读写禁止,选择BCD时钟、计数器,无复位,1/32768
}
//***************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -