第六届省赛真题
main.c
#include "main.h"
#include "rcc.h"
#include "led_key.h"
#include "lcd.h"
#include "i2c.h"
#include "uart.h"
#include "adc.h"
#include "rtc.h"
__IO uint32_t uwTick_LED_Set_Point;
__IO uint32_t uwTick_KEY_Set_Point;
__IO uint32_t uwTick_LCD_Set_Point;
__IO uint32_t uwTick_UART_Set_Point;
uint8_t ucLed;
uint8_t key_value,key_up,key_down;
static uint8_t key_old;
uint8_t LCD_Disp_String[21];
uint8_t UART_Str[40];
uint8_t rx_buffer;
float ADC2_Voltage;
RTC_TimeTypeDef T;
RTC_DateTypeDef D;
uint8_t Interface_ctrl;
uint8_t k_value = 1;
uint8_t LED_ctrl;;
uint8_t Clock_Comp_Disp[3]={0,0,0};
uint8_t Clock_Comp_Ctrl[3];
__IO uint32_t uwTick_Clock_Time_Set_Point;
uint8_t Time_Set_Ctrl;
uint8_t Uart_Transmit_Times_Ctrl;
uint8_t rx_Buf[100];
uint8_t rx_Buf_index;
__IO uint32_t uwTick_RX_Dealy_Time;
_Bool Start_Flag = 0;
__IO uint32_t uwTick_LED_Light_Time;
void SystemClock_Config(void);
void LED_Proc(void);
void KEY_Proc(void);
void LCD_Proc(void);
void UART_Proc(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
LED_KEY_Init();
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(Magenta);
I2CInit();
I2C_24c02_read(&k_value , 0 , 1);
UART1_Init();
HAL_UART_Receive_IT(&huart1 , (uint8_t *)(&rx_buffer) , 1);
ADC2_Init();
RTC_Init();
while (1)
{
LED_Proc();
KEY_Proc();
LCD_Proc();
UART_Proc();
}
}
void LED_Proc(void)
{
if((uwTick - uwTick_LED_Set_Point)<50) return;
uwTick_LED_Set_Point = uwTick;
if(LED_ctrl == 0x00)
{
if(ADC2_Voltage > (3.3*k_value*0.1))
{
if((uwTick - uwTick_LED_Light_Time)>=200)
{
uwTick_LED_Light_Time = uwTick;
ucLed ^= 0x01;
}
}
else
ucLed = 0x00;
}
else
{
ucLed = 0x00;
}
LED_Disp(ucLed);
}
void KEY_Proc(void)
{
if((uwTick - uwTick_KEY_Set_Point)<100) return;
uwTick_KEY_Set_Point = uwTick;
key_value = KEY_Scan();
key_up = ~key_value & (key_value ^ key_old);
key_down = key_value & (key_value ^ key_old);
key_old = key_value;
if(key_down == 1)
{
LED_ctrl ^= 0x01;
}
if(key_down == 2)
{
Interface_ctrl ^= 0x10;
LCD_Clear(Black);
if((Interface_ctrl>>4) == 0)
{
Clock_Comp_Ctrl[0]=Clock_Comp_Disp[0];
Clock_Comp_Ctrl[1]=Clock_Comp_Disp[1];
Clock_Comp_Ctrl[2]=Clock_Comp_Disp[2];
}
}
if((Interface_ctrl>>4) == 0x1)
{
if(key_down == 3)
{
Interface_ctrl +=1;
if(Interface_ctrl == 0x14)
Interface_ctrl = 0x10;
}
}
if(key_down ==4)
{
if(Interface_ctrl == 0x11)
{
Clock_Comp_Disp[0]++;
if(Clock_Comp_Disp[0] == 24)
{
Clock_Comp_Disp[0] = 0;
}
}
if(Interface_ctrl == 0x12)
{
Clock_Comp_Disp[1]++;
if(Clock_Comp_Disp[1] == 60)
{
Clock_Comp_Disp[1] = 0;
}
}
if(Interface_ctrl == 0x13)
{
Clock_Comp_Disp[2]++;
if(Clock_Comp_Disp[2] == 60)
{
Clock_Comp_Disp[2] = 0;
}
}
}
}
void LCD_Proc(void)
{
if((uwTick - uwTick_LCD_Set_Point)<100) return;
uwTick_LCD_Set_Point = uwTick;
if((Interface_ctrl>>4) == 0x0)
{
ADC2_Voltage = ADC2_Get_Value()*(3.3/4096);
HAL_RTC_GetTime(&hrtc , &T ,RTC_FORMAT_BIN);
HAL_RTC_GetDate(&hrtc , &D ,RTC_FORMAT_BIN);
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " V1:%4.2fV ", ADC2_Voltage);
LCD_DisplayStringLine(Line2 , LCD_Disp_String);
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " k:%3.1f ", k_value*0.1);
LCD_DisplayStringLine(Line4 , LCD_Disp_String);
if(LED_ctrl == 0x00)
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " LED:ON ");
LCD_DisplayStringLine(Line6 , LCD_Disp_String);
}
else
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " LED:OFF");
LCD_DisplayStringLine(Line6 , LCD_Disp_String);
}
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " T:%02d-%02d-%02d",T.Hours,T.Minutes,T.Seconds);
LCD_DisplayStringLine(Line8 , LCD_Disp_String);
}
else if((Interface_ctrl>>4) == 0x01)
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " Setting");
LCD_DisplayStringLine(Line2 , LCD_Disp_String);
if(Time_Set_Ctrl == 0x00)
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " %02d-%02d-%02d",Clock_Comp_Disp[0],Clock_Comp_Disp[1],Clock_Comp_Disp[2]);
LCD_DisplayStringLine(Line5 , LCD_Disp_String);
}
if((uwTick - uwTick_Clock_Time_Set_Point)>=500)
{
uwTick_Clock_Time_Set_Point = uwTick;
Time_Set_Ctrl ^= 0x01;
}
if(Time_Set_Ctrl == 0x01)
{
if(Interface_ctrl == 0x11)
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " -%02d-%02d",Clock_Comp_Disp[1],Clock_Comp_Disp[2]);
}
else if(Interface_ctrl == 0x12)
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " %02d- -%02d",Clock_Comp_Disp[0],Clock_Comp_Disp[2]);
}
else if(Interface_ctrl == 0x13)
{
memset(LCD_Disp_String , 0 ,sizeof(LCD_Disp_String));
sprintf((char*)LCD_Disp_String , " %02d-%02d- ",Clock_Comp_Disp[0],Clock_Comp_Disp[1]);
}
else
{
sprintf((char*)LCD_Disp_String , " %02d-%02d-%02d",Clock_Comp_Disp[0],Clock_Comp_Disp[1],Clock_Comp_Disp[2]);
}
LCD_DisplayStringLine(Line5 , LCD_Disp_String);
}
}
}
void UART_Proc(void)
{
if((uwTick - uwTick_UART_Set_Point)<50) return;
uwTick_UART_Set_Point = uwTick;
if((T.Hours==Clock_Comp_Ctrl[0])&&(T.Minutes==Clock_Comp_Ctrl[1])&&(T.Seconds==Clock_Comp_Ctrl[2]))
{
if(Uart_Transmit_Times_Ctrl == 0)
{
Uart_Transmit_Times_Ctrl = 1;
sprintf((char*)UART_Str , "%4.2f+%3.1f+%02d%02d%02d\n",ADC2_Voltage,k_value*0.1,T.Hours,T.Minutes,T.Seconds);
HAL_UART_Transmit(&huart1 , UART_Str , strlen((char*)UART_Str) ,50);
}
}
else
{
Uart_Transmit_Times_Ctrl = 0;
}
if((uwTick - uwTick_RX_Dealy_Time)>=200 && (uwTick - uwTick_RX_Dealy_Time)<=300)
{
if(rx_Buf_index == 6)
{
if((rx_Buf[0]==0x6B) && (rx_Buf[1]==0x30) && (rx_Buf[2]==0x2E) && (rx_Buf[4]==0x5C) && (rx_Buf[5]==0x6E))
{
if((rx_Buf[3]<=0x39) && (rx_Buf[3]>=0x31))
{
k_value = rx_Buf[3] - 0x30;
sprintf((char*)UART_Str , "ok\n");
HAL_UART_Transmit(&huart1 , UART_Str , strlen((char*)UART_Str) ,50);
I2C_24c02_write(&k_value , 0 , 1);
}
}
}
rx_Buf_index = 0;
Start_Flag = 0;
}
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if((rx_buffer == 0x6B) && (rx_Buf_index == 0))
{
uwTick_RX_Dealy_Time = uwTick;
Start_Flag = 1;
}
if(Start_Flag == 1)
{
rx_Buf[rx_Buf_index] = rx_buffer;
rx_Buf_index++;
}
HAL_UART_Receive_IT(&huart1 , (uint8_t *)(&rx_buffer) , 1);
}