3.STM32F4按键扫描函数

//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1, KEY0 按下 2, KEY1 按下 3, KEY2 按下 4, WKUP 按下 WK_UP
//注意此函数有响应优先级,KEY0>KEY1>KEY2>WK_UP!!
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 1;
else if(KEY1==0)return 2;
else if(KEY2==0)return 3;
else if(WK_UP==1)return 4;
}else if(KEY0==1&&KEY1==1&&KEY2==1&&WK_UP==0)key_up=1;
return 0;// 无按键按下
}

KEY_Scan 函数,则是用来扫描这 4 个 IO 口是否有按键按下。 KEY_Scan 函数, 支持两种扫描方式,通过 mode 参数来设置。

当 mode 为 0 的时候, KEY_Scan 函数将不支持连续按, 扫描某个按键,该按键按下之后必须要松开,才能第二次触发,否则不会再响应这个按键,这样的好处就是可以防止按一次多次触发,而坏处就是在需要长按的时候比较不合适。

当 mode 为 1 的时候, KEY_Scan 函数将支持连续按,如果某个按键一直按下,则会一直返回这个按键的键值,这样可以方便的实现长按检测。 该函数有返回值,如果有按键按下,则返回非 0 值,如果没有或者按键不正确,则返回 0。

注:因为该函数里面有 static 变量,所以该函数不是一个可重入函数

static u8 key_up=1;//按键按松开标志

静态变量复习例子

#include<stdio.h>
int fun(int n)
{
    static int f=1;
    f=f*n;
    return f;
}
void main()
{
    int i;
    for(i=1;i<=5;i++)
    printf("fun(%d)=%d\n",i,fun(i));
}
运行结果:fun(1)=1
fun(2)=2
fun(3)=6
fun(4)=24
fun(5)=120

  说明f在加了static的类型限制之后,就相当于全局变量,函数调用完了之后,修改过的f的值仍然是有效的(即这个程序相当于求i的阶乘了)。而如果不加static的类型限制,那么,会是什么结果呢,我们看下面的代码:

 

#include<stdio.h>
int fun(int n)
{
    int f=1;
    f = f * n;
    return f;
}
void main()
{
    int i;
    for(i=1;i<=5;i++)
        printf("fun(%d)=%d\n",i,fun(i));
}

运行结果:

fun(1)=1
fun(2)=2
fun(3)=3
fun(4)=4
fun(5)=5

也就是说,这时函数fun中的变量f的生命周期就仅限于fun函数的范围内了,在main中每次传入新的参数i,f就会计算1*i的值并返回,而不会像之前那样不断的累乘了。

时间: 2024-08-30 07:26:01

3.STM32F4按键扫描函数的相关文章

最好的按键扫描和消抖方法,适用于复合、长按、按下或抬起响应按键

刚参加工作的时候,看了一些同事采用的按键扫描和消抖方法,对比学校里和网上查到的按键处理,发现觉得不尽善尽美,有以下几点: 1. 消抖复杂,效率低.有人直接在电平判断后使用delay()函数,进行消抖,耽误时间:有人在按键电平中断中进行消抖和处理,导致其他的服务反应慢,不适合做实时系统: 2. 许多功能在不同界面下是不同的,把按键处理在中断进行,导致分支很多,业务流不清晰. 3. 特殊功能按键的处理麻烦.在需要长按作为特殊按键.复合按键响应.复合按键长按响应的时候,需要增加很多的标志位,反复使用i

关于按键扫描程序的终极讨论

一.思路 基于STM8,按键处理,思路是这样的: 每20ms左右一次去扫描按键,用一个key_now记录当前值,用key_last记录上次的值,如果key_now和key_last同时有效,则开始进行cnt++. 我设定两个阈值,LONG_PRESS为100(100*20ms=2s),SHORT_PRESS为4(4*20ms=80ms,去抖). cnt大于LONG_PRESS,表示是长按,反之再判断cnt是不是大于SHORT_PRESS,表示是短按,否则把cnt清零. 另外一种情况,我们在设置参

基于FPGA的按键扫描程序

