📄 calendar.c
字号:
{
LCD_SetTextColor(White);
LCD_DrawRect(dayline, daycolumn, 24, 32);
/* Decrease the value of the digit */
if(tmpValue == 1)
{
tmpValue = ValueMax + 1;
dayline = lastdayline;
daycolumn = lastdaycolumn - 48;
}
if(daycolumn == 319)
{
daycolumn = 0xFFEF;
dayline -= 24;
}
daycolumn += 48;
LCD_SetTextColor(Red);
LCD_DrawRect(dayline, daycolumn, 24, 32);
tmpValue--;
}
/* If "UP" pushbutton is pressed */
if(MyKey == UP)
{
LCD_SetTextColor(White);
LCD_DrawRect(dayline, daycolumn, 24, 32);
if(tmpValue == 1)
{
dayline = lastdayline;
daycolumn = lastdaycolumn;
tmpValue = ValueMax;
}
else if(tmpValue < 8)
{
tmpValue = 1;
dayline = Line3;
daycolumn = firstdaycolumn;
}
else
{
dayline -= 24;
tmpValue -= 7;
}
LCD_SetTextColor(Red);
LCD_DrawRect(dayline, daycolumn, 24, 32);
}
/* If "DOWN" pushbutton is pressed */
if(MyKey == DOWN)
{
LCD_SetTextColor(White);
LCD_DrawRect(dayline, daycolumn, 24, 32);
if(tmpValue == ValueMax)
{
dayline = Line3;
daycolumn = firstdaycolumn;
tmpValue = 1;
}
else
{
dayline += 24;
tmpValue += 7;
}
if(tmpValue > ValueMax)
{
tmpValue = ValueMax;
dayline = lastdayline;
daycolumn = lastdaycolumn;
}
LCD_SetTextColor(Red);
LCD_DrawRect(dayline, daycolumn, 24, 32);
}
/* If "SEL" pushbutton is pressed */
if(MyKey == SEL)
{
/* Return the digit value and exit */
date_s.day = tmpValue;
return;
}
}
}
/*******************************************************************************
* Function Name : WeekDayNum
* Description : Determines the week number, the day number and the week day
* number.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
static void WeekDayNum(u32 nyear, u8 nmonth, u8 nday)
{
u32 a = 0, b = 0, c = 0, s = 0, e = 0, f = 0, g = 0, d = 0;
s32 n = 0;
if(nmonth < 3)
{
a = nyear - 1;
}
else
{
a = nyear;
}
b = (a/4) - (a/100) + (a/400);
c = ((a - 1)/4) - ((a - 1)/100) + ((a - 1)/400);
s = b - c;
if(nmonth < 3)
{
e = 0;
f = nday - 1 + 31 * (nmonth - 1);
}
else
{
e = s + 1;
f = nday + (153*(nmonth - 3) + 2)/5 + 58 + s;
}
g = (a + b) % 7;
d = (f + g - e) % 7;
n = f + 3 - d;
if (n < 0)
{
wn = 53 - ((g - s)/5);
}
else if (n > (364 + s))
{
wn = 1;
}
else
{
wn = (n/7) + 1;
}
dn = d;
dc = f + 1;
}
/*******************************************************************************
* Function Name : IsLeapYear
* Description : Check whether the passed year is Leap or not.
* Input : None
* Output : None
* Return : 1: leap year
* 0: not leap year
*******************************************************************************/
static u8 IsLeapYear(u16 nYear)
{
if(nYear % 4 != 0) return 0;
if(nYear % 100 != 0) return 1;
return (u8)(nYear % 400 == 0);
}
/*******************************************************************************
* Function Name : Alarm_Regulate
* Description : Returns the alarm time entered by user, using demoboard keys.
* Input : None
* Output : None
* Return : Alarm time value to be loaded in RTC alarm register.
*******************************************************************************/
u32 Alarm_Regulate(void)
{
u32 Alarm_HH = 0, Alarm_MM = 0, Alarm_SS = 0;
/* Read alarm hours */
Alarm_HH = ReadDigit(244, alarm_struct.hour_h, 0x2, 0x0);
if(Alarm_HH == 0x2)
{
if(alarm_struct.hour_l > 0x3)
{
alarm_struct.hour_l = 0x0;
}
Alarm_HH = Alarm_HH*10 + ReadDigit(228, alarm_struct.hour_l, 0x3, 0x0);
}
else
{
Alarm_HH = Alarm_HH*10 + ReadDigit(228, alarm_struct.hour_l, 0x9, 0x0);
}
/* Read alarm minutes */
Alarm_MM = ReadDigit(196, alarm_struct.min_h, 0x5, 0x0);
Alarm_MM = Alarm_MM*10 + ReadDigit(182, alarm_struct.min_l, 0x9, 0x0);
/* Read alarm seconds */
Alarm_SS = ReadDigit(150, alarm_struct.sec_h, 0x5, 0x0);
Alarm_SS = Alarm_SS*10 + ReadDigit(134, alarm_struct.sec_l, 0x9, 0x0);
/* Return the alarm value to store in the RTC Alarm register */
return((Alarm_HH*3600 + Alarm_MM*60 + Alarm_SS));
}
/*******************************************************************************
* Function Name : Alarm_PreAdjust
* Description : Configures an alarm event to occurs within the current day.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Alarm_PreAdjust(void)
{
u32 tmp = 0;
/* Set the LCD Back Color */
LCD_SetBackColor(Blue);
/* Set the LCD Text Color */
LCD_SetTextColor(White);
if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
LCD_DisplayStringLine(Line8, "Time not configured ");
LCD_DisplayStringLine(Line9, " Press SEL ");
while(ReadKey() == NOKEY)
{
}
return;
}
/* Read the alarm value stored in the Backup register */
tmp = BKP_ReadBackupRegister(BKP_DR6);
tmp |= BKP_ReadBackupRegister(BKP_DR7) << 16;
/* Clear Line8 */
LCD_ClearLine(Line8);
/* Display time separators ":" on Line4 */
LCD_DisplayChar(Line8, 212, ':');
LCD_DisplayChar(Line8, 166, ':');
/* Display the alarm value */
Alarm_Display(tmp);
/* Store new alarm value */
tmp = Alarm_Regulate();
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC Alarm register with the new value */
RTC_SetAlarm(tmp);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Save the Alarm value in the Backup register */
BKP_WriteBackupRegister(BKP_DR6, (tmp & 0x0000FFFF));
BKP_WriteBackupRegister(BKP_DR7, (tmp >> 16));
}
/*******************************************************************************
* Function Name : Alarm_Adjust
* Description : Adjusts an alarm event to occurs within the current day.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Alarm_Adjust(void)
{
/* Disable the JoyStick interrupts */
IntExtOnOffConfig(DISABLE);
LCD_Clear(White);
LCD_SetDisplayWindow(160, 223, 128, 128);
LCD_DrawBMP(0x00637A00);
/* Disable LCD Window mode */
LCD_WindowModeDisable();
Alarm_PreAdjust();
/* Clear the LCD */
LCD_Clear(White);
/* Display the menu */
DisplayMenu();
/* Enable the JoyStick interrupts */
IntExtOnOffConfig(ENABLE);
}
/*******************************************************************************
* Function Name : Alarm_Display
* Description : Displays alarm time.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Alarm_Display(u32 AlarmVar)
{
/* Display alarm hours */
alarm_struct.hour_h=(u8)( AlarmVar / 3600)/10;
LCD_DisplayChar(Line8, 244,(alarm_struct.hour_h + 0x30));
alarm_struct.hour_l=(u8)(((AlarmVar)/3600)%10);
LCD_DisplayChar(Line8, 228,(alarm_struct.hour_l + 0x30));
/* Display alarm minutes */
alarm_struct.min_h=(u8)(((AlarmVar)%3600)/60)/10;
LCD_DisplayChar(Line8, 196,(alarm_struct.min_h + 0x30));
alarm_struct.min_l=(u8)(((AlarmVar)%3600)/60)%10;
LCD_DisplayChar(Line8, 182,(alarm_struct.min_l + 0x30));
/* Display alarm seconds */
alarm_struct.sec_h=(u8)(((AlarmVar)%3600)%60)/10;
LCD_DisplayChar(Line8, 150,(alarm_struct.sec_h + 0x30));
alarm_struct.sec_l=(u8)(((AlarmVar)%3600)%60)%10;
LCD_DisplayChar(Line8, 134,(alarm_struct.sec_l + 0x30));
}
/*******************************************************************************
* Function Name : Alarm_Show
* Description : Shows alarm time (HH/MM/SS) on LCD.
* Input : None
* Output : None
* Return : None
*******************************************************************************/
void Alarm_Show(void)
{
u32 tmp = 0;
/* Disable the JoyStick interrupts */
IntExtOnOffConfig(DISABLE);
LCD_Clear(White);
LCD_SetDisplayWindow(160, 223, 128, 128);
LCD_DrawBMP(0x00637A00);
/* Disable LCD Window mode */
LCD_WindowModeDisable();
/* Set the LCD Back Color */
LCD_SetBackColor(Blue);
/* Set the LCD Text Color */
LCD_SetTextColor(White);
if(BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)
{
LCD_DisplayStringLine(Line8, "Time not configured ");
LCD_DisplayStringLine(Line9, " Press SEL ");
while(ReadKey() == NOKEY)
{
}
/* Clear the LCD */
LCD_Clear(White);
/* Display the menu */
DisplayMenu();
/* Enable the JoyStick interrupts */
IntExtOnOffConfig(ENABLE);
return;
}
/* Read the alarm value stored in the Backup register */
tmp = BKP_ReadBackupRegister(BKP_DR6);
tmp |= BKP_ReadBackupRegister(BKP_DR7) << 16;
LCD_ClearLine(Line8);
/* Display alarm separators ":" on Line2 */
LCD_DisplayChar(Line8, 212, ':');
LCD_DisplayChar(Line8, 166, ':');
/* Display actual alarm value */
Alarm_Display(tmp);
/* Wait a press on pushbuttons */
while(ReadKey() != NOKEY)
{
}
/* Wait a press on pushbuttons */
while(ReadKey() == NOKEY)
{
}
/* Clear the LCD */
LCD_Clear(White);
/* Display the menu */
DisplayMenu();
/* Enable the JoyStick interrupts */
IntExtOnOffConfig(ENABLE);
}
/*******************************************************************************
* Function Name : RTC_Configuration
* Description : Configures the RTC.
* Input : None.
* Output : None
* Return : None
*******************************************************************************/
void RTC_Configuration(void)
{
/* PWR and BKP clocks selection --------------------------------------------*/
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
/* Enable the LSE OSC */
RCC_LSEConfig(RCC_LSE_ON);
/* Wait till LSE is ready */
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
{
}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
/* Enable the RTC Clock */
RCC_RTCCLKCmd(ENABLE);
/* Wait for RTC registers synchronization */
RTC_WaitForSynchro();
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Enable the RTC Second */
RTC_ITConfig(RTC_IT_SEC, ENABLE);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Set RTC prescaler: set RTC period to 1sec */
RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
/******************* (C) COPYRIGHT 2007 STMicroelectronics *****END OF FILE****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -