历史上的今天
返回首页

历史上的今天

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

正在发生

2020年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()函数。

推荐阅读

史海拾趣

帝特(DTECH)公司的发展小趣事

面对日益激烈的市场竞争和不断变化的市场需求,帝特始终坚持创新驱动的发展战略。公司不断投入研发资源,加强技术创新和产品升级,力求在保持传统业务优势的同时,开拓新的增长点。此外,帝特还积极布局电子专用材料项目,加强半导体芯片封装浆料研发推广,进一步优化产业结构,提升公司的综合竞争力。

以上五个故事概述了帝特(DTECH)公司在电子行业发展的主要历程和关键节点,展现了公司从创立到成长为行业领军企业的艰辛与辉煌。

HM International公司的发展小趣事

2007年,帝特成功获得迪士尼形象授权(泰国),这一里程碑事件标志着帝特品牌在国际市场上的认可度和影响力得到了显著提升。随后,帝特又获得了国内悠嘻猴授权,进一步丰富了其产品线。2008年,帝特荣获“守合同、重信用企业”荣誉称号,这一荣誉不仅是对帝特过去努力的肯定,也为公司的未来发展奠定了坚实基础。

Changzhou Galaxy Century Microelectronics Co.,Ltd公司的发展小趣事

随着技术实力的不断提升,银河微电开始积极拓展市场。公司深入分析市场需求,针对不同行业和领域的特点,推出了定制化的产品解决方案。同时,银河微电还加大了营销力度,通过参加行业展会、举办技术研讨会等方式,与潜在客户建立联系,推动产品销售。在市场的不断拓展中,银河微电实现了跨越式发展,市场份额逐年提升。

晨晶电子(Chenjing Electronics)公司的发展小趣事

随着国内市场的不断饱和,晨晶电子积极寻求海外市场的发展机遇。公司凭借优质的产品和服务,成功打开了国际市场的大门。通过与国外客户的深入合作,晨晶电子的产品逐渐走向世界,其品牌影响力也日益增强。同时,公司还积极参与国际电子行业的交流与合作,不断提升自身的国际竞争力。

成都芯进(CrossChip)公司的发展小趣事

随着技术的不断积累和市场的逐步拓展,成都芯进电子逐渐在磁传感器芯片领域崭露头角。他们不仅实现了霍尔效应和磁阻效应磁传感器芯片的量产,还成功研发了电流传感器芯片、电机驱动芯片和电源管理芯片等系列产品。这些产品的推出,不仅丰富了公司的产品线,也进一步提升了公司的市场竞争力。

ACE [ACE Technology Co., Ltd.]公司的发展小趣事

2023年6月,成都芯进电子宣布完成超1亿元A轮融资。这一轮融资的成功,不仅为公司的发展提供了充足的资金保障,也吸引了更多知名产业机构和投资基金的关注。公司借此机会扩大了研发团队和生产规模,进一步提升了产品的研发和生产能力。

问答坊 | AI 解惑

51定时器计算工具

计算定时器初始值的一款小工具…

查看全部问答>

用Nokia 3310 液晶自制温度计

想像一下,如果有这么一个“裸体”温度计,就放在自己家里的书柜上,等朋友来了,一定会吸引不少眼光,你也可以借机炫耀一番。 不过放在家里的话,有可能曝光率不够高,那我们就随身携带好了,就像劳力士一样,经常“不经意”的掏出来看看:P ...…

查看全部问答>

大家一起晒晒示波器的美图吧~~~~

做个东西,就要做的精美,没有外表怎么成? 咱们可以晒晒示波器的美图,供坛子里做示波器的筒子们学学。 先抛个砖: …

查看全部问答>

FPGA 项目选题-----抛个砖头

1. 基于FPGA的SPWM调制的实现; 2. 基于FPGA的DDS信号发生器的简单实现…

查看全部问答>

挺好的,支持一下,我把我做过的智能家居开源出来!

6月份参加了比赛,拿了个三等奖,用STM32做的东西,等出差回去把所有东西开源出来,给大家一个参考   包括:   无线模块  红外通信 GPRS短信 屏幕驱动 vs1003驱动等等…

查看全部问答>

PlatForm Builder 5.0 难道就是Windows CE 5.0 ?

如题,PlatForm Builder 5.0难道就是Windows CE 5.0? 我在电驴上看PlatForm Builder 5.0有2.6G大,但是这个源已经不全了。 http://board.verycd.com/t252175.html 但是微软 http://www.microsoft.com/downloads/details.aspx?familyid=486E825 ...…

查看全部问答>

求助大侠推荐模拟下变频器

求助大侠给推荐一片模拟下变频芯片,rf在170~240mhz,if为38mhz …

查看全部问答>

怎样设置ivt bluesoleil蓝牙局域网?

网线做的局域网我是能设的,但是想用蓝牙做,怎么设都不行,请教啦,…

查看全部问答>

wince只实现PPPoE拨号的问题

我已经加了Dial Up Networking (RAS/PPP) 的支持,wince可以建立PPPoE拨号了,但是每次拨号时候都提示“PPPoE访问集中器无响应”。 请问是怎么回事情?要怎么样才能拨号,麻烦兄弟们指点一下。 谢谢了。…

查看全部问答>