【STM32学习笔记——按键】

这篇博客总结了四种按键检测方法,包括正点原子法支持长按、简单扫描法、外部中断法和ADC电压检测法。每种方法都有其特点,如正点原子法适用于长按控制,简单扫描法节省CPU资源,外部中断法实时性强且配置复杂,而ADC法则适用于硬件有特殊要求的场景。此外,还提及了矩阵键盘的使用,但未给出具体代码。文章强调了结合按键状态变化来实现长短按的判断,并提供了实现不同功能的示例。

第二次学蓝桥杯32板子 看了几个视频 来总结一下 几种独立按键的配置,希望能够帮到有疑惑的同学。

第一种就是刚开始学的正点原子的那 种方法。

这种方法 可以很好地 控制是否支持长按。

u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0||WK_UP==1))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1; 	    
 	return 0;// 无按键按下
}
	{
 		key=KEY_Scan(0);	//得到键值
	   	if(key)
		{						   
			switch(key)
			{				 
				case WKUP_PRES:	//控制蜂鸣器
					BEEP=!BEEP;
					break;
				case KEY2_PRES:	//控制LED0翻转
					LED0=!LED0;
					break;
				case KEY1_PRES:	//控制LED1翻转	 
					LED1=!LED1;
					break;
				case KEY0_PRES:	//同时控制LED0,LED1翻转 
					LED0=!LED0;
					LED1=!LED1;
					break;
			}
		}else delay_ms(10); 
	}	 

这种方法 可以很好地 控制是否支持连续按。

第二种方法是

uint8_t key_scan(void)
{
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0)return 1;
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0)return 2;
	if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0)return 3;
	if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 4;
	
	else return 0;
}
void key_SScan(void)
{

	if((uwTick-uwTick_old)<100) return;
		uwTick_old=uwTick;//保证100ms 扫描一次   
	
	key_val=key_scan();
	key_down=key_val&(key_val^key_old);
	//第一次按下1
	//key_val 0000 0001
	//key_old 0000 0000
	//key_down 0000 00001&(0000 0001^0000 0000)=0000 0001
	//key_up 1111 1110&(0000 0001^0000 0000)=0000 0000
	//key_old 0000 0001
//按下1没有松开时
	//key_val 0000 0001
	//key_down 0000 0001 &(0000 0001^0000 0001)=0000 0000
	//key_up 1111 1110&(0000 0001^0000 0001)=0000 0000
	//key_old 0000 0001
//按下1之后松开时
	//key_val 0000 0000
	//key_down 0000 00000&(0000 0000^0000 0000)=0000 0000
	//key_up 1111 1111&(0000 0000^0000 0001)=0000 0001
	//key_old 0000 0000


	//可以巧妙的发现   key_old在按下期间一直是非0   所以可以根据这个来 记录按下的时长  从而实现长短按
	//(key_val^key_old)保证两次的状态不一样,才会把值给了down  
	//从而保证了不会触发连按并且与keyup结合起来  可以判断按下的时长   
	key_up=~key_val&(key_val^key_old);
	key_old=key_val;//可以保证每一次按之前  key_old都是0000 0000
	if(key_old!=0)key_js++;
	if(key_js<40)
	  {
			if(key_up==1)ucled=0x01;//里边只能用up了因为只有松手时 才能知道 是长按还是短按
			if(key_up==2)ucled=0x02;
			if(key_up==3)ucled=0x04;
			if(key_up==4)ucled=0x08;	
	  }
	if(key_js>=40)
	  {
			if(key_up==1)ucled=0x01<<4;
			if(key_up==2)ucled=0x02<<4;
			if(key_up==3)ucled=0x04<<4;
			if(key_up==4)ucled=0x08<<4;
	  }
	
	if(key_old==0)key_js=0;
}

第三种 外部中断

可以用外部中断触发的 方式
配置好中断 当按键按下时,是上升沿或者下降沿触发后,去对应的中断服务函数中,处理按键所实现的功能即可
这种方式不占用cpu资源。就是配置有点麻烦,有需要的可以自行配置。

第四种方法 采用adc (硬件有特殊要求)

即按下的每个键所采集到的电压 不同 从而区别出是哪个按键被按下了
一路ADC采集即可实现。

第五种 矩阵键盘(这属于没有方法瞎凑形式)

有时间了 再把代码粘贴过来

如果有时间 也会把第三种的代码
以及第四种的 方法粘贴出来的。。。

待续…有帮助的话可以点个赞

### 关于STM32的学习资源推荐 对于初学者而言,选择合适的入门材料至关重要。针对STM32的学习路径可以从最广泛使用的型号——STM32F103开始[^2]。这款微控制器在市场上拥有丰富的教程和支持文档,有助于新手快速上手。 #### 工具与环境搭建 使用STM32CubeIDE作为开发工具能极大提高编程效率,并简化外设初始化过程[^1]。通过这个集成开发环境(IDE),开发者不仅可以轻松创建工程项目,还能利用其内置的功能向导来配置硬件参数,减少手动编码的工作量。 #### 基础概念理解 了解ARM Cortex-M架构以及如何操作GPIO端口、定时器和其他基本外围设备是必要的基础知识。这些内容通常会在官方手册和技术参考中详细介绍。此外,网络上有许多免费视频课程和博客文章专门讲解这些问题。 #### 实践练习 理论学习之后应立即付诸实践。尝试构建简单的应用程序如LED闪烁或按键读取可以帮助巩固所学的知识点。随着技能的增长,可以逐步挑战更复杂的项目,例如串行通信协议实现或是传感器数据采集处理等任务。 #### 高级特性探索 当掌握了初步技巧后,可考虑转向更高阶的产品线如STM32U5系列来进行深入研究[^3]。这类芯片提供了更好的性能表现及更多样化的接口选项,同时也引入了一些新颖的技术特征(如图形加速),使得它们成为理想的选择用于高级课题的研究和发展工作。 ```python # 示例代码:点亮一个连接至PA5引脚的LED灯 import pyb led = pyb.LED(1) # 定义LED对象关联到蓝色LED (即PA5) while True: led.toggle() # 切换LED状态 pyb.delay(500) # 等待半秒 ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值