在学习了前三节LED、LCD、KEY基本操作后,我们就已经成功掌握蓝桥杯必考的三大样内容了,本节以第12届蓝桥杯显示部分内容进行综合练习:
一、真题引入
1.功能概述
2.LCD显示界面
(1)车位显示界面
(2)费率显示界面
(3)LCD通用显示要求
3.按键功能
4.LED指示灯功能
5.初始状态说明
二、题目分析
上述为作者将三大模块的输出截取出来的题目要求,并非蓝桥杯竞赛全部比赛要求。
1.解题思路
为了使解题过程循序渐进一气呵成,我们首先要先总结出以下几点内容:
①LCD屏幕一共两个屏幕界面,因此要书写两段LCD输出的代码。
②板子上电后就有内容显示,默认处于车位显示界面,因此可以首先书写该屏幕的内容保证初始化没问题。
③按键是为LED、LCD服务的,因此最后书写按键状态切换的逻辑。
④LED在本题中一共两种状态——LED1亮 or 都灭
2.解题步骤
因此解题步骤如下:
编写车位显示界面 --> 编写费率显示界面 --> 编写LED灯功能 -->编写按键的逻辑限制
三、环境搭建
新建CubeMX
配置外部时钟
配置基础引脚(LED与KEY)
我们可以看出这里并没有像第一节那样去将所有的灯引脚置为High,是因为当时这么做的目的是初始化的时候LED灯全灭,这是硬件控制的方法。
事实上我们也可以用一行代码实现我们想要的功能,即采用软件控制的方法(见后续代码实现中的操作)
配置工程基础信息
进入keil,初始化编译
添加lcd.c lcd.h模块文件,并编译
四、通用功能函数书写以及文件导入
1.key.h
#include "stm32g4xx_hal.h"
#define KEY1 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define KEY2 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define KEY3 HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define KEY4 HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
char key_scan(void);
char key_scan_cd(void);
2.key.c
#include "stm32g4xx_hal.h"
#include "key.h"
char key_scan(void)
{
static int count1,count2,count3,count4;
char value=0;
count1 = count2 = count3 = count4 = 0;
if(KEY1==0)
{
HAL_Delay(10);
if(KEY1==0)
{
count1++;
if(count1==1)
{
value = 1;
while(KEY1==GPIO_PIN_RESET);
}
}
}
else
{
count1 = 0;
}
if(KEY2==0)
{
HAL_Delay(10);
if(KEY2==0)
{
count2++;
if(count2==1)
{
value = 2;
while(KEY2==GPIO_PIN_RESET);
}
}
}
else
{
count2 = 0;
}
if(KEY3==0)
{
HAL_Delay(10);
if(KEY3==0)
{
count3++;
if(count3==1)
{
value = 3;
while(KEY3==GPIO_PIN_RESET);
}
}
}
else
{
count3 = 0;
}
if(KEY4==0)
{
HAL_Delay(10);
if(KEY4==0)
{
count4++;
if(count4==1)
{
value = 4;
while(KEY4==GPIO_PIN_RESET);
}
}
}
else
{
count4 = 0;
}
return value;
}
char key_scan_cd(void)
{
static int count1,count2,count3,count4;
char value=0;
count1 = count2 = count3 = count4 = 0;
if(KEY1==0)
{
HAL_Delay(10);
if(KEY1==0)
{
count1++;
if(count1>70)
{
value = 11;
}
}
}
else
{
if(count1>0&&count1<=50)
{
value = 1;
}
count1 = 0;
}
if(KEY2==0)
{
HAL_Delay(10);
if(KEY2==0)
{
count2++;
if(count2>70)
{
value = 22;
}
}
}
else
{
if(count2>0&&count2<=50)
{
value = 2;
}
count2 = 0;
}
if(KEY3==0)
{
HAL_Delay(10);
if(KEY3==0)
{
count3++;
if(count3>70)
{
value = 33;
}
}
}
else
{
if(count3>0&&count3<=50)
{
value = 3;
}
count3 = 0;
}
if(KEY4==0)
{
HAL_Delay(10);
if(KEY4==0)
{
count4++;
if(count4>70)
{
value = 44;
}
}
}
else
{
if(count4>0&&count4<=50)
{
value = 4;
}
count4 = 0;
}
return value;
}
3.led.h
#include "stm32g4xx_hal.h"
//灯光的亮灭
#define ON 1
#define OFF 0
//定义引脚
#define LED1 HAL_GPIO_PIN_8
#define LED2 HAL_GPIO_PIN_9
#define LED3 HAL_GPIO_PIN_10
#define LED4 HAL_GPIO_PIN_11
#define LED5 HAL_GPIO_PIN_12
#define LED6 HAL_GPIO_PIN_13
#define LED7 HAL_GPIO_PIN_14
#define LED8 HAL_GPIO_PIN_15
#define LEDALL HAL_GPIO_PIN_ALL
//相关函数的声明
void control_led(uint16_t LED, uint8_t status);
4.led.c
#include "led.h"
void control_led(uint16_t LED, uint8_t status)
{
if(status == 0)//灭灯
{
HAL_GPIO_WritePin(GPIOC,LED,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
else//亮灯
{
HAL_GPIO_WritePin(GPIOC,LED,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
}