最近在学习FPGA,就试着写了个按键扫描的程序.虽说有过基于单片机的按键扫描处理经验,对于按键的处理还是有一些概念.但是单片机程序的编写通常都采用C写,也有用汇编,而FPGA却是采用VHDL或者Verilog这种硬件描述语言来编写.初次利用VHDL编写控制程序,最开始就有点反应不过来了.采用VHDL语言编写程序与用C语言编写,在思维上会有很大的不一样,因为C程序时顺序执行的,而VHDL语言各个进程之间是并行执行的,这就会要考虑到时序方面的问题,这正也合乎了硬件工作实际过程,毕竟各个功能模块之间既

按键检测函数

//按键处理函数//返回按键值//mode:0,不支持连续按;1,支持连续按;//0,没有任何按键按下//1,KEY0按下//2,KEY1按下//3,KEY3按下 WK_UP//注意此函数有响应优先级,KEY0>KEY1>KEY_UP!!u8 KEY_Scan(u8 mode){ static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { del

基于状态机的按键扫描的实现

一般的按键输入软件接口程序非常简单,在程序中一旦检测到按键输入口为低电平(有时可能为高),便采用软件延时的方 法来进行消抖,然后再次检测按键输入,如果再次确认为低电平则表示有按键按下,转入执行按键处理程序.如果延时后检测的电平为高电平则放弃本次按键检测, 重新开始一次按键检测过程.在简单的系统中这种方法比较可以用,但是在复杂的系统实时性要求较高的系统中这种方法的CPU利用率比较低,造成资源的浪费. 另外,由于在不同的产品系统中对按键功能的定义和使用方式也会不同,而且是多变的,加上在测试和按键处理

新型的按键扫描程序

不过我在网上游逛了很久,也看过不少源程序了,没有发现这种按键处理办法的踪迹,所以,我将他共享出来,和广大同僚们共勉.我非常坚信这种按键处理办法的便捷和高效,你可以移植到任何一种嵌入式处理器上面,因为C语言强大的可移植性. 同时,这里面用到了一些分层的思想,在单片机当中也是相当有用的,也是本文的另外一个重点. 对于老鸟,我建议直接看那两个表达式,然后自己想想就会懂的了,也不需要听我后面的自吹自擂了,我可没有班门弄斧的意思,hoho--但是对于新手,我建议将全文看完.因为这是实际项目中总结出来的经验

单片机按键扫描程序,仅三行代码(转)

以下假设你懂C语言,因为纯粹的C语言描述,所以和处理器平台无关,你可以在MCS-51,AVR,PIC,甚至是ARM平台上面测试这个程序性能.当然,我自己也是在多个项目用过,效果非常好的.      好了,工程人员的习惯,废话就应该少说,开始吧.以下我以AVR的MEGA8作为平台讲解,没有其它原因,因为我手头上只有AVR的板子而已没有51的.用51也可以,只是芯片初始化部分不同,还有寄存器名字不同而已.核心算法:unsigned char Trg;unsigned char Cont;void K

巧妙的IO口按键扫描方法

在做项目的时候,我们经常要用到比较多的按键,而且IO资源紧张,于是我们就想方设法地在别的模块中节省IO口,好不容易挤出一两个IO口,却发现仍然不够用,实在没办法了就添加一个IC来扫键.一个IC虽然价格不高,但对于大批量生产而且产品利润低的厂家来说,这是一笔不菲的开支!那,我们能不能想到比较好的扫键方法:用最少的IO口,扫最多的键?可以吗?举个例:给出5个IO口,能扫多少键?有人说是2*3=6个,如图一: 对,大部分技术参考书都这么做,我们也经常这样做:用3个IO口作行扫描,2个IO作列检测(为方

CC2540开发板学习笔记(二)&mdash;&mdash;按键

一.实验内容 用按键S1控制LED1的亮和灭 二.实验过程 1.电路原理: 可以看出,当S按下P0.0和P0.1接地,反之则接高电压. 2.寄存器使用: 依旧应该首先进行3个基本寄存器的设定,对LED和按键S都要进行设定. 3.代码实现(IAR环境下) #include<ioCC2540.h> #define LED1 P1_0 //定义LED1,方便查阅代码 #define KEY1 P0_0 //定义按键S1 //函数声明 void Delayms(unsigned int t); //延