蓝桥杯嵌入式第十届省赛真题练习

该博客主要分析了蓝桥杯嵌入式比赛第十届省赛的题目,涉及LED闪烁、LCD显示、按键控制和ADC电压采集等功能。在工具部分提到了使用MDK ARM V5和STM32CubeMX v6.1.1进行软件开发,以及STM32G431RBTx开发板作为硬件平台。在程序设计环节,博主详细描述了CubeMX的配置差异,并指出代码实现中需要注意按键状态的问题,承认程序设计仍有提升空间。
摘要由CSDN通过智能技术生成

题目分析

原题:

原题请戳这里第十届省赛真题

功能分析:

本题需要使四个模块:

  1. LED模块,实现提示灯功能(200ms闪烁)
  2. LCD模块,显示数据界面和设置界面
  3. 按键模块,用于在切换显示界面和在设置界面调节参数
  4. ADC模块,用于采集转换电压值
工具
  1. 软件:MDK ARM V5、STM32CubeMX v6.1.1
  2. 硬件:STM32G431RBTx 开发板

程序设计

CubeMX配置
  1. 本题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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值