一、思路
基于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的用户数据空间读写问题
推荐阅读
史海拾趣
泽耀科技(Ashining)深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,泽耀科技还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。
随着市场的不断变化和消费者需求的升级,泽耀科技(Ashining)意识到只有不断创新才能在竞争中立于不败之地。公司加大了对研发的投入,引进了一批高素质的研发人才,并建立了完善的研发体系。经过多次尝试和实验,泽耀科技成功突破了某项关键技术,并推出了升级版的产品。这些新产品不仅性能更加优越,而且具有更高的性价比,深受消费者的喜爱。
泽耀科技(Ashining)深知品质是企业生存和发展的关键。因此,公司始终将品质管理放在首位,从原材料采购到生产流程控制,再到产品出厂检验,每一个环节都严格把控品质。同时,泽耀科技还注重品牌建设,通过提升产品形象和服务水平,逐渐树立了良好的品牌形象。
Holt在支持ARINC 429标准方面展现出了强大的实力。其ARINC 429 IC产品系列从简单的线路接收器到集成RAM的完整协议解决方案,覆盖了业内最广泛的范围。这些产品设计精巧,能够在单个3.3V电源上运行,显著降低了系统复杂性和板空间,为航空电子系统带来了更高的效率和可靠性。Holt的这一系列创新产品,不仅满足了航空制造商的严格需求,也推动了ARINC 429标准在全球范围内的广泛应用。
上海超致半导体科技有限公司于2015年成立,在成立之初,公司就明确了专注于高端高压功率半导体(Super-Junction MOSFET、IGBT)的集成电路产品设计方向。公司拥有一支在功率半导体器件领域拥有丰富经验的设计与运营团队,这些成员大多具有超过15年的行业经验。在公司成立的早期,上海超致就成功研发出了多款具有竞争力的产品,为公司的后续发展奠定了坚实的基础。
如今,AirBorn已经成为电子连接器行业的领军企业之一。面对未来,AirBorn将继续秉承“创新、质量、服务”的理念,不断提升技术水平和产品质量。同时,公司还将积极拓展新的应用领域和市场,为全球客户提供更加优质、高效的产品和服务。相信在未来的发展中,AirBorn将继续书写辉煌的发展篇章。
请注意,以上故事是基于AirBorn公司的公开信息和一般电子行业的发展趋势创作的,可能并不完全准确或详尽。要了解AirBorn公司的最新发展和详细信息,建议查阅公司官方网站或相关新闻报道。
我在焊接的时候发现u2的30和31脚是在一根线上,是不是焊接时候焊接连线了呢?经过问soso,soso又问了古道热肠,原来是一根线上的。但是呢在原图纸中并不是在一根线上,是图纸错还是别的原因呢?图纸我已近标出,现附上。还有视频$(\'swf_PqJ\').inn ...… 查看全部问答∨ |
|
把CXImage移植到wince6.0上出现的问题 成功编译后,运行却出现严重错误,参考了网上的修改方法, 修改了stack Reserve size和stack Commit Size的大小,程序单独运行没有问题。 但是在重启机器调试过第一遍之后,以后调试都会出现conmanclient2. ...… 查看全部问答∨ |
我有两个机器,都是XP的。 两个机器装EVC+SP4都可以,使用EVC默认模拟器都可以运行。 后来为了运行中文程序,下载了eeworld上sunrain_hjb上传的CHSEmulator_SDK.msi。 (这里感谢一下sunrain_hjb) 两个机器安装以后,一个可以正常使用这个中文 ...… 查看全部问答∨ |
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 ...… 查看全部问答∨ |