在第二章我们完成了点灯仪式,这次我准备尝试把按键和灯结合起来,做一次GPIO的综合测试
实验任务为:按下按键1(B1),第1个灯(LD1)亮;
按下按键2(B2),第2个灯(LD2)亮;
按下按键3(B3),第3个灯(LD3)亮,0.5秒后自己熄灭;
按下按键4(B4),所有灯(LD1-LD8)亮;
首先打开CubeMX,新建项目
上面两张图是G431RBT6开发板的LED原理图和按键原理图,因此我们应当把PC8~PC15配置为输出(Output),把PB0、PB1、PB2、PA0配置为输入(Input),并且可以看到原理图中按键的两边分别接了VDD和GND,因此不需要设置输入模式了,上拉输入和下拉输入通常用于确保输入引脚在未连接到明确电源或地的情况下,能够保持一个明确的电平状态。这对于一些数字输入引脚,如按钮或开关输入,可以避免不稳定的状态或漂移。比如在F1系列中,按键有一边状态未明时,需要将其设置为上拉输入。
首先我们在main.c中编写按键扫描函数(写在/* USER CODE BEGIN 0 */和/* USER CODE END 0 */ 之间,防止代码被抹去)
/* USER CODE BEGIN 0 */
uint8_t Key_Scan(void) //按键扫描函数
{
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0) //PB0 (按键B1)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == 0); //等待按键抬起
return 1;//返回1
}
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0) //PB1 (按键B2)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == 0); //等待按键抬起
return 2;//返回2
}
}
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0) //PB2 (按键B3)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0)
{
while(HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2) == 0); //等待按键抬起
return 3; //返回3
}
}
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0) //PA0 (按键B4)被按下
{
HAL_Delay(10);//延时消抖
if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0)
{
while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 0); //等待按键抬起
return 4; //返回4
}
}
return 0; //没有按键按下返回0
}
/* USER CODE END 0 */
然后我们在主函数中编写任务需要的程序
在 while (1)中的/* USER CODE BEGIN 3 */后面编写功能函数
int Key_Value = 0;
Key_Value = Key_Scan();
if(Key_Value == 1) //按键B1被按下
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, 1);//先关闭所有灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, 0);//只打开第1个灯
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);//PD2为锁存器开关,防止灯的状态受到LCD影响
}
if(Key_Value == 2) //按键B2被按下
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, 1);//先关闭所有灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, 0);//只打开第2个灯
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);//PD2为锁存器开关,防止灯的状态受到LCD影响
}
if(Key_Value == 3) //按键B3被按下
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, 1);//先关闭所有灯
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, 0);//只打开第3个灯
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);//PD2为锁存器开关,防止灯的状态受到LCD影响
HAL_Delay(500);//延时500ms
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, 1);//关闭所有灯
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);//PD2为锁存器开关,防止灯的状态受到LCD影响
}
if(Key_Value == 4) //按键B4被按下
{
HAL_GPIO_WritePin(GPIOC, GPIO_PIN_All, 0);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 1);
HAL_GPIO_WritePin(GPIOD, GPIO_PIN_2, 0);
}
编译之后,通过程序烧录软件或者烧录器下载程序,即可完成实验任务
1、B1按下(第一个灯亮)
2、B2按下(第二个灯亮)
3、B3按下(LD3亮0.5s后自动熄灭,图片无法展示效果)
4、B4按下(所有灯都亮)