藍橋杯嵌入式第十一屆省賽模擬試題(修正版)

第一次寫的鏈接:藍橋杯嵌入式第十一屆省賽模擬試題
再做的時候,感覺之前的有些功能沒實現:
1.時鐘顯示界面的LD1是1s閃爍,之前是200ms一閃爍。
2.時鐘設置完成後,時鐘顯示界面的時間也要變。
3.時間邊界,hour<0,min<0,sec<0應該變爲0,改用了int。之前用的uint8,無符號數,當小於0時會報錯,如hour+1<=0,hour=23,但到邊界時不是變爲23。改用int,hour<0,hour=23。
只改動了主函數,如下:

#include "stm32f10x.h"
#include "lcd.h"
#include "tx.h"
#include "i2c.h"
#include "stdio.h"

u32 TimingDelay = 0;

u16 time;
u8 hour,min,sec;
int t_hour=11,t_min=59,t_sec=50;  //設置時間
int a_hour,a_min,a_sec;			   //鬧鐘時間

u16 set_cnt=0;	//時間設置次數
u16 alarm_cnt=0; //鬧鐘設置次數

u16 LED_MODE=0xffff;


u8 SET_flag=0;//0-Main,1-RTC_setting,2-alarm-setting
u8 time_flag=0;//0-時,1-分,2-秒
u8 alarm_flag=0;//0-時,1-分,2-秒  
u8 key1_flag=0;//0-設置,1-切換時分秒
u8 key2_flag=1;//0-設置,1-切換時分秒

u8 Led1_flag=1;
u8 Led2_flag=0;
u8 Led3_flag=0;

u8 RXD_flag=0;
u8 RXD_buf[20];
u8 str[20];
u8 i;

u8 ms200_flag=1;
u8 s1_flag=0;

void Usart_action(int code);
void Show_main(void);
void Show_rtc_setting(void);
void Show_alarm_setting(void);
void Led_action(void);
void Delay_Ms(u32 nTime);
void Key_action(int code,u8 sta);

//Main Body
int main(void)
{
	SysTick_Config(SystemCoreClock/1000);

	Delay_Ms(200);
	
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	i2c_init();
	KEY_Init();
	LED_Init();
	RTC_Init(11,59,50);
	Tim4_Init(2000,72);
	Usart2_Init();

	set_cnt=i2c_read(0x00);Delay_Ms(5);
	a_hour=i2c_read(0x02);Delay_Ms(5);
	a_min=i2c_read(0x03);Delay_Ms(5);
	a_sec=i2c_read(0x04);Delay_Ms(5);
	alarm_cnt=i2c_read(0x01);Delay_Ms(5);

	set_cnt=0;
	alarm_cnt=0;

	while(1){
	  KEY_Driver();
	  if(ms200_flag){
		ms200_flag=0;
		Led_action();
		if(SET_flag==0)
		  Show_main();
		else if(SET_flag==1)
		  Show_rtc_setting();
		else if(SET_flag==2)
		  Show_alarm_setting();
	  }
	  if(s1_flag){
	  	s1_flag=0;
		if(SET_flag==0){
		    LED_MODE^=(1<<8);
			GPIOC->ODR=LED_MODE;
			GPIOD->ODR|=(1<<2);
		    GPIOD->ODR&=~(1<<2);
		  }
		  else{
		    LED_MODE|=(1<<8);
			GPIOC->ODR=LED_MODE;
			GPIOD->ODR|=(1<<2);
		    GPIOD->ODR&=~(1<<2);
		  }	
	  }	
	}
}

void Usart_action(int code){
  if(code==0){
    sprintf((char*)str,"New RTC:  %.2d:%.2d:%.2d\r\n",t_hour,t_min,t_sec);
	Send_string(str);
	
  }
  else if(code==1){
    sprintf((char*)str,"New Alarm:%.2d:%.2d:%.2d\r\n",a_hour,a_min,a_sec);
	Send_string(str);
  }
  for(i=0;i<20;i++)
    RXD_buf[i]=0;
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);  
}

void Led_action(void){
  
  if(SET_flag==1){
    LED_MODE&=~(1<<9);
	GPIOC->ODR=LED_MODE;
	GPIOD->ODR|=(1<<2);
    GPIOD->ODR&=~(1<<2);
  }
  else{
    LED_MODE|=(1<<9);
	GPIOC->ODR=LED_MODE;
	GPIOD->ODR|=(1<<2);
    GPIOD->ODR&=~(1<<2);
  }

  if(SET_flag==2){
    LED_MODE&=~(1<<10);
	GPIOC->ODR=LED_MODE;
	GPIOD->ODR|=(1<<2);
    GPIOD->ODR&=~(1<<2);
  }
  else{
    LED_MODE|=(1<<10);
	GPIOC->ODR=LED_MODE;
	GPIOD->ODR|=(1<<2);
    GPIOD->ODR&=~(1<<2);
  }	   
}

void Show_main(void){
  sprintf((char*)str,"       Main    ");
  LCD_DisplayStringLine(Line2, str);

  sprintf((char*)str,"   RTC:");
  LCD_DisplayStringLine(Line4, str);

  LCD_DisplayChar(Line4, 210, hour/10+'0');
  LCD_DisplayChar(Line4, 195, hour%10+'0');
  LCD_DisplayChar(Line4, 180, ':');
  
  LCD_DisplayChar(Line4, 165, min/10+'0');
  LCD_DisplayChar(Line4, 150, min%10+'0');
  LCD_DisplayChar(Line4, 135, ':');

  LCD_DisplayChar(Line4, 120, sec/10+'0');
  LCD_DisplayChar(Line4, 105, sec%10+'0');

}

