这个设计思想能启蒙你很多年,嵌入式裸机按键扫描
摘要:本文目的是讲述一个按键扫描处理的面向对象开发的设计思想,适用于裸机开发,通过按键扫描,检测到按键是否按下,松开等状态,并将该状态通过其他形式反馈给其他模块进行处理。初次使用按键时,最常用的办法就是如以下代码一样,硬延时抖动滤波,等待确认后做相应的处理。
void KEY_Scan(void)
{
if(KEY0 == 0)
{
delay_ms(10);//去抖动
if(KEY0 == 0)
{
//处理想做的事情
}
}
}
以上方式最大的弊端就是硬延时去抖动,极大的浪费了 CPU资源,对熟悉阻塞式和非阻塞式程序开发的人来说,这种写法是十分不可取的;程序框架稍微好的,会摒弃此种做法,采用分时调度(时间片论法)的形式按时(比如10ms)调用该函数,通过一定累计次数确定按键是否有动作,并处理相关数据。
///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///
正文开始:
一、设计需求
软件功能需求
支持六种状态:没有按下、首次按下、短按持续按下、短按松开、长按持续按下和长按松开,其中后两种能够使能或禁。
支持独立设置每个按键的模式和时长:短按模式和长按模式(区分短按和长按两种状态),且时长也可独立设置。
支持大局部形式的按键输写,只有满足按键操作为 0和 1两种逻辑状态,如以下几种均支持,且兼容各种形式按键组合:
1、矩形按键:通过多组 I/O识别到对应 key按下;</