题目要求i
主函数的while(1)中,
这里的Sleeping_display_flag就是标志位,如果没有显示了睡眠的界面,就要显示数据界面
这里的是显示数据的函数
void Data_Display(){
LCD_DisplayStringLine(Line2,(uint8_t *)" DATA ");
sprintf((char *)str," TEMP:%.1f ",g_f_adc_wendu);
LCD_DisplayStringLine(Line4,(uint8_t *)str);
sprintf((char *)mode_str," MODE:%d ",g_Mode_flag);
LCD_DisplayStringLine(Line5,(uint8_t *)mode_str);
sprintf((char *)gear_str," GEAR:%d ",g_Gear);
LCD_DisplayStringLine(Line6,(uint8_t *)gear_str);
}
最主要的还是定时器中断处理函数,每次5s中进一次中断,把Sleeping_display_flag置1,让主函数中的进入睡眠模式
每次按键检测需要重新初始化定时器(因为总不能在数据模式的时候你去设置,然后没设置完跳到睡眠模式的界面去了吧)
void TIM6_IRQHandler(void)
{
HAL_TIM_IRQHandler(&htim6);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
Sleeping_display_flag = 1;
}
然后就是按键的代码了,要求是
于是我在每次的按键检测后面都有检测到底是在哪个界面,如果在sleeping界面,则不执行原本在数据界面的功能按键。只有在数据界面的时候就是Sleeping_display_flag = 0才会执行模式的选择
void Mode_set(){
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET && g_Mode_flag == 0){
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET && g_Mode_flag == 0){
if (Sleeping_display_flag == 1){
MX_TIM6_Init();
HAL_TIM_Base_Start_IT(&htim6);
Sleeping_display_flag=0;
}
else
g_Mode_flag = 1;
}
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET);
}
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET && g_Mode_flag == 1)
HAL_Delay(10);
if (HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET && g_Mode_flag == 1){
if (Sleeping_display_flag == 1){
MX_TIM6_Init();
HAL_TIM_Base_Start_IT(&htim6);
Sleeping_display_flag = 0;
}
else
g_Mode_flag = 0;
}
while(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET);
}
踩的坑就这些,第一次写一个较完整的嵌入式代码,大佬轻喷。。
附上我的keil链接,串口收发没写,写了一坨屎山,不要慌,慢慢改
链接:https://pan.baidu.com/s/15ueLQEKIZv4u7QeFcrprcQ?pwd=kylh
提取码:kylh
题目要求