目录
3.3 实验03-按键轮询实验
在SmartUnion STM32F103VET6开发板中,使用轮询方法实现5个按键分别控制5个LED灯的功能。按下KEY1按键,实现LED1的点亮和熄灭,按下KEY2按键,实现LED2的点亮和熄灭,按下KEY3按键,实现LED3的点亮和熄灭,按下KEY4按键,实现LED4的点亮和熄灭,按下KEY5按键,实现LED5的点亮和熄灭。
3.3.1 STM32CubeMX软件配置
1.复制实验2配置完成的CubeMX文件,如下图所示。
2.复制到Demo03文件夹中(没有Demo03文件夹,自己新建即可),并修改为Demo03.ioc,如下图所示。
3.双击打开Demo03.ioc文件,进入STM32CubeMX软件配置。
4.配置5个按键引脚,参考下图中的原理图可知,KEY1按键与PA0引脚连接,KEY2按键与PA1引脚连接,KEY3按键与PC2引脚连接,KEY4按键与PB3引脚连接,KEY5按键与PB4引脚连接。
5.由于使用按键轮询方法完成本次实验,5个按键都需要配置为GPIO_Input(输入模式)。找到PA0引脚,在标号1处点击鼠标左键,在标号2处选择GPIO_Input功能,具体操作如下图所示。
6. 配置PA1引脚,在标号1处点击鼠标左键,在标号2处选择GPIO_Input功能。
7. 配置PC2引脚,在标号1处点击鼠标左键,在标号2处选择GPIO_Input功能。
8. 配置PB3引脚,在标号1处点击鼠标左键,在标号2处选择GPIO_Input功能。
9. 配置PB4引脚,在标号1处点击鼠标左键,在标号2处选择GPIO_Input功能
10.在左侧找到GPIO选项后并点击,可以看到之前配置的8个LED引脚信息还在,这里就不用再次配置LED引脚相关信息,如下图所示。
11.配置PA0引脚功能,具体操作步骤如下图所示。
11.配置PA1引脚功能,具体操作步骤如下图所示。
12.配置PB3引脚功能,具体操作步骤如下图所示。
13.配置PB4引脚功能,具体操作步骤如下图所示。
14.配置PC2引脚功能,具体操作步骤如下图所示。
15.保存CubeMX工程,如下图所示。
16.查看保存路径信息,如下图所示。
17.点击GENERATE CODE,生成STM32工程代码。
(1)等待代码生成完成。
(2)出现如下图信息,则代码生成成功。
3.3.2 代码编写
1.点击Open Folder,如下图所示。
2.出现如下图所示的工程路径。
3.在MDK-ARM目录下找到Demo03.uvprojx文件,双击打开。
4.出现如下图所示界面。
5.展开User项目组。
6.找到User/main.c,双击打开main.c文件,在59行处添加代码,编写uint8_t Key_Scan(void)按键扫描函数,如下图所示。
参考代码如下:
//读取按键扫描函数
uint8_t Key_Scan(void)
{
//检测KEY1是否被按下(电平值等于1表示按键被按下)
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1)
{
//延时去抖,防止机械抖动误触发
HAL_Delay(10);
//再次检测KEY1是否被按下
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin) == 1)
{
while(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==1);//等待按键释放
return 1; //返回1,代表KEY1被按下
}
}
//检测KEY2是否被按下(电平值等于1表示按键被按下)
else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1)
{
//延时去抖,防止机械抖动误触发
HAL_Delay(10);
//再次检测KEY2是否被按下
if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin) == 1)
{
while(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)==1);//等待按键释放
return 2; //返回2,代表KEY2被按下
}
}
//检测KEY3是否被按下(电平值等于1表示按键被按下)
else if(HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1)
{
//延时去抖,防止机械抖动误触发
HAL_Delay(10);
//再次检测KEY3是否被按下
if(HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin) == 1)
{
while(HAL_GPIO_ReadPin(KEY3_GPIO_Port, KEY3_Pin)==1);//等待按键释放
return 3; //返回3,代表KEY3被按下
}
}
//检测KEY4是否被按下(电平值等于1表示按键被按下)
else if(HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) == 1)
{
//延时去抖,防止机械抖动误触发
HAL_Delay(10);
//再次检测KEY4是否被按下
if(HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin) == 1)
{
while(HAL_GPIO_ReadPin(KEY4_GPIO_Port, KEY4_Pin)==1);//等待按键释放
return 4; //返回4,代表KEY4被按下
}
}
//检测KEY5是否被按下(电平值等于1表示按键被按下)
else if(HAL_GPIO_ReadPin(KEY5_GPIO_Port, KEY5_Pin) == 1)
{
//延时去抖,防止机械抖动误触发
HAL_Delay(10);
//再次检测KEY5是否被按下
if(HAL_GPIO_ReadPin(KEY5_GPIO_Port, KEY5_Pin) == 1)
{
while(HAL_GPIO_ReadPin(KEY5_GPIO_Port, KEY5_Pin)==1);//等待按键释放
return 5; //返回5,代表KEY5被按下
}
}
return 0;//返回0,代码没有按键被按下
}
7.在main.c文件,在while循环语句中165行添加代码,如下图所示。
参考代码如下:
uint8_t key_num = Key_Scan();
if(key_num == 1)
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); //KEY1被按下,翻转LED1 IO口电平
else if(key_num == 2)
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); //KEY2被按下,翻转LED2 IO口电平
else if(key_num == 3)
HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); //KEY3被按下,翻转LED3 IO口电平
else if(key_num == 4)
HAL_GPIO_TogglePin(LED4_GPIO_Port, LED4_Pin); //KEY4被按下,翻转LED4 IO口电平
else if(key_num == 5)
HAL_GPIO_TogglePin(LED5_GPIO_Port, LED5_Pin); //KEY5被按下,翻转LED5 IO口电平
3.3.3 编译与下载程序
1.编译程序,操作步骤如下图所示。
2.查看编译是否成功。
3.程序下载。
3.3.4 查看实验结果
第一次按下KEY1按键,LED1被点亮,第二次按下LED1被熄灭,如此往复,第一次按下KEY2按键,LED2被点亮,第二次按下LED2被熄灭,如此往复,第一次按下KEY3按键,LED3被点亮,第二次按下LED3被熄灭,如此往复,第一次按下KEY4按键,LED4被点亮,第二次按下LED4被熄灭,如此往复,第一次按下KEY5按键,LED5被点亮,第二次按下LED5被熄灭,如此往复。