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

📄 rtc.c

📁 自己编写的
💻 C
字号:
#include "..\inc\44b.h"
#include "..\inc\44blib.h"
#include "..\inc\rtc.h"
//#include <math.h>

//added by liangweidong 2005-9-1
#include "..\inc\character.h"
#include "..\inc\page.h"
#include "..\inc\44blcd.h"
#include "..\inc\kb.h"

setup_time *time;


//writed by liangweidong 2005-9-5
//input:    basic number and times number
//output:  the power of the basic number
//calculte the power
unsigned short int nu_power(unsigned short int basic_number, unsigned char times )
{
	unsigned int power_temp = 1;
	unsigned char i;
	for(i = 0; i < times; i++)
		{
			power_temp = power_temp * basic_number;
		}
	return power_temp;

}

//writed by liangweidong 2005-9-5
//input:    BCD number
//output:  decade number
//for the conversion of hex number to decade number
//for time display
unsigned char  hex_conver_decade(unsigned char  hex_number)
{
	unsigned short int  decade_number = 0;
	unsigned char  d_temp = 0;
	unsigned char i = 0;

	do
		{
			d_temp = hex_number & 0x0f;
			hex_number = hex_number >> 4;
			decade_number = decade_number + d_temp * nu_power (10,  i);
			i++;
		}while(hex_number != 0);
	return decade_number;
}

//writed by liangweidong 2005-9-7
//input:    decade number
//output:  BCD number
//for the conversion of decade number to hex number
//for setup_nerwtime() 
unsigned char decade_conver_hex(unsigned char  decade_number)
{
	unsigned char  hex_number = 0;
	unsigned char  h_temp = 0;
//	unsigned char i = 0;

	do
		{
			h_temp = decade_number%10;
			decade_number = decade_number/10;
			hex_number = (hex_number << 4) + h_temp;
		}while(decade_number != 0);
	return hex_number;
}

//writed by liangweidong 2005-9-6
//input:    new time value
//output:  none
//for setup new time value
void setup_newtime(unsigned char set_year, unsigned char set_month, unsigned char set_day, unsigned char set_week, unsigned char set_hour, unsigned char set_minute, unsigned char set_second )
{
	if(!set_year)
		{
			rBCDYEAR = decade_conver_hex(set_year);
		}

	if(!set_month)
		{
			rBCDMON = decade_conver_hex(set_month);
		}

	if(!set_day)
		{
			rBCDDATE= decade_conver_hex(set_day);
		}

	if(!set_week )
		{
			rBCDDAY= decade_conver_hex(set_week);
		}

	if(!set_hour)
		{
			rBCDHOUR= decade_conver_hex(set_hour);
		}

	if(!set_minute)
		{
			rBCDMIN= decade_conver_hex(set_minute);
		}

	if(!set_second)
		{
			rBCDSEC= decade_conver_hex(set_second);
		}
}

//writed by liangweidong 2005-9-6
//input:    none
//output:  none
//for display new time value
void display_time(void)
{
//	setup_time *time;

	Display_number(14*ASCIIX, 33*ASCIIY, time->year);	
	Display_number(19*ASCIIX, 33*ASCIIY, time->month);	
	Display_number(24*ASCIIX, 33*ASCIIY, time->day);	

	Display_number(14*ASCIIX, 35*ASCIIY, time->hour);	
	Display_number(19*ASCIIX, 35*ASCIIY, time->min);	
	Display_number(24*ASCIIX, 35*ASCIIY, time->sec);	

//	Display_ASCIITable(14*ASCIIX, 37*ASCIIY, date[time->weekday]);	
}

//writed by liangweidong 2005-9-6
//input:    none
//output:  none
//from real-time registers get new time value
void get_time(void)
{
//	setup_time *time;

	time->year = hex_conver_decade(rBCDYEAR);//0x2000 + rBCDYEAR);
	time->month=hex_conver_decade(rBCDMON);
	time->day=hex_conver_decade(rBCDDAY);
	time->weekday=rBCDMON;
	time->hour=hex_conver_decade(rBCDHOUR);
	time->min=hex_conver_decade(rBCDMIN);
	time->sec=hex_conver_decade(rBCDSEC);
}

//modefied by liangweidong 2005-9-6
//time tick interrupt
void __irq Rtc_Tick(void)
{

//	setup_time *time;
	
	rI_ISPC=BIT_TICK;   


	if (0 == time)
		time = (setup_time *)malloc(sizeof(setup_time));
	
	time->year = hex_conver_decade(rBCDYEAR);//0x2000 + rBCDYEAR);
	time->month=hex_conver_decade(rBCDMON);
	time->day=hex_conver_decade(rBCDDAY);
	time->weekday=rBCDMON;
	time->hour=hex_conver_decade(rBCDHOUR);
	time->min=hex_conver_decade(rBCDMIN);
	time->sec=hex_conver_decade(rBCDSEC);

	Display_number(14*ASCIIX, 33*ASCIIY, time->year);	
	Display_number(19*ASCIIX, 33*ASCIIY, time->month);	
	Display_number(24*ASCIIX, 33*ASCIIY, time->day);	

	Display_number(14*ASCIIX, 35*ASCIIY, time->hour);	
	Display_number(19*ASCIIX, 35*ASCIIY, time->min);	
	Display_number(24*ASCIIX, 35*ASCIIY, time->sec);	

//	Display_ASCIITable(14*ASCIIX, 37*ASCIIY, date[time->weekday]);	


}


//modefied by liangweidong 2005-9-6
//initialization the real time clock 
void Rtc_Init(void)
{
	rRTCCON = 0x01;			// R/W enable, 1/32768, Normal(merge), No reset

	//set initialization
	rBCDYEAR = TESTYEAR;
	rBCDMON  = TESTMONTH;
	rBCDDAY  = TESTDAY;		// SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
	rBCDDATE = TESTDATE;
	rBCDHOUR = TESTHOUR;
	rBCDMIN  = TESTMIN;
	rBCDSEC  = TESTSEC;

	//open tick interrupt
	pISR_TICK=(unsigned)Rtc_Tick;
	rINTMSK=~(BIT_GLOBAL|BIT_TICK); 
	rRTCCON=0x0;			//R/W disable(for power consumption), 1/32768, Normal(merge), No reset
	rTICINT = 127+(1<<7);	//START		
	
}





//modefied by liangweidong 2005-9-5
void Display_Rtc(void)
{
	 
    Uart_Printf("This test should be excuted once RTC test(Alarm) for RTC initialization\n");
    Uart_Printf("Please check the VDDRTC connector or connect the VDD to Bt1+ !!!\n");	
    Uart_Printf("Typing any key to exit!!!\n");
Delay(2000);
    Rtc_Init(); 
    pISR_TICK=(unsigned)Rtc_display;

    rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
//    sec_tick=1;
    rINTMSK=~(BIT_GLOBAL|BIT_TICK); 
    
    rTICINT = 127+(1<<7);	//START

    Uart_Getch();
    rINTMSK |= (BIT_GLOBAL | BIT_TICK);
    rRTCCON=0x0;	//END
}



void __irq Rtc_display(void)
{
//	unsigned short int temp;
//	setup_time *time;
//	char *p;

    rI_ISPC=BIT_TICK;   
 //   if(rBCDYEAR == 0x99) 
//	    time->year = 0x1999;
//	else 
//		temp = rBCDYEAR;//(0x2000 + rBCDYEAR);
	    time->year = hex_conver_decade(rBCDYEAR);
//		temp = rBCDMON;
	    time->month=hex_conver_decade(rBCDMON);
//		temp = rBCDDAY;
	    time->day=hex_conver_decade(rBCDDAY);
	    time->weekday=rBCDDATE;
//		temp = rBCDHOUR;
	    time->hour=hex_conver_decade(rBCDHOUR);
//		temp = rBCDMIN;
	    time->min=hex_conver_decade(rBCDMIN);
//		temp = rBCDSEC;
	    time->sec=hex_conver_decade(rBCDSEC);
	    
//   Uart_Printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%4x,%2x,%2x,%s,%2x:%2x:%2x",year,month,day,date[weekday],hour,min,sec);
	Display_number(4*ASCIIX, 30*ASCIIY, time->year);	//added by liangweidong
	Display_number(8*ASCIIX, 30*ASCIIY, time->month);	//added by liangweidong
	Display_number(12*ASCIIX, 30*ASCIIY, time->day);	//added by liangweidong
//	*p = date[time->weekday];
//	Display_character(16*ASCIIX, 30*ASCIIY, p);	//added by liangweidong
	Display_number(20*ASCIIX, 30*ASCIIY, time->hour);	//added by liangweidong
	Display_number(24*ASCIIX, 30*ASCIIY, time->min);	//added by liangweidong
	Display_number(28*ASCIIX, 30*ASCIIY, time->sec);	//added by liangweidong
//	Delay(2000);

}

void DisplayRtc(void)
{
//	unsigned short int temp;
//	setup_time *time;
	
    rRTCCON = 0x01;    // R/W enable, 1/32768, Normal(merge), No reset
    Rtc_Init();
/*    while(1)
    {
	if(rBCDYEAR == 0x99) 
	    year = 0x1999;
	else 
	    year = 0x2000 + rBCDYEAR;
	    month=rBCDMON*10/16;
	    day=rBCDDAY;
	    weekday=rBCDDATE;
	    hour=rBCDHOUR;
	    min=rBCDMIN;
	    sec=rBCDSEC;
	if(sec!=0)
	    break;
    }	 
//    Uart_Printf("\n%4x,%2x,%2x,%s,%2x:%2x:%2x\n",year,month,day,date[weekday],hour,min,sec);
	Display_number(4*ASCIIX, 32*ASCIIY, year);	//added by liangweidong
	Display_number(8*ASCIIX, 32*ASCIIY, month);	//added by liangweidong
	Display_number(12*ASCIIX, 32*ASCIIY, day);	//added by liangweidong
	Display_character(16*ASCIIX, 32*ASCIIY, date[weekday]);	//added by liangweidong
	Display_number(20*ASCIIX, 32*ASCIIY, hour);	//added by liangweidong
	Display_number(24*ASCIIX, 32*ASCIIY, min);	//added by liangweidong
	Display_number(28*ASCIIX, 32*ASCIIY, sec);	//added by liangweidong
	Delay(2000);
*/
//    if(rBCDYEAR == 0x99) 
//	    time->year = 0x1999;
//	else 
//		temp = rBCDYEAR;//(0x2000 + rBCDYEAR);
	    time->year = hex_conver_decade(rBCDYEAR);
//		temp = rBCDMON;
	    time->month=hex_conver_decade(rBCDMON);
//		temp = rBCDDAY;
	    time->day=hex_conver_decade(rBCDDAY);
	    time->weekday=rBCDMON;
//		temp = rBCDHOUR;
	    time->hour=hex_conver_decade(rBCDHOUR);
//		temp = rBCDMIN;
	    time->min=hex_conver_decade(rBCDMIN);
//		temp = rBCDSEC;
	    time->sec=hex_conver_decade(rBCDSEC);
	    
//   Uart_Printf("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b%4x,%2x,%2x,%s,%2x:%2x:%2x",year,month,day,date[weekday],hour,min,sec);
	Display_number(4*ASCIIX, 30*ASCIIY, time->year);	//added by liangweidong
	Display_number(8*ASCIIX, 30*ASCIIY, time->month);	//added by liangweidong
	Display_number(12*ASCIIX, 30*ASCIIY, time->day);	//added by liangweidong
//	Display_character(16*ASCIIX, 30*ASCIIY, date[time->weekday]);	//added by liangweidong
	Display_number(20*ASCIIX, 30*ASCIIY, time->hour);	//added by liangweidong
	Display_number(24*ASCIIX, 30*ASCIIY, time->min);	//added by liangweidong
	Display_number(28*ASCIIX, 30*ASCIIY, time->sec);	//added by liangweidong
	Delay(2000);


//    rRTCCON = 0x00;    // R/W disable(for power consumption), 1/32768, Normal(merge), No reset
}
volatile int isRtcInt;

