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

📄 rtc.c

📁 8019测试源码for arm s3c44b0
💻 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 + -