历史上的今天

今天是:2024年09月22日(星期日)

正在发生

2020年09月22日 | 关于按键扫描程序的终极讨论

发布者:创新火箭 来源: eefocus关键字:按键扫描  按键处理  阈值 手机看文章 扫描二维码
随时随地手机看文章

一、思路


基于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清零。


另外一种情况,我们在设置参数的时候,要不停加1或者减1,我长按,希望数值连续增减,怎么实现?


接上面的cnt值,再设置一个连按的阈值,MID_PRESS=50(50*20ms=1s)。

当cnt大于MID_PRESS时,我认为触发了短按,但此时不清空cnt,只是将cnt减去SHORT_PRESS的值。

如此下去,如果按键一直不松开,则一直连线触发短按。



二、实现


硬件上有三个按键,分别是set,up,down。


// 控制按键时长 

#define LONG_PRESS 100 // 20ms*100=2s,长按 

#define SHORT_PRESS 5 // 20ms*5=100ms,短按 

#define MID_PRESS 50 // 20ms*50=1s,连按 

#define REPEAT_PRESS 5 // 200ms*5=100ms,连按灵敏参数 


#define KEY_PORT (GPIOC) 

#define KEY_SET (GPIO_PIN_5) // set键接PC5 

#define KEY_UP (GPIO_PIN_6) // up键接PC6 

#define KEY_DOWN (GPIO_PIN_7) // down键接PC7


uchar pinNow; 

bool pinSet_now, pinUp_now, pinDown_now; 

bool pinSet_last, pinUp_last, pinDown_last; 

bool set_long = FALSE; // set键长按 

bool set_short = FALSE; // set键短按 

bool up_short = FALSE; // up键短按 

bool down_short = FALSE; // down键短按


// 初始化 

void key_proc_init(void) 

    GPIO_Init(KEY_PORT, KEY_SET|KEY_UP|KEY_DOWN, GPIO_MODE_IN_FL_IT); 

    EXTI_SetExtIntSensitivity(EXTI_PORT_GPIOC, EXTI_SENSITIVITY_FALL_ONLY);


    pinNow = 0; 

    set_cnt = 0; 

    up_cnt = 0; 

    down_cnt = 0;


    set_long = FALSE; 

    set_short = FALSE; 

    up_short = FALSE; 

    down_short = FALSE; 

}


// 按键处理 

void key_scan(void) 

    //按键端口上拉了,默认是高电平,有按键时变低。这里取反,有按键时变高。 

    pinNow = 0xFF - GPIO_ReadInputData(KEY_PORT); 

    pinSet_now = pinNow & KEY_SET; 

    pinUp_now = pinNow & KEY_UP; 

    pinDown_now = pinNow & KEY_DOWN;


    // set键只分长按和短按,没有连按 

    if (pinSet_now & pinSet_last) { 

        set_cnt++; 

        if (set_cnt>LONG_PRESS) { 

            set_long = TRUE; 

            set_cnt = 0; 

        } 

    }else { 

        if (set_cnt>SHORT_PRESS) { 

            set_short = TRUE; 

            set_cnt = 0; 

        }else{ 

            set_cnt = 0; 

        } 

    } 


    // up和down键有连按和短按,没有长按 

    if (pinUp_now & pinUp_last) { 

        up_cnt++; 

        if (up_cnt>MID_PRESS) { 

            up_short = TRUE; 

            up_cnt = up_cnt - REPEAT_PRESS; 

        } 

    }else{ 

        if (up_cnt>SHORT_PRESS) { 

            up_short = TRUE; 

            up_cnt = 0; 

        } 

    }


    if (pinDown_now & pinDown_last) { 

        down_cnt++; 

        if (down_cnt>MID_PRESS) { 

            down_short = TRUE; 

            down_cnt = down_cnt - REPEAT_PRESS; 

        } 

    }else{ 

        if (down_cnt>SHORT_PRESS) { 

            down_short = TRUE; 

            down_cnt = 0; 

        } 

    }


    // 添加自己对于set_long,set_short,up_short,down_short的处理代码 

    // 处理完了不要忘记把相应的值置为FALSE


    pinSet_last = pinSet_now; 

    pinUp_last = pinUp_now; 

    pinDown_last = pinDown_now; 

}


然后用定时器中断,每20ms去执行一个key_scan()函数。

关键字:按键扫描  按键处理  阈值 引用地址:关于按键扫描程序的终极讨论

上一篇:规范的位操作方法
下一篇:关于STM8的用户数据空间读写问题