void Show_rtc_setting(void){
  sprintf((char*)str,"    RTC-SETTING    ");
  LCD_DisplayStringLine(Line2, str);

  sprintf((char*)str,"   RTC:");
  LCD_DisplayStringLine(Line4, str);

  if(time_flag==0)
    LCD_SetTextColor(Green);
  else
    LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 210, t_hour/10+'0');
  LCD_DisplayChar(Line4, 195, t_hour%10+'0');
  LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 180, ':');

  if(time_flag==1)
    LCD_SetTextColor(Green);
  else
    LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 165, t_min/10+'0');
  LCD_DisplayChar(Line4, 150, t_min%10+'0');
  LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 135, ':');

  if(time_flag==2)
    LCD_SetTextColor(Green);
  else
    LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 120, t_sec/10+'0');
  LCD_DisplayChar(Line4, 105, t_sec%10+'0');
  LCD_SetTextColor(White);

}

void Show_alarm_setting(void){
  sprintf((char*)str,"  ALARM-SETTING    ");
  LCD_DisplayStringLine(Line2, str);

  sprintf((char*)str," Alarm:");
  LCD_DisplayStringLine(Line4, str);

  if(alarm_flag==0)
    LCD_SetTextColor(Green);
  else
    LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 210, a_hour/10+'0');
  LCD_DisplayChar(Line4, 195, a_hour%10+'0');
  LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 180, ':');

  if(alarm_flag==1)
    LCD_SetTextColor(Green);
  else
    LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 165, a_min/10+'0');
  LCD_DisplayChar(Line4, 150, a_min%10+'0');
  LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 135, ':');

  if(alarm_flag==2)
    LCD_SetTextColor(Green);
  else
    LCD_SetTextColor(White);
  LCD_DisplayChar(Line4, 120, a_sec/10+'0');
  LCD_DisplayChar(Line4, 105, a_sec%10+'0');
  LCD_SetTextColor(White);

}
void Key_action(int code,u8 sta){
  if(sta==0){  //短按
    if(code==1){
	  if(key1_flag==0){ 	  	
	    SET_flag^=1;
		key2_flag=1;
		if(SET_flag==0){
		  Usart_action(0);		  
		  set_cnt++;
		  i2c_write(0x00,set_cnt);Delay_Ms(5);
		  RTC_SetCounter(3600*t_hour+60+t_min+t_sec);
		  key2_flag=0;
		}
	  }
	  else if(key1_flag==1){ 	  	
	    alarm_flag++;
		if(alarm_flag>2)
		  alarm_flag=0;
	  }
	}
	else if(code==2){
	  if(key2_flag==0){
	    if(SET_flag==0)
		  SET_flag=2;
		else if(SET_flag==2)
		  SET_flag=0;
		key1_flag=1;
		if(SET_flag==0){
		  i2c_write(0x02,a_hour);Delay_Ms(5);
		  i2c_write(0x03,a_min);Delay_Ms(5);
		  i2c_write(0x04,a_sec);Delay_Ms(5);

		  Usart_action(1);
		  alarm_cnt++;
		  i2c_write(0x01,alarm_cnt);Delay_Ms(5);
		  key1_flag=0;
		}
	  }
	  else if(key2_flag==1){
	    time_flag++;
		if(time_flag>2)
		  time_flag=0;
	  }
	}
  }
  else if(sta==1){
  	if(code==3){
	  if(SET_flag==1){
	  	if(time_flag==0){
		  t_hour++;
		  if(t_hour>23)
		    t_hour=0;
		}
		else if(time_flag==1){
		  t_min++;
		  if(t_min>=60)
		    t_min=0;
		}
		else if(time_flag==2){
		  t_sec++;
		  if(t_sec>=60)
		    t_sec=0;
		}
	  }
	  else if(SET_flag==2){
	  	if(alarm_flag==0){
		  a_hour++;
		  if(a_hour>23)
		    a_hour=0;
		}
		else if(alarm_flag==1){
		  a_min++;
		  if(a_min>=60)
		    a_min=0;
		}
		else if(alarm_flag==2){
		  a_sec++;
		  if(a_sec>=60)
		    a_sec=0;
		}
	  }
	}
	else if(code==4){
	  if(SET_flag==1){
	  	if(time_flag==0){
		  t_hour--;
		  if(t_hour<0)
		    t_hour=23;
		}
		else if(time_flag==1){
		  t_min--;
		  if(t_min<0)
		    t_min=5;
		}
		else if(time_flag==2){
		  t_sec--;
		  if(t_sec<0)
		    t_sec=59;
		}
	  }
	  else if(SET_flag==2){
	  	if(alarm_flag==0){
		  a_hour--;
		  if(a_hour<0)
		    a_hour=23;
		}
		else if(alarm_flag==1){
		  a_min--;
		  if(a_min<0)
		    a_min=59;
		}
		else if(alarm_flag<=0){
		  a_sec--;
		  if(a_sec<0)
		    a_sec=59;
		}
	  }
	}
  }
}
void Delay_Ms(u32 nTime)
{
	TimingDelay = nTime;
	while(TimingDelay != 0);	
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章