蓝桥杯嵌入式第十一届省赛模拟题
初始化程序包括key、lcd、rtc、usart2,led,EEPROM初始化
.c文件
#include "mysource.h"
//按键和led以及lcd初始化
void sys_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9|GPIO_Pin_10 | GPIO_Pin_11|GPIO_Pin_12 | GPIO_Pin_13|GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_8;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
GPIO_Init(GPIOB, &GPIO_InitStructure);
STM3210B_LCD_Init();
LCD_Clear(Blue);
LCD_SetBackColor(Blue);
LCD_SetTextColor(White);
LCD_DisplayStringLine(Line1,(unsigned char *)" MAIN ");
LCD_DisplayStringLine(Line4,(unsigned char *)" RTC :11:59:50 ");
i2c_init();
}
//led控制亮灭
void led_control(u8 date)
{
GPIOC->ODR=~(date<<8);
GPIOD->ODR|=GPIO_Pin_2;
GPIOD->ODR&=~GPIO_Pin_2;
}
//RTC
void rtc_init(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
/* Enable PWR and BKP clocks */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
/* Allow access to BKP Domain */
PWR_BackupAccessCmd(ENABLE);
/* Reset Backup Domain */
BKP_DeInit();
/* Enable the LSI OSC */
RCC_LSICmd(ENABLE);
/* Wait till LSI is ready */
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
{}
/* Select the RTC Clock Source */
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
/* Enable 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(40000-1);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Change the current time */
RTC_SetCounter(11*3600 + 59*60 + 50);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Enable the RTC Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
NVIC_Init(&NVIC_InitStructure);
}
//rtc设置时间
void Time_Adjust(uint32_t THH,uint32_t TMM,uint32_t TSS)
{
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
/* Change the current time */
RTC_SetCounter(THH*3600 + TMM*60 + TSS);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
//EEPROM写
void w_04c02(u8 ad,u8 date)
{
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(ad);
I2CWaitAck();
I2CSendByte(date);
I2CWaitAck();
I2CStop();
}
//EEPROM读
u8 r_04c02(u8 ad)
{
u8 temp;
I2CStart();
I2CSendByte(0xa0);
I2CWaitAck();
I2CSendByte(ad);
I2CWaitAck();
I2CStart();
I2CSendByte(0xa1);
I2CWaitAck();
temp=I2CReceiveByte();
I2CWaitAck();
I2CStop();
return temp;
}
//串口初始化
void usart_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);
/* Configure USARTy Rx as input floating */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Tx|USART_Mode_Rx;
/* Configure USARTy */
USART_Init(USART2, &USART_InitStructure);
/* Enable the USARTz Receive Interrupt */
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
/* Enable USARTy */
USART_Cmd(USART2, ENABLE);
}
//串口发送字符串
void send_str(u8 *str)
{
u8 index=0;
do
{
USART_SendData(USART2, str[index++]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
while(str[index]!=0);
}
//串口发送字符串第二种写法
int fputc(int ch,FILE *f)
{
/* Place your implementation of fputc here */
/* e.g. write a character to the USART */
USART_SendData(USART2, (uint8_t) ch);
/* Loop until the end of transmission */
while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET)
{}
return ch;
}
.h文件
#ifndef __MYSOURCE_H
#define __MYSOURCE_H
#include "stm32f10x.h"
#include "i2c.h"
#include "lcd.h"
#include "stdio.h"
//读出按键值
#define b1 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)
#define b2 GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)
#define b3 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)
#define b4 GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)
void sys_init(void);
void led_control(u8 date);
void rtc_init(void);
void Time_Adjust(uint32_t THH,uint32_t TMM,uint32_t TSS);
void w_04c02(u8 ad,u8 date);
u8 r_04c02(u8 ad);
void usart_init(void);
void send_str(u8 *str);
#endif
中断处理函数
//RTC中断处理
void RTC_IRQHandler(void)
{
if (RTC_GetITStatus(RTC_IT_SEC) != RESET)
{
/* Clear the RTC Second interrupt */
RTC_ClearITPendingBit(RTC_IT_SEC);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
}
//滴答定时器中断处理函数
void SysTick_Handler(void)
{
TimingDelay--;
//key3长短按键判断
if(key3_flag==1)
{
if(b3==0)
{
if( key3_hold_ms<=1000)
{
key3_hold_ms++;
}
else
{
key3_hold_ms=0;
key3_long=1;
key3_short=0;
key3_flag=0;
}
}
else
{
if(key3_hold_ms>20)
{
key3_hold_ms=0;
key3_long=0;
key3_short=1;
key3_flag=0;
}
else
{
key3_hold_ms=0;
key3_long=0;
key3_short=0;
key3_flag=0;
}
}
}
//key4长短按键判断
if(key4_flag==1)
{
if(b4==0)
{
if(key4_hold_ms<=1000)
{
key4_hold_ms++;
}
else
{
key4_hold_ms=0;
key4_long=1;
key3_short=0;
key4_flag=0;
}
}
else
{
if(key4_hold_ms>20)
{
key4_flag=0;
key4_short=1;
key4_long=0;
key4_hold_ms=0;
}
else
{
key4_flag=0;
key4_short=0;
key4_long=0;
key4_hold_ms=0;
}
}
}
if(led_show==1)
{
if(++led_show_delay==1000)
{
led_show_delay=0;
led_control(runled);
runled^=0x01;
}
}
else
{
led_show_delay=0;
}
}
如果长短按键判断函数不明白可以参考这个博主的写法
主函数部分
#include "stm32f10x.h"
#include "lcd.h"
#include "mysource.h"
u8 alarm_change=0;
u8 rtc_change=0;
u8 string[20];
u32 TimingDelay = 0;
//RTCsetting 时间
int THH_temp=11,TMM_temp=59,TSS_temp=55;
//警报时间
int THH_temp_a=12,TMM_temp_a=00,TSS_temp_a=00;
//setting,alarm等状态选择位置
u8 sys_mode=0;
//按键2按下标志
u8 key2_flag=0;
u8 key2_flag_i=1;
//lcd显示标志 滴答定时器规定多少ms刷新一次
u8 led_show=0;
u16 led_show_delay=0;
//led控制 0x00为全关,0x01为开led1,以此类推
u8 runled =0x01;
//按键1按下标志
u8 key1_flag=0;
u8 key1_flag_i=1;
//按键3
u8 key3_flag=0;//按下标志
u16 key3_hold_ms=0;//按下时间
u8 key3_long=0;//长按标志
u8 key3_short=0;//短按标志
//按键4
u8 key4_flag=0;
u16 key4_hold_ms=0;
u8 key4_long=0;
u8 key4_short=0;
//rtc显函数
void Time_Display(uint32_t TimeVar);
void Delay_Ms(u32 nTime);
//按键扫描
void key_scan(void);
int main(void)
{
SysTick_Config(SystemCoreClock/1000);
sys_init();
led_control(0x00);//关闭所有led
rtc_init();
usart_init();
//eeprom 各个存储位置初始化
if(r_04c02(0x39)!=243)
{
Delay_Ms(5);
w_04c02(0x00,0);
Delay_Ms(5);
w_04c02(0x01,0);
Delay_Ms(5);
w_04c02(0x02,12);
Delay_Ms(5);
w_04c02(0x03,0);
Delay_Ms(5);
w_04c02(0x04,0);
Delay_Ms(5);
w_04c02(0x39,243);
Delay_Ms(5);
}
//读出各个eeprom各个位置的数值
rtc_change=r_04c02(0x00);
Delay_Ms(5);
alarm_change=r_04c02(0x01);
Delay_Ms(5);
THH_temp_a=r_04c02(0x02);
Delay_Ms(5);
TMM_temp_a=r_04c02(0x03);
Delay_Ms(5);
TSS_temp_a=r_04c02(0x04);
Delay_Ms(5);
while(1)
{
key_scan();
//main 模式下
if(sys_mode==0)
{
LCD_DisplayStringLine(Line1,(unsigned char *)" MAIN ");
Time_Display(RTC_GetCounter());
led_show=1;
}
if(key1_flag==1&&sys_mode==0)
{
key1_flag=0;
sys_mode=1;//set
led_show=0;
LCD_DisplayStringLine(Line1,(unsigned char *)" RTC-SETTING ");
sprintf((char*)string," RTC: %0.2d:%0.2d:%0.2d ",THH_temp,TMM_temp,TSS_temp);
LCD_DisplayStringLine(Line4,string);
}
if(sys_mode==1)
{
led_control(0x02);
if(key2_flag==1)
{
key2_flag=0;
if(key2_flag_i==1)
{
LCD_SetTextColor(Red);//高亮显示
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
key2_flag_i=2;
}
else if(key2_flag_i==2)
{
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
key2_flag_i=3;
}
else if(key2_flag_i==3)
{
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
key2_flag_i=1;
}
}
if(key3_short==1)
{
key3_short=0;
if(key2_flag_i==2)
{
THH_temp++;
if(THH_temp==24)
{
THH_temp=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==3)
{
TMM_temp++;
if(TMM_temp==60)
{
TMM_temp=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==1)
{
TSS_temp++;
if(TSS_temp==60)
{
TSS_temp=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
}
}
if(key3_long==1)
{
key3_long=0;
while(b3==0)
{
if(key2_flag_i==2)
{
THH_temp++;
if(THH_temp==24)
{
THH_temp=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==3)
{
TMM_temp++;
if(TMM_temp==60)
{
TMM_temp=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==1)
{
TSS_temp++;
if(TSS_temp==60)
{
TSS_temp=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
}
Delay_Ms(100);
}
}
if(key4_short==1)
{
key4_short=0;
if(key2_flag_i==2)
{
THH_temp--;
if(THH_temp==-1)
{
THH_temp=23;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==3)
{
TMM_temp--;
if(TMM_temp==-1)
{
TMM_temp=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==1)
{
TSS_temp--;
if(TSS_temp==-1)
{
TSS_temp=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
}
}
if(key4_long==1)
{
key4_long=0;
while(b4==0)
{
if(key2_flag_i==2)
{
THH_temp--;
if(THH_temp==-1)
{
THH_temp=23;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==3)
{
TMM_temp--;
if(TMM_temp==-1)
{
TMM_temp=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
}
else if(key2_flag_i==1)
{
TSS_temp--;
if(TSS_temp==-1)
{
TSS_temp=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp%10+0x30);
}
Delay_Ms(100);
}
}
}
if(key1_flag==1&&sys_mode==1)
{
key1_flag=0;
sys_mode=0;
led_show=1;
Time_Adjust(THH_temp,TMM_temp,TSS_temp);
rtc_change++;
w_04c02(0x00,rtc_change);
Delay_Ms(5);
printf("New RTC:%0.2d:%0.2d:%0.2d\r\n",THH_temp,TMM_temp,TSS_temp);
}
if(key2_flag==1&&sys_mode==0)
{
key2_flag=0;
sys_mode=2;//alarm
led_show=0;
LCD_DisplayStringLine(Line1,(unsigned char *)" ALARM-SETTING ");
sprintf((char*)string," Alarm: %0.2d:%0.2d:%0.2d ",THH_temp_a,TMM_temp_a,TSS_temp_a);
LCD_DisplayStringLine(Line4,string);
}
if(sys_mode==2)
{
led_control(0x04);
if(key1_flag==1)
{
key1_flag=0;
if(key1_flag_i==1)
{
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
key1_flag_i=2;
}
else if(key1_flag_i==2)
{
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
key1_flag_i=3;
}
else if(key1_flag_i==3)
{
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
key1_flag_i=1;
}
}
if(key3_short==1)
{
key3_short=0;
if(key1_flag_i==2)
{
THH_temp_a++;
if(THH_temp_a==24)
{
THH_temp_a=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==3)
{
TMM_temp_a++;
if(TMM_temp_a==60)
{
TMM_temp_a=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==1)
{
TSS_temp_a++;
if(TSS_temp_a==60)
{
TSS_temp_a=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
}
}
if(key3_long==1)
{
while(b3==0)
{
if(key1_flag_i==2)
{
THH_temp_a++;
if(THH_temp_a==24)
{
THH_temp_a=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==3)
{
TMM_temp_a++;
if(TMM_temp_a==60)
{
TMM_temp_a=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==1)
{
TSS_temp_a++;
if(TSS_temp_a==60)
{
TSS_temp_a=0;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
}
Delay_Ms(100);
}
}
if(key4_short==1)
{
key4_short=0;
if(key1_flag_i==2)
{
THH_temp_a--;
if(THH_temp_a==-1)
{
THH_temp_a=23;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==3)
{
TMM_temp_a--;
if(TMM_temp_a==-1)
{
TMM_temp_a=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==1)
{
TSS_temp_a--;
if(TSS_temp_a==-1)
{
TSS_temp_a=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
}
}
if(key4_long==1)
{
key4_long=0;
while(b4==0)
{
if(key1_flag_i==2)
{
THH_temp_a--;
if(THH_temp_a==-1)
{
THH_temp_a=23;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==3)
{
TMM_temp_a--;
if(TMM_temp_a==-1)
{
TMM_temp_a=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
}
else if(key1_flag_i==1)
{
TSS_temp_a--;
if(TSS_temp_a==-1)
{
TSS_temp_a=59;
}
LCD_SetTextColor(Red);
LCD_DisplayChar(Line4,16*5,TSS_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*4,TSS_temp_a%10+0x30);
LCD_SetTextColor(White);
LCD_DisplayChar(Line4,16*11,THH_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*10,THH_temp_a%10+0x30);
LCD_DisplayChar(Line4,16*8,TMM_temp_a/10+0x30);
LCD_DisplayChar(Line4,16*7,TMM_temp_a%10+0x30);
}
Delay_Ms(100);
}
}
}
if(key2_flag==1&&sys_mode==2)
{
sys_mode=0;
led_show=1;
key2_flag=0;
alarm_change++;
w_04c02(0x01,alarm_change);
Delay_Ms(5);
w_04c02(0x02,THH_temp_a);
Delay_Ms(5);
w_04c02(0x03,TMM_temp_a);
Delay_Ms(5);
w_04c02(0x04,TSS_temp_a);
Delay_Ms(5);
printf("New Alarm:%0.2d:%0.2d:%0.2d\r\n",THH_temp_a,TMM_temp_a,TSS_temp_a);
}
}
}
//
void Delay_Ms(u32 nTime)
{
TimingDelay = nTime;
while(TimingDelay != 0);
}
void Time_Display(uint32_t TimeVar)
{
uint32_t THH = 0, TMM = 0, TSS = 0;
/* Reset RTC Counter when Time is 23:59:59 */
if (RTC_GetCounter() == 0x0001517F)
{
RTC_SetCounter(0x0);
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
}
/* Compute hours */
THH = TimeVar / 3600;
/* Compute minutes */
TMM = (TimeVar % 3600) / 60;
/* Compute seconds */
TSS = (TimeVar % 3600) % 60;
sprintf((char*)string," RTC: %0.2d:%0.2d:%0.2d ",THH,TMM,TSS);
LCD_DisplayStringLine(Line4,string);
}
void key_scan(void)
{
if(b1==0)
{
Delay_Ms(20);
if(b1==0)
{
key1_flag=1;
}
while(!b1);
}
else if(b2==0)
{
Delay_Ms(20);
if(b2==0)
{
key2_flag=1;
}
while(!b2);
}
else if(b3==0)
{
key3_flag=1;
}
else if(b4==0)
{
key4_flag=1;
}
}
模拟题考察的逻辑,写的时候追求时限值(5小时),主要是按照自己想到的逻辑一步步往下写,没有进行函数封装,显得比较冗长。另外设置次数等虽然存储进去了EEPROM但是没有显示出来,还有定时上报没有体现,可以到特定时间,在lcd上警报。
最后附上完整工程文件
链接:https://pan.baidu.com/s/1VllsAMAzecgXpicqSnZW6g
提取码:f3go