//modified by liangweidong
//2005-9-1
void __irq Rtc_Int(void)
{
    	rI_ISPC=BIT_RTC;   
//	rI_ISPC; //is needed only when cache=on & wrbuf=on & BSFRD=0
//    Uart_Printf("RTC Alarm Interrupt O.K.\n");
	clrscreen_color();	//added by liangweidong
	Delay(10);	//added by liangweidong
	Display_ASCIITable(1*ASCIIX, 10*ASCIIY, "RTC Alarm Interrupt O.K!");	//added by liangweidong
    	isRtcInt=1;  
}


//modified by liangweidong
//2005-9-1
int Test_Rtc_Alarm(void)  
{
//	Uart_Printf("[RTC Alarm Test for S3C44B0X]\n");
//	Uart_Printf("Please check the VDDRTC connector or connect the VDD to Bt1+ !!!\n");

	clrscreen_color();	//added by liangweidong
	Delay(10);	//added by liangweidong
	Display_ASCIITable(1*ASCIIX, 10*ASCIIY, "[RTC Alarm Test for S3C44B0X]\n");	//added by liangweidong
	Display_ASCIITable(1*ASCIIX, 11*ASCIIY, "Please check the VDDRTC connector or connect the VDD to Bt1+ !!!\n");	//added by liangweidong
	Delay(2000);
	
	Rtc_Init();

	    rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset

	    rALMYEAR=rBCDYEAR ;
	    rALMMON =rBCDMON;
	    rALMDAY =rBCDDAY  ;
	    rALMHOUR=rBCDHOUR ;
	    rALMMIN =rBCDMIN  ;
	    if(rBCDSEC<0X30)
	    {
	    rALMSEC =0x30;}
	    else
	    {
	    rALMSEC =0x59;}

	/*    rALMYEAR=TESTYEAR2 ;
	    rALMMON =TESTMONTH2;
	    rALMDAY =TESTDAY2  ;
	    rALMHOUR=TESTHOUR2 ;
	    rALMMIN =TESTMIN2  ;
	    rALMSEC =TESTSEC2+9; */

	    isRtcInt=0;
	    pISR_RTC=(unsigned int)Rtc_Int;
	    rRTCALM=0x7f;
	    rINTMSK=~(BIT_GLOBAL|BIT_RTC);

	    while(isRtcInt==0);
	    
	    rINTMSK|=BIT_GLOBAL;
	    rRTCCON = 0x0;    // R/W disable(for power consumption), 1/32768, Normal(merge), No reset
	    return 1;
}



void Test_Rtc_Tick(void)
{
	clrscreen_color();	//added by liangweidong
	Delay(10);	//added by liangweidong
	Display_ASCIITable(1*ASCIIX, 10*ASCIIY, "[RTC Alarm Test for S3C44B0X]\n");	//added by liangweidong
	Display_ASCIITable(1*ASCIIX, 11*ASCIIY, "Please check the VDDRTC connector or connect the VDD to Bt1+ !!!\n");	//added by liangweidong
	Display_ASCIITable(1*ASCIIX, 12*ASCIIY, "Typing any key to exit!!");	//added by liangweidong
	Delay(2000);
	
	    pISR_TICK=(unsigned)Rtc_Tick;


//	    sec_tick=1;
	    rINTMSK=~(BIT_GLOBAL|BIT_TICK); 
	    rRTCCON=0x0;		//R/W disable(for power consumption), 1/32768, Normal(merge), No reset
	    rTICINT = 127+(1<<7);	//START
	
		
	    rINTMSK |= (BIT_GLOBAL | BIT_TICK);	//modified by liangweidong 2005-9-1

//	    rRTCCON=0x0;	//END	//modified by liangweidong 2005-9-1
}


⌨️ 快捷键说明

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