写在前面——
《STM32单片机开发应用教程(HAL库版)—基于国信长天嵌入式竞赛实训平台(CT117E-M4)》第四章4.3 按键控制实验,讲述按键控制的编程方法
官方例程下载:https://pan.baidu.com/s/1QC5BnDgY1m1me6-ihQ_OUQ?pwd=nqb1
提取码:nqb1
目录
4.3 按键控制实验
4.3.1. 实验任务
- 简单按键控制:官方例程HAL_02_KEY_TEST,实现4个按键控制对应的LED亮/灭。
- 拓展功能:编写按键扫描函数Key_scan、按键服务函数Key_proc,实现按键长/短按之分。
4.3.2. 硬件连接
开发板上共配备了4个按键,分别连接在PB0,PB1,PB2,PA0引脚上,引脚通过10K的电阻连接在电源正极VDD,按键的另一端连接在电源负极GND。
可知,在没有按键按下时,对应的GPIO输入高电平,有按键按下时,输入低电平。
4.3.3. GPIO初始化配置(STM32CubeMX)
参看2.3.1节所述步骤,配置STM32CubeMX相关选项(GPIO、RCC、SYS)。其中, LED涉及的GPIO(PD2、PC8 ~ PC15)全部设置为输出模式。按键对应的GPIO(PB0,PB1,PB2,PA0)全部设置为输入模式。
4.3.4. 应用程序设计(KEIL5)
1. 按键控制LED显示
参考官方例程2(HAL_02_KEY_TEST),编程思路:
- 先LED全灭
- 按键值判别
根据按键电路原理,按下时则能检测到输入值为0,否则为1,进行各个按键判别。
因此,先HAL_GPIO_ReadPin()读取某个按键值,再用if语句将读取值与0比较 - 对应的LED显示控制:某按键值为0,则置对应的LED控制引脚为0(亮)
关键程序设计如下:
/* USER CODE END 2 */
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, GPIO_PIN_SET);// GPIO_PIN_All,灯全灭
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
//B1,PB0
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8 | 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);
}
//B2,PB1
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET){
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10 | GPIO_PIN_11, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, GPIO_PIN_RESET);
}
//B3,PB2
if(