📄 rtc.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 + -