/***********************************************
Copyright (C), 2015-2016, xmetc Tech. Co., Ltd.
File name : rtc.c
Author : DD
version : V1.0
Date : 2015-9-3
Description : rtc的功能函数的实现
History :
1 Date : 2015-9-3
Author : DD
Modification Init vision
*************************************************/
#include "rtc.h"
#include "2440addr.h"
#include "uart.h"
#include "lcd.h"
#include "lcdziku.h"
#include "multimedia.h"
#include "song.h"
#include "pwm.h"
#include "buzzer.h"
char year[1],mon[1],date[1],hour[1],min[1],sec[1];
/***********************************************
Function name : rtc_init
Description : RTC初始化,设置默认时间
Input parameter : none
Return : none
Others : none
*************************************************/
void rtc_init(unsigned char year,unsigned char mon,unsigned char date,unsigned char hour,unsigned char min,unsigned char sec)
{
rRTCCON = 0x1;/*RTC控制使能*/
rBCDSEC = sec;/*初始化时间为13年1月1日星期六、12时40分01秒*/
rBCDMIN = min;
rBCDHOUR = hour;
rBCDDATE = date;
rBCDMON = mon;
rBCDYEAR = year;
rRTCCON = 0x0;
}
/***********************************************
Function name : rtc_sev
Description : RTC中断函数
Input parameter : none
Return : none
Others : none
*************************************************/
static void __irq rtc_sev()
{
uart_printf("闹钟中断");
timer4init(1);
renewplay();
rSRCPND = rSRCPND | (1<<30);/*下次中断使能*/
rINTPND = rINTPND | (1<<30);/*下次中断使能*/
}
/***********************************************
Function name : rtc_clock
Description : 闹钟使能
Input parameter : none
Return : none
Others : none
*************************************************/
void rtc_clock(unsigned char hour,unsigned char min)
{
volatile unsigned int temp;
rRTCCON = 0x1;/*RTC控制使能*/
rRTCALM = ((1<<6)| (1<<2) | (1<<1) | 1);/*闹钟使能*/
rALMSEC = 0x00;
rALMMIN = min;
rALMHOUR = hour;
temp = rINTMOD;/*设置INT_RTC为IRQ中断*/
temp = temp&(~(1<<30));
rINTMOD = temp;
temp = rINTMSK;/*允许INT_RTC中断*/
temp = temp&(~(1<<30));
rINTMSK = temp;
temp = rSRCPND;/*请求INT_RTC中断*/
temp = temp | (1<<30);
rSRCPND = temp;
temp = rINTPND;/*中断挂起寄存器写1清0*/
temp = temp | (1<<30);
rINTPND = temp;
pISR_RTC = (unsigned int)rtc_sev;/*安装中断函数*/
rRTCCON = 0x0;
}
/***********************************************
Function name : rtc_read
Description : 读取时间
Input parameter : none
Return : none
Others : none
*************************************************/
void rtc_read(void)
{
rRTCCON = 0x1;/*RTC控制使能*/
year[0] = rBCDYEAR;
mon[0] = rBCDMON;
date[0] = rBCDDATE;
hour[0] = rBCDHOUR;
min[0] = rBCDMIN;
sec[0] = rBCDSEC;
rRTCCON = 0x0;
}
/***********************************************
Function name : Rtc_Tick_irq
Description : RTC实时时钟模块节拍中断设置函数
Input parameter : none
Return : none
Others : none
*************************************************/
void __irq Rtc_Tick_irq()
{
char hour_temp[3];
char min_temp[3];
char sec_temp[3];
rSRCPND|=BIT_TICK; //设置SRCPND寄存器RTC节拍BIT_TICK置1清零
rINTPND|=BIT_TICK; //设置INTPND寄存器RTC节拍BIT_TICK为请求中断
rtc_read();
LCD_bar(0);
hour_temp[1] = hour[0]%16+'0';
hour_temp[0] = hour[0]/16+'0';
min_temp[1] = min[0]%16+'0';
min_temp[0] = min[0]/16+'0';
sec_temp[1] = sec[0]%16+'0';
sec_temp[0] = sec[0]/16+'0';
hour_temp[2]=0;
min_temp[2]=0;
sec_temp[2]=0;
DispStringX(85,0,hour_temp,0xffff);
DispStringX(102,0,":",0xffff);
DispStringX(110,0,min_temp,0xffff);
DispStringX(127,0,":",0xffff);
DispStringX(135,0,sec_temp,0xffff);
}
/***********************************************
Function name : Rtc_Tick_irq1
Description : RTC实时时钟模块节拍中断设置函数
Input parameter : none
Return : none
Others : none
*************************************************/
void __irq Rtc_Tick_irq1()
{
char hour_temp[3];
char min_temp[3];
char sec_temp[3];
char year_temp[3],mon_temp[3],date_temp[3];
rSRCPND|=BIT_TICK; //设置SRCPND寄存器RTC节拍BIT_TICK置1清零
rINTPND|=BIT_TICK; //设置INTPND寄存器RTC节拍BIT_TICK为请求中断
rtc_read();
hour_temp[1] = hour[0]%16+'0';
hour_temp[0] = hour[0]/16+'0';
min_temp[1] = min[0]%16+'0';
min_temp[0] = min[0]/16+'0';
sec_temp[1] = sec[0]%16+'0';
sec_temp[0] = sec[0]/16+'0';
year_temp[1] = year[0]%16+'0';
year_temp[0] = year[0]/16+'0';
mon_temp[1] = mon[0]%16+'0';
mon_temp[0] = mon[0]/16+'0';
date_temp[1] = date[0]%16+'0';
date_temp[0] = date[0]/16+'0';
date_temp[2]=0;
hour_temp[2]=0;
min_temp[2]=0;
sec_temp[2]=0;
year_temp[2]=0;
mon_temp[2]=0;
LCD_ClearSCR(0);
wallpaper();
DispStringX(192,300,"返回",0xffff);
DispStringX(85,120,"当前时间:",0xffff);
DispStringX(72,150,year_temp,0xffff);
DispStringX(88,150,"年",0xffff);
DispStringX(104,150,mon_temp,0xffff);
DispStringX(120,150,"月",0xffff);
DispStringX(136,150,date_temp,0xffff);
DispStringX(152,150,"日",0xffff);
DispStringX(72,170,hour_temp,0xffff);
DispStringX(88,170,"时",0xffff);
DispStringX(104,170,min_temp,0xffff);
DispStringX(120,170,"分",0xffff);
DispStringX(136,170,sec_temp,0xffff);
DispStringX(152,170,"秒",0xffff);
}
/***********************************************
Function name : Rtc_Tick_Set
Description : RTC实时时钟模块节拍设置函数
Input parameter : none
Return : none
Others : none
*************************************************/
void Rtc_Tick_Set(int i)
{
rRTCCON=1;
rTICNT=(1<<7)|(127);
//rALMSEC=(rBCDSEC+5)%60;
if(i==1)
{
pISR_TICK=(U32)Rtc_Tick_irq;
}
else
{
pISR_TICK=(U32)Rtc_Tick_irq1;
}
rSRCPND |= BIT_TICK; //设置SRCPND寄存器RTC节拍BIT_TICK置1清零
rINTPND |= BIT_TICK; //设置INTPND寄存器RTC节拍BIT_TICK为请求中断
rINTMOD &= (~(BIT_TICK)); //设置INTMOD寄存器RTC节拍BIT_TICK为IRQ中断
rINTMSK &= (~(BIT_TICK)); //设置INTMSK寄存器RTC节拍BIT_TICK中断服务可用
rRTCCON=0;
}
评论0