导航菜单
首页 >  蓝桥杯第十一届省赛真题  > 蓝桥杯嵌入式第十一届省赛模拟题

蓝桥杯嵌入式第十一届省赛模拟题

蓝桥杯嵌入式第十一届省赛模拟题

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 初始化程序包括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=~(dateODR&=~GPIO_Pin_2;}//RTCvoid 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_ms20) { 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_ms20) {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;//按键3u8 key3_flag=0;//按下标志u16 key3_hold_ms=0;//按下时间u8 key3_long=0;//长按标志u8 key3_short=0;//短按标志//按键4u8 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);//关闭所有ledrtc_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上警报。 最后附上完整工程文件

相关推荐: