STM32工作笔记0035---按键输入实验--库函数

 技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152

这里,之前说的都是输出,这里开始说输入。

看下面的硬件连接图

可以看到,这里KEY0,KEY1,KEY2这里左边连接的地,低电平,然后,上面KEY_UP,WK_UP,左边连接的高电平

KEY1连接PE3,KEY0连接PE4,KEY2连接PE2,UP连接PA0

mini版的有点不一样。

下面是实现这个按键输入的三种方式:

这里:

实现这个按键的流程。

这里注意,第二步,这里的上拉,下拉,对于KEY0,KEY1,KEY2来说,这个是上拉,

WK_UP这个是下拉。

然后扫码IO电平,可以用三种方式

扫描的思路:

对于按键扫描,有两种模式:

比如快进按键,只要按着不松开,就会一直加,比如音量。

还要一种按键,这种按键他只会被扫描一次,比如说电源按键,按一下,就还会关点,按着不松开,也不会出现

连续开关的现象,这就是说电平被扫描了一次。

这里就有两种按键模式,第一种模式是支持连按。

这里,也就是只要是检测到低电平就是有效的,

比如这里100ms,检测一次的话,如果按了1s,那么就是会检测到10次的低电平。

也就是这1s中内有10次是有效按下。

第二种模式,不是连续按下,而是只按下一次。

这里:扫描的时候,会这样,会检测低电平是按下,然后并且要保证上一次是松开的,

所以这里还要 记住上次的状态,也就是说

要保证,按下,并且上次是松开的,这个时候才算一次。

记录这个状态,这里是通过static这个关键字实现的。

这里看一下这个static变量。

比如这里有个getValue这个函数,然后第一个这个函数,这里flag不是static的,这样,每次调用

getValue的时候,这个函数都会返回1

然后第二个函数,中flag用了static来修饰,这个函数被调用完一次,以后,

这里的flag就不会被清除掉,而是被记录下来,而且第二次再调用这个函数的时候,

static修饰的这个语句,就不会被执行了,会直接执行flag++,也就是说,flag会每次调用都会+1

要知道static,这个修饰的语句,是静态语句,只是会被执行一次.

接下来看按键扫描:

可以看到这里if(按下),里面有防抖动,处理,也就是做了个10毫秒的延时,

我们知道这里的抖动的意思是:

由于电压不稳定,之类的,会发生,这样的抖动,就是说低电平的时候,也会出现突然的高电平,这样的波纹,

所以这里就延迟一下,保证获取到低电平,这里也是为什么要判断两次的原因.

这里如果连续按下的话,会连续监测到低电平,这里比如这个方法的话,就会连续返回1

这样的话,就能知道这个按键是一直按下的.

这里刚开始key_up这个静态的变量默认是1,也就是上一次没有按下,这个时候,如果

上一次没有按下,并且这一次按下了,就返回这个按键按下了.并且同时要把上一次的

值设置为0,也就是上一次已经按下.

如果按着没松开,连续按的情况,这里上一次的值一直是0也就是按下的情况,

这个时候,也就是上一次是按下的,然后再走else if判断这一次,有没有按下,如果

这一次按下的话,也就是这一次按下,上一次也是按下,这个时候就不做操作,

如果这次没有按下的话,就返回没有按下,并且把上一次的按下情况设置为1没有按下.

把两个代码合起来,其实就是mode=1,是支持连续按,可以看到如果把mode=1那一行代码删除掉

以后,这个代码,就相当于前面的不支持连续按的代码一样了.

这里,可以看到,这个合二为一的代码,思路是怎么样的呢,可以看到这里

对于连续按,所有的低电平都是有效的,而对于不连续按,只有前一次是高电平,也就是没有按下的状态,

这一次才有效,只是多了个上一次,所以,这里就加了个mode,mode是连续按的时候,就走连续按的代码就可以了.

打开代码:

找到key.h可以看到,这里面有通过库函数,操作的按键.读入按键状态.

上面注释掉的,是位操作版的.

位操作版的可以看到定义的地方,都有定义输入,输出.

sys.h中海油IO口初始化函数,还有按键扫描函数

可以看到这里的按键初始化函数

第一行定义的结构体,

第二行,首先是使能按键的IO口,因为按键用到了GPIOA和GPIOE这两个IO口组,所以使能这两个.

然后,结构体,这里指定要用PIN_2,PIN_3,PIN_4这几个引脚.具体的IO口.

然后设置成上拉输入.

然后是初始化GPIOE的2,3,4 io口.

可以看到对于KEY0,KEY1,KEY2这三个按键,这个按下的时候

第连接低电平,没有按下的时候,是高电平,所以这里我们要用到上拉输入.

也就是默认要设置为按键没有按下.

对于WK_UP这个按键,我们是按下的时候是高电平,没有按下的时候是低电平

所以这里,对于WK_UP我们设置为下拉输入.

再来看看按键扫描函数

可以看到支持连续按的时候,也就是可以看成默认上一次一直都是松开的.

只需要设置mode为1.

再看一下主函数,可以看到,首先初始化,一堆代码,

首先初始化,延时函数,然后初始化led,然后初始化key,然后初始化蜂鸣器,

然后调用按键扫描,并且,给按键扫描传入0,这个是不支持连续按.

然后得到按下的key值,传入key值,判断是按下的

WKUP_PRES按键,还是其他的按键.

,并且不同的按键有不同的动作,这里动作只是做了翻转.

然后测试一下

测试一下效果.

猜你喜欢

转载自blog.csdn.net/lidew521/article/details/108071539