注册
登录
电子工程世界-论坛
返回首页
EEWORLD首页
频道
EE大学堂
下载中心
Datasheet
专题
单片机
物联网
汽车电子
嵌入式
手机/便携
模拟电子
家用电子
网络通信
电源管理
工业控制
测试测量
半导体设计/制造
安防电子
传感器
医疗电子
sf116的个人空间
https://home.eeworld.com.cn/space-uid-475983.html
[收藏]
[复制]
[分享]
[RSS]
空间首页
动态
记录
日志
相册
主题
分享
留言板
个人资料
借用开发板
论坛
淘帖
Collection
查看新帖
最新回复
社区活动
联系管理员
我的空间
帖子
日志
收藏
好友
勋章
积分
安全验证
请完成以下验证码
日志
【GE32E231_DIY】-03:按键识别框架
已有 177 次阅读
2019-5-13 17:56
|
个人分类:
模块构架
没有比定时轮询+状态机扫描按键更好的方式。此框架支持短按、短按抬起、长按、长按抬起识别。当然稍作修改还可以添加双击、连击等等各种按键状态识别。
对MCU需求:
1、定时任务:10ms轮询一次。
2、读KEY状态。
大部分MCU都可以采用。
按键扫描部分:
#define KEY_STATE_0 0
#define KEY_STATE_1 1
#define KEY_STATE_2 2
#define KEY_STATE_3 3
#define KEY_STATE_4 4
#define KEY_VALUE_IDLE 0xFE
#define KEY_ENTER 0x20
#define N_KEY KEY_VALUE_IDLE
#define S_KEY_DOWN 1
#define S_KEY_UP 2
#define D_KEY 3
#define L_KEY_DOWN 4
#define L_KEY_UP 5
U8 KeyRead(void)
{
static U8 ucKeyState = KEY_STATE_0;
static U8 ucKeyTime = 0;
U8 ucKeyPress;
U8 ucKeyValue = N_KEY;
if(SET == gpio_input_bit_get(GPIOA, GPIO_PIN_0))
{
ucKeyPress = 0;//Key Down
}
else
{
ucKeyPress = 1;
}
switch (ucKeyState)
{
case KEY_STATE_0:
if (!ucKeyPress)
{
ucKeyState = KEY_STATE_1;
}
break;
case KEY_STATE_1:
if (!ucKeyPress)
{
ucKeyTime = 0;
ucKeyState = KEY_STATE_2;
}
else
{
ucKeyState = KEY_STATE_0;
}
break;
case KEY_STATE_2:
if(ucKeyPress)
{
ucKeyState = KEY_STATE_0;
}
else
{
ucKeyTime++;
if(ucKeyTime == 1)
{
ucKeyValue = S_KEY_DOWN|KEY_ENTER;
ucKeyState = KEY_STATE_3;
}
}
break;
case KEY_STATE_3:
if (ucKeyPress)
{
ucKeyValue = S_KEY_UP|KEY_ENTER;
ucKeyState = KEY_STATE_0;
}
else
{
ucKeyTime++;
if(ucKeyTime >= 100)
{
ucKeyValue = L_KEY_DOWN|KEY_ENTER;
ucKeyState = KEY_STATE_4;
}
}
break;
case KEY_STATE_4:
if (ucKeyPress)
{
ucKeyValue = L_KEY_UP|KEY_ENTER;
ucKeyState = KEY_STATE_0;
}
}
return ucKeyValue;
}
复制代码
按键扫描调用:
void Task_10ms(void)
{
U8 ucKeyValue = N_KEY;
ucKeyValue = KeyRead();
if(ucKeyValue == (S_KEY_DOWN|KEY_ENTER))
{
printf("\r\n S_KEY_DOWN ");
}
else if(ucKeyValue == (S_KEY_UP|KEY_ENTER))
{
printf("\r\n S_KEY_UP ");
}
else if(ucKeyValue == (L_KEY_DOWN|KEY_ENTER))
{
printf("\r\n L_KEY_DOWN ");
}
else if(ucKeyValue == (L_KEY_UP|KEY_ENTER))
{
printf("\r\n L_KEY_UP ");
}
}
复制代码
本文来自论坛,点击查看完整帖子内容。
收藏
邀请
举报
评论 (
0
个评论)
涂鸦板
您需要登录后才可以评论
登录
|
注册
评论
sf116
加为好友
给我留言
打个招呼
发送消息
热门文章
头条资讯
有奖直播 | Microchip适用于CryptoAuthentication系列的可信任平台 12月4日与您相约~
汽车电气化时代,什么样的元器件才能“上车”?
【vscode 】用VSCODE 开发rtthread如何跳转到内核源码
下一个10年,物联网万亿商机何在?
面向计算的USB-C双端口供电解决方案
77,79GHz汽车雷达公司综合调查——雷达系统和芯片
新增数据手册
D38999/24WH55AN
75781-532-60
HW-10-11-TM-D-975-SM
M55342K05W47H0RTR
RC442-100-373-4200
FP5548-2230-DT50Q
热搜器件
S-80847CLY-B2-U
BFC238304564
AXG260144A
XC6116E033MR-G
CD54HCT04F
ECM24DCTH
推荐下载
multisim 12 英文包
ARM7_LPC2131 4个GPIO代码 和 proteus仿真
一对二激光一体传感器使用说明
描述了用汇编语言对dm512信号接受与处理的过程,实现对led灯光控制.rar
LM5072,pdf datasheet (Integrated 100V Power Over Ethernet PD Interfacet)
计算器C#实用
推荐关注
明远智睿RK3588开发板:开启边缘计算新时代
MuJoCo 机械臂物体碰撞、接触检测方式一
[嵌入式Rust修炼营] 初级 任务2:读写Cargo.toml 文件
动手实践任务二 使用fs接口,read等trait打印文本文件的每行数据
明远智睿 SSD2351 开发板:开启创新开发之旅
ICMAN液位检测应用大盘点