推荐阅读

在政策和市场的驱动下,工业机器人市场持续快速增长 ,去年全球工业机器人销售量已超过38万台,增长速度达到30%之高。工业机器人已被视为智能制造转型的核心技术之一,并在逐步渗透到各行各业,全面引发了一轮新的变革。目前,中国已经成为全球最大的机器人市场,并引起了全球机器人厂商的高度关注。在近日上海举办的第二十届中国国际工业博览会上,国内...
(文章来源:中科罗伯特机器人学院) 工业机器人最常见的就是在汽车电子一类的行业中,不久前,国产的3D缝纫机器人研发成功。该机器人打破了国外企业的垄断,让我国汽车内饰缝纫环节进入到低成本的自动化的时代。这款机器人还可以进行一些复合材料的缝纫,对我国航空航天事业的发展也带来了重要的价值。 在全球不少服装企业都在引进“机器人”,机器...
  1、ARM既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。  2、ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,而是转让设计许可,由合作公司生产各具特色的芯片。  3、ARM处理器的内核是统一的,由ARM公司提供,而片内部件则是多样的,由各大半导体...
  磁翻板液位计在各种槽、罐、塔等设备的介质液位检测方面有着广泛地应用。磁翻板液位计一般由显示面板、浮筒以及磁浮子等构成,浮筒内设有磁浮子,且该磁浮子本身直接浮于液面上,该浮筒外设有翻片显示面板,显示面板内设有磁性翻片,该翻片显示面板的磁性翻片和该磁浮子磁性耦合,进而指示液位的实际高度。传统磁翻板液位计的缺陷及结构改进的必要性 ...

史海拾趣

问答坊 | AI 解惑

用CH36x通过Boot-ROM扩展BIOS的方案

用CH36x通过Boot-ROM扩展BIOS的方案…

查看全部问答∨

C51按键程序设计

按键程序设计,可以处理加速键、一键多功能等情况 后面有P1口行列式键盘程序实例 设计按键程序的思路 1、一般都不在键盘程序中延时,而是通过隔一段时间调用(比如10毫秒)来扫描按键,以尽量释放CPU资源; 2、所有键盘程序基本上都是一个模 ...…

查看全部问答∨

工业MP3焊接历程1-焊接遇到一个小问题

我在焊接的时候发现u2的30和31脚是在一根线上,是不是焊接时候焊接连线了呢?经过问soso,soso又问了古道热肠,原来是一根线上的。但是呢在原图纸中并不是在一根线上,是图纸错还是别的原因呢?图纸我已近标出,现附上。还有视频$(\'swf_PqJ\').inn ...…

查看全部问答∨

IGBT半桥逆变式电火花加工脉冲电源

IGBT半桥逆变式电火花加工脉冲电源…

查看全部问答∨

把CXImage移植到wince6.0上出现严重错误

把CXImage移植到wince6.0上出现的问题 成功编译后,运行却出现严重错误,参考了网上的修改方法, 修改了stack Reserve size和stack Commit Size的大小,程序单独运行没有问题。 但是在重启机器调试过第一遍之后,以后调试都会出现conmanclient2. ...…

查看全部问答∨

问一个EVC开发环境的问题

我有两个机器,都是XP的。 两个机器装EVC+SP4都可以,使用EVC默认模拟器都可以运行。 后来为了运行中文程序,下载了eeworld上sunrain_hjb上传的CHSEmulator_SDK.msi。 (这里感谢一下sunrain_hjb) 两个机器安装以后,一个可以正常使用这个中文 ...…

查看全部问答∨

2008,新年快乐!

                                 希望新的一年,我们能够取得更大的进步,交到更多的朋友!…

查看全部问答∨

SD卡在单片机上的应用

   SD卡在单片机上的应用     SD卡在现在的日常生活与工作中使用非常广泛,时下已经成为最为通用的数据存储卡。在诸如MP3、数码相机等设备上也都采用SD卡作为其存储设备。SD卡之所以得到如此广泛的使用,是因为它价格 ...…

查看全部问答∨

【设计工具】 XILINX ISE 设计视频 与Modelsim 6.5仿真

$(\'swf_n0h\').innerHTML=AC_FL_RunContent(\'width\', \'550\', \'height\', \'400\', \'allowNetworking\', \'internal\', \'allowScriptAccess\', \'never\', \'src\', encodeURI(\'http://player.youku.com/player.php/sid/XMjc5NzM0NTY4/v.sw ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved