1.题目描述
![](https://img-blog.csdnimg.cn/direct/95ad2b35a9784ddb87e9cdd6e3b8e105.png)
2.LED模块
uint8_t led_sta;
extern __IO uint32_t uwTick;
uint32_t time3000=0;//用来计数
void led_proc()
{
if(mode==0)//mode代表自动模式
{
led_sta=(led_sta&0x7f)|0x80;
led_dis(led_sta);
}
else
{
led_sta=led_sta&0x7f;
led_dis(led_sta);
}
if(gear==1)
{
led_sta=(led_sta&0xfe)|0x01;
led_dis(led_sta);
}
else
{
led_sta=led_sta&0xfe;
led_dis(led_sta);
}
if(gear==2)
{
led_sta=(led_sta&0xfe)|0x02;
led_dis(led_sta);
}
else
{
led_sta=led_sta&0xfd;
led_dis(led_sta);
}
if(gear==3)
{
led_sta=(led_sta&0xfb)|0x04;
led_dis(led_sta);
}
else
{
led_sta=led_sta&0xfb;
led_dis(led_sta);
}
if(uwTick-time3000<3000)
{
led_sta=(led_sta&0xf7)|0x08;
led_dis(led_sta);
rx_finish_flag=0;
}
else{
led_sta=led_sta&0xf7;
led_dis(led_sta);
}
}
3.中断函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance==TIM4)//定时器4定时10ms
{
key_scan();
if(rx_finish_flag==0)rx_timec++;
}
if(htim->Instance==TIM6)
{
time1++;
}
}//定时器6定时10ms
char rxdata[30];
bool rx_finish_flag;
uint8_t rxdat;
uint8_t rx_count;
uint8_t rx_timec;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance==USART1)
{
rx_finish_flag=0;
rx_timec=0;
rxdata[rx_count++]=rxdat;
HAL_UART_Receive_IT(&huart1,&rxdat,1);
}
}
4.按键模块
void key_proc()
{
if(view==0)
{
HAL_TIM_Base_Start_IT(&htim6);
if(key[0].single_flag==1)
{
mode++;
mode=mode%2;
key[0].single_flag=0;
}
if(mode==1)
{
if(key[1].single_flag==1)
{
gear++;
if(gear>3)gear=3;
key[1].single_flag=0;
}
if(key[2].single_flag==1)
{
gear--;
if(gear<1)gear=1;
key[2].single_flag=0;
}
}
}
if(view==1)//睡眠界面
{
//任意按键唤醒
if(key[0].single_flag==1||key[1].single_flag==1||key[2].single_flag==1){
LCD_Clear(Black);
view=0;
key[0].single_flag=0;
key[1].single_flag=0;
key[2].single_flag=0;
}
}
//无按键动作和串口接收5s后切换为睡眠界面
if(time1>=500)
{
if(view==0&&key[0].key_sta==1&&key[1].key_sta==1&&key[2].key_sta==1&&rx_finish_flag==0)
{
LCD_Clear(Black);
view=1;
time1=0;
HAL_TIM_Base_Stop_IT(&htim6);
}
}
//在5s内按键和串口有动作停止计时
if(time1<500)
{
if(key[0].key_sta==0||key[1].key_sta==0||key[2].key_sta==0||rx_finish_flag==1)
{
time1=0;
HAL_TIM_Base_Stop_IT(&htim6);
}
}
}
5.LCD模块
void lcd_proc()
{
if(view==0)
{
r37_volt=getadc(&hadc2);
if(r37_volt<1)
{
temp=0;
}
else if(r37_volt>3)
{
temp=40;
}
else
{
temp=10*r37_volt+10;
}
sprintf(lcd_buffer," DATA");
LCD_DisplayStringLine(Line1, (uint8_t *)lcd_buffer);
sprintf(lcd_buffer," TEMP:%.1f",temp);
LCD_DisplayStringLine(Line3, (uint8_t *)lcd_buffer);
if(mode==0)
{
if(temp<25)gear=1;
else if(temp>30)gear=3;
else gear=2;
sprintf(lcd_buffer," MODE:Auto ");
LCD_DisplayStringLine(Line4, (uint8_t *)lcd_buffer);
}
else
{
sprintf(lcd_buffer," MODE:Manu ");
LCD_DisplayStringLine(Line4, (uint8_t *)lcd_buffer);
}
sprintf(lcd_buffer," GEAR:%d ",gear);
LCD_DisplayStringLine(Line5, (uint8_t *)lcd_buffer);
}
else if(view==1)
{
sprintf(lcd_buffer," SLEEPING ");
LCD_DisplayStringLine(Line4, (uint8_t *)lcd_buffer);
sprintf(lcd_buffer," TEMP:%.1f ",temp);
LCD_DisplayStringLine(Line5, (uint8_t *)lcd_buffer);
}
}
6.串口模块
void uart_proc()
{
if(rx_count>0)
{
uwTick=time3000;
if(rx_timec>=3)
{
rx_timec=0;
if(rxdata[rx_count-1]==rxdat)rx_finish_flag=1;
}
if(rx_finish_flag==1)
{
if(view==0)
{
if(rx_count==2)
{
if(rxdata[0]=='B'&&rxdata[1]-'0'==1)
{
mode++;
mode=mode%2;
}
else if(rxdata[0]=='B'&&rxdata[1]-'0'==2)
{
gear++;
if(gear>3)gear=3;
}
else if(rxdata[0]=='B'&&rxdata[1]-'0'==3)
{
gear--;
if(gear<1)gear=1;
}
else{
sprintf(txdata,"NULL\r\n");
HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
}
}
else{
sprintf(txdata,"NULL\r\n");
HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
}
}
if(view==1)
{
if(rxdata[0]=='B'&&rxdata[1]-'0'==1)
{
LCD_Clear(Black);
view=0;
}
else if(rxdata[0]=='B'&&rxdata[1]-'0'==2)
{
LCD_Clear(Black);
view=0;
}
else if(rxdata[0]=='B'&&rxdata[1]-'0'==3)
{
LCD_Clear(Black);
view=0;
}
else{
sprintf(txdata,"NULL\r\n");
HAL_UART_Transmit(&huart1,(uint8_t *)txdata,sizeof(txdata),50);
}
}
rx_count=0;
memset(txdata,0,sizeof(txdata));
rx_finish_flag=0;
}
}
}