一.题目
二.思路导向
这套题目相对简单,考察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