题目分析
原题:
原题请戳这里第十届省赛真题
功能分析:
本题需要使四个模块:
- LED模块,实现提示灯功能(200ms闪烁)
- LCD模块,显示数据界面和设置界面
- 按键模块,用于在切换显示界面和在设置界面调节参数
- ADC模块,用于采集转换电压值
工具
程序设计
CubeMX配置
- 本题CubeMX配置与我上一篇博客做的十一届真题相差不大,只少去了PWM的配置,可以参照上篇博文链接请戳这里蓝桥杯第十一届省赛真题练习
代码实现
本题需要自行添加官方例程中的lcd.c、lcd.h、fonts.h文件
main.c中
/* USER CODE BEGIN Includes */
#include"lcd.h"
#include"stdio.h" //speintf函数需要用到
/* USER CODE END Includes */
/* USER CODE BEGIN PV */
char Buf[20];//用于存放格式化后的电压值字符串
extern uint8_t LED_Flag;//外部变量声明,LED 200ms延时的标志变量
uint8_t Key_Val=0; //键值
uint8_t B1_Val=0; //B1按键标志
uint8_t B2_Val=0;//B2按键标志
uint8_t B3_Val=0;//B3按键标志
uint8_t B4_Val=0;//B4按键标志
char Upper_LimitValData[20];//用于存放格式化后的上限电压字符串
char Lower_LimitValData[20];//用于存放格式化后的下限电压字符串
float Upper_LimitVal =2.4;// 电压上限值
float Lower_LimitVal =1.2;// 电压下限值
char LDModeBuf[20];//用于存放格式化后的指示灯标号字符串
uint8_t UpLDMode=1;//上限指示灯标号
uint8_t LoLDMode=2;//下限指示灯标号
uint8_t Status=0;//状态 0为主界面,1为设置界面
char StatusBuf[20]; //用于存放格式化后的状态字符串
char Status_Upper[20]="Upper"; //超过上限
char Status_Lower[20]="Lower"; //低于下限
char Status_Normal[20]="Normal";//正常
/* USER CODE END PV */
/* USER CODE BEGIN PFP */
uint8_t Key_Scan() //按键检测
{
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET) //B4
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==GPIO_PIN_RESET)
{
Key_Val=4; //返回按键值
B4_Val++;
if(B4_Val>1)
{
B4_Val=0;
}
}
}
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)//B3
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==GPIO_PIN_RESET)
{
Key_Val=3;//返回按键值
B3_Val++;
if(B3_Val>1)
{
B3_Val=0;
}
}
}
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)//B2
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==GPIO_PIN_RESET)
{
Key_Val=2;//返回按键值
B2_Val++;
if(B2_Val>4)
{
B2_Val=1;
}
}
}
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)//B1
{
HAL_Delay(10);
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==GPIO_PIN_RESET)
{
Key_Val=1;//返回按键值
B1_Val++;
if(B1_Val>1)
{
B1_Val=0;
}
}
}
return Key_Val;//返回按键值
}
uint16_t getADC(void) //ADC转换,返回电压值
{
uint16_t ADC_val = 0;
HAL_ADC_Start(&hadc2);
ADC_val = HAL_ADC_GetValue(&hadc2);
return ADC_val ;//返回电压值
}
void LCD_HighLight() //高亮
{
LCD_SetBackColor(White);
LCD_SetTextColor