3.基础实验 实验03-按键轮询实验

目录

3.3 实验03-按键轮询实验

3.3.1 STM32CubeMX软件配置

3.3.2 代码编写

3.3.3 编译与下载程序

3.3.4 查看实验结果


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.程序下载。

    请参考前面章节【2.程序下载】https://blog.csdn.net/Wang_Zhi_Hao/article/details/120238876icon-default.png?t=L892https://blog.csdn.net/Wang_Zhi_Hao/article/details/120238876这部分内容。

3.3.4 查看实验结果

第一次按下KEY1按键,LED1被点亮,第二次按下LED1被熄灭,如此往复,第一次按下KEY2按键,LED2被点亮,第二次按下LED2被熄灭,如此往复,第一次按下KEY3按键,LED3被点亮,第二次按下LED3被熄灭,如此往复,第一次按下KEY4按键,LED4被点亮,第二次按下LED4被熄灭,如此往复,第一次按下KEY5按键,LED5被点亮,第二次按下LED5被熄灭,如此往复。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值