STM32学习笔记——(5)按键检测

按键检测

一、按键检测

在这里插入图片描述
如上图所示,
若按键KEY1未按下时检测点为低电平,按下时检测点为高电平。
若按键KEY2/3/4未按下时检测点为高电平,按下时检测点为低电平。
程序如下:

/**************************
一些宏定义
***************************/
#define KEY1   GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)//读取按键1(KEY1)
#define KEY2   GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_3)//读取按键2(KEY2)
#define KEY3   GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_4)//读取按键3(KEY3)

#define KEY1_PRES 	1	//KEY1按下
#define KEY2_PRES	2	//KEY2按下
#define KEY3_PRES   3	//KEY3按下
/****************************
初始化和检测程序
*****************************/
//KEY1->PA.0
//KEY2->PE.3
//KEY3->PE.4
void key_init(void)//初始化程序
{
	GPIO_InitTypeDef GPIO_InitStruct;
	//开始时钟GPIOA/GPIOE
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE);
	//设置为浮空输入
	GPIO_InitStruct.GPIO_Mode= GPIO_Mode_IN_FLOATING;
	GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;
	GPIO_Init(GPIOE, &GPIO_InitStruct);
	
	GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_4|GPIO_Pin_3;//KEY1-KEY2
 	GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE4,3
}

u8 KEY_Scan(u8 mode)  //检测程序
{	 
	static u8 key_up=1;//按键按松开标志
	if(mode)key_up=1;  //支持连按	   // 《1》	  
	if(key_up&&(KEY0==0||KEY1==0||WK_UP==1))	《2》	
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(WK_UP==1)return WKUP_PRES;
	}lse if(KEY0==1&&KEY1==1&&WK_UP==0)key_up=1;   //  《3》	    
 	return 0;// 无按键按下
}

按键检测程序分析:
先引入静态局部变量的概念
静态局部变量:
1.变量在全局数据区分配内存空间;编译器自动对其初始化
2.其作用域为局部作用域,当定义它的函数结束时,其作用域随之结束

static修饰后的key_up为静态局部变量,在编译时赋初值的,且只赋初值一次,在程序运行时它已有初值。以后在每次调用函数时就不再重新赋初值,而是保留上次函数调用结束时的值。

分析:
当没有按键被按下时(KEY1==1 || KEY2==0||KEY3==0)为0,
当有按键被按下时(KEY1==1||KEY2==0||KEY3==0)为1。

先分析不支持连续按的
如果不支持连续按的话 《1》就不会被执行
如果按键被按下时会执行《2》里面的代码,此时key_up=0;会把key_up变为0,在key_up不变为1之前《2》永远为假(0),此时我们看程序会发现只有按键松下的时候key_up才为1,我们发现只有按键被松下后《3》才会被执行,key_up才会变为1。这是按键才会再次起作用。这就是不支持连按。

支持连按时,因为有了《1》的存在,按键被按下时key_up=0,当程序再次进来时因为《1》,key_up=1,此时如果按键被按下时,《2》还会为真,还会执行按键被按下的程序。此时不需要按键松开《3》的程序就可以继续执行按键被按下的程序了。这就是支持连续按了。

按键检测也就这些了,按键检测程序有好多中写法,这个只是其中一种。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值