一.题目
二.思路导向
这套题目相对简单,考察LCD屏幕,LED,PWM,ADC,以及按键等知识点,相互结合起来也比较简单。我们只需要先分模块写好各部分即可。具体如下:
2.1 ADC模块
这里使用STM32CubeMX配置的时候使用的是adc2的通道15即PB15。自行配置即可
double Get_ADC(ADC_HandleTypeDef adc) { uint16_t temp = 0; HAL_ADC_Start(&adc); temp = HAL_ADC_GetValue(&adc); HAL_ADC_Stop(&adc); return temp*3.3/4096;//参考电压为3.3V,通道是12位的所以除以4096(2的12次方) }
2.2 按键模块
struct keys { uchar key_count; bool key_flag; bool key_press; }; struct keys key[4]={0}; void scan_key() { key[0].key_flag=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0); key[1].key_flag=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1); key[2].key_flag=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2); key[3].key_flag=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0); for(int i=0;i<4;i++) { switch(key[i].key_count) { case 0: if(key[i].key_flag==0) key[i].key_count=1; break; case 1: if(key[i].key_flag==0) key[i].key_count=2; else key[i].key_count=0; break; case 2: if(key[i].key_flag==1) { key[i].key_press=1; key[i].key_count=0; } break; default:break; } } }
2.3 配置定时器
我工程配置的是定时器3,时间为100ms,最后在定时器中断中添加相关逻辑部分即可,如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { char text[100]; static int count=0; if(htim->Instance==TIM3) { times=1; count++; scan_key(); if(key[0].key_press==1) { _UI=!_UI; HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_SET); if(_UI==0) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET); else if(_UI==1) HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET); HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET); LCD_Clear(Black); LCD_SetBackColor(Black); key[0].key_press=0; LCD_SetTextColor(Green); } if(key[1].key_press==1) { if(_UI==0)return ; pa6_duty+=10; if(pa6_duty==100)pa6_duty=10; __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,pa6_duty); key[1].key_press=0; LCD_SetTextColor(Blue); } if(key[2].key_press==1) { if(_UI==0)return ; pa7_duty+=10; if(pa7_duty==100)pa7_duty=10; __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty); key[2].key_press=0; LCD_SetTextColor(Red); } if(key[3].key_press==1) { _mode=~_mode; key[3].key_press=0; LCD_SetTextColor(Yellow); } if(_UI==0) { double temp=Get_ADC(hadc2); sprintf(text," V:%.2fV",temp); __HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,temp*100/3.3); __HAL_TIM_SetCompare(&htim16,TIM_CHANNEL_1,temp*100/3.3); LCD_DisplayStringLine(Line1,(unsigned char *)" Data"); LCD_DisplayStringLine(Line3,(unsigned char *)text); if(_mode==0) LCD_DisplayStringLine(Line5,(unsigned char *)" Mode:AUTO"); else LCD_DisplayStringLine(Line5,(unsigned char *)" Mode:MANU"); } else { LCD_DisplayStringLine(Line1,(unsigned char *)" Para"); sprintf(text," PA6:%d%%",pa6_duty); LCD_DisplayStringLine(Line3,(unsigned char *)text); sprintf(text," PA7:%d%%",pa7_duty); LCD_DisplayStringLine(Line5,(unsigned char *)text); } } }
三.工程文件
文件也属实有点多,可以到这里自取博主的代码进行参考。如有什么问题也可以评论区进行交流(博主会看评论区)最后感谢阅读。
链接:https://pan.baidu.com/s/11nfGSuzsEeDCWtdyrCY3Pw?pwd=6666 提取码:6666