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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
初始化程序包括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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值