0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

EmbeddedButton嵌入式按键驱动设计实现

冬至子 来源:530china 作者:530china 2023-08-28 15:47 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

EmbeddedButton

简介

EmbeddedButton是一个轻量级简单易用的嵌入式按键驱动模块,可无限拓展按键,支持多连击、长按、短按长按等多种按键事件;该模块通过异步回调方式来简化程序结构,根据几个简单原则完成了整个代码逻辑的支撑。

使用方法

1.定义按键实体

struct button_obj_t button1;

2.建立键值映射表(设置回调事件)

const key_value_map_t button1_map[] =
{
{
.key_value = SINGLE_CLICK_KV,
.kv_func_cb = single_press_handle
},
{
.key_value = LONG_PRESEE_START,
.kv_func_cb = long_press_handle
},
{
.key_value = SINGLE_CLICK_THEN_LONG_PRESS_KV,
.kv_func_cb = single_press_then_long_press_handle
},
};

3.初始化按键对象,参数含义分别为

按键实体
绑定按键的GPIO电平读取接口read_button1_pin()
设置有效触发电平
按键ID
键值映射表
键值映射表大小
button_init(&button1, read_button1_pin, 0, 0, button1_map, ARRAY_SIZE(button1_map));

4.启动按键

button_start(&button1);
5.设置一个5ms间隔的定时器循环调用按键后台处理函数

while(1) {
...
if(timer_ticks == 5) {
timer_ticks = 0;
button_ticks();
}
}

特性

1.依靠简单几个原则,支持起整个按键判断逻辑

只要键值非零,时间tick++
只要按键状态发生变化,改变一次键值(__append_bit()),tick时间清零(确保tick为按下或抬起的时间)
以tick时间的长短及按键抬起作为一次状态结束的判断依据,可以很好的实现短按长按等操作;

2.使用C语言实现,巧妙利用位运算来实现每个按键键值的二进制记录表示,1代表按下,0代表松开

1.jpg

3.利用数据驱动思想完成对应按键事件的调用:

typedef struct {
key_value_type_t key_value;
void ( kv_func_cb)(void );
} key_value_map_t;
const key_value_map_t button1_map[] =
{
{
.key_value = SINGLE_CLICK_KV,
.kv_func_cb = single_press_handle
},
{
.key_value = LONG_PRESEE_START,
.kv_func_cb = long_press_handle
},
{
.key_value = SINGLE_CLICK_THEN_LONG_PRESS_KV,
.kv_func_cb = single_press_then_long_press_handle
},
};
for(size_t i = 0; i < button->map_size; i++) {
if((button->map_ptr[i].key_value == button->key_value)
&& (button->map_ptr[i].kv_func_cb))
{
button->map_ptr[i].kv_func_cb(button);
}
}

4.基于面向对象方式设计思路,每个按键对象单独用一份数据结构管理:

typedef struct button_obj_t {
uint8_t debounce_cnt : 4;
uint8_t active_level : 1;
uint8_t read_level : 1;
uint8_t read_level_update : 1;
uint8_t event_analyze_en : 1;
uint8_t id;
uint16_t ticks;
state_bits_type_t state_bits;
key_value_type_t key_value;
uint8_t (* read_button_func_ptr)(uint8_t button_id );
const key_value_map_t map_ptr;
size_t map_size;
struct button_obj_t
next;
}button_obj_t;
Examples
#include "embedded_button.h"
struct button_obj_t button1;
uint8_t read_button_pin(uint8_t button_id)
{
// you can share the GPIO read function with multiple Buttons
switch(button_id)
{
case 0:
return get_button1_value(); //Require self implementation
break;
default:
return 0;
break;
}
return 0;
}
void single_click_handle(void* btn)
{
//do something...
printf("/ single click /rn");
}
void double_click_handle(void* btn)
{
//do something...
printf("/ double click /rn");
}
void long_press_handle(void* btn)
{
//do something...
printf("/ long press /rn");
}
void single_click_then_long_press_handle(void* btn)
{
//do something...
printf("/ single click and long press /rn");
}
void double_click_then_long_press_handle(void* btn)
{
//do something...
printf("/ double click and long press /rn");
}
const key_value_map_t button1_map[] =
{
{
.key_value = SINGLE_CLICK_KV,
.kv_func_cb = single_click_handle
},
{
.key_value = DOUBLE_CLICK_KV,
.kv_func_cb = double_click_handle
},
{
.key_value = LONG_PRESEE_START,
.kv_func_cb = long_press_handle
},
{
.key_value = SINGLE_CLICK_THEN_LONG_PRESS_KV,
.kv_func_cb = single_click_then_long_press_handle
},
{
.key_value = DOUBLE_CLICK_THEN_LONG_PRESS_KV,
.kv_func_cb = double_click_then_long_press_handle
}
};
...
int main()
{
button_init(&button1, read_button_pin, 0, 0, button1_map, ARRAY_SIZE(button1_map));
button_start(&button1);
//make the timer invoking the button_ticks() interval 5ms.
//This function is implemented by yourself.
__timer_start(button_ticks, 0, 5);
while(1)
{}
}

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3716

    浏览量

    133070
  • 定时器
    +关注

    关注

    23

    文章

    3360

    浏览量

    121707
  • 状态机
    +关注

    关注

    2

    文章

    497

    浏览量

    28840
  • GPIO
    +关注

    关注

    16

    文章

    1313

    浏览量

    55698
  • 按键驱动
    +关注

    关注

    0

    文章

    11

    浏览量

    7306
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    EmbeddedButton嵌入式按键处理框架

    EmbeddedButton嵌入式按键处理框架 项目链接 ? 简介 EmbeddedButton是一个轻量级简单易用的嵌入式
    发表于 08-08 00:15

    嵌入式Linux网络驱动程序的实现原理是什么?

    嵌入式Linux网络驱动程序的结构是如何构成的?嵌入式Linux网络驱动程序的实现原理是什么?如何将设备
    发表于 06-04 06:25

    如何去实现嵌入式LINUX驱动的软件代码呢

    如何对嵌入式LINUX驱动的硬件信息进行配置呢?如何去实现嵌入式LINUX驱动的软件代码呢?
    发表于 12-24 07:31

    嵌入式loader下PCIe网卡驱动设计与实现

    某些嵌入式系统需要在Bootloader中驱动网卡完成特定的网络功能。本文针对嵌入式系统存储容量有限的特点,提出了PCIe类网卡简化驱动模型,并给出一个具体
    发表于 06-16 10:54 41次下载

    嵌入式Linux字符设备驱动的设计与应用

    描述了基于嵌入式Linux的字符设备驱动程序的设计方法和实现过程。以电机、数码管、串口和mini键盘的驱动设计为例,详细阐述了嵌入式linu
    发表于 02-23 15:45 24次下载

    嵌入式Linux下PCSC驱动的设计与实现

    本文分析了PCSC驱动的体系结构,针对嵌入式Linux平台的基本特征,设计并实现了一个基于嵌入式Linux的PCSC驱动程序,
    发表于 02-24 11:23 46次下载

    嵌入式Linux字符设备驱动的设计与应用

    描述了基于嵌入式Linux的字符设备驱动程序的设计方法和实现过程。以电机、数码管、串口和mini键盘的驱动设计为例,详细阐述了嵌入式linu
    发表于 07-14 17:31 31次下载

    基于嵌入式技术的感应按键设计

    基于Atmel QTouch技术的嵌入式感应按键设计,简化了设计难度,降低了系统的应用成本,节省了印刷电路板的尺寸空间,系统应用稳定,可灵活应用于各类电子产品中
    发表于 06-02 09:28 1073次阅读
    基于<b class='flag-5'>嵌入式</b>技术的感应<b class='flag-5'>按键</b>设计

    LCD原理与基于嵌入式的LCD驱动的设计与实现

    主要的工作是驱动程序的开发。因此结合液晶显示器(LCD) 设备,本课题研究嵌入式Linux 的LCD 驱动的设计与实现。 本设计实现了LCD
    发表于 10-19 17:12 8次下载
    LCD原理与基于<b class='flag-5'>嵌入式</b>的LCD<b class='flag-5'>驱动</b>的设计与<b class='flag-5'>实现</b>

    实现了多键齐按和重复按键嵌入式系统键盘驱动设计

    随着电子信息技术飞速发展,嵌入式系统构成的各种设备得到了广泛的应用, 嵌入式 Linux是一种开放源码、 软实时、 多任务的操作系统,是开发嵌入式产品的优秀操作系统平台,其中键盘是人机界面中人类监控
    发表于 06-26 10:39 3718次阅读
    <b class='flag-5'>实现</b>了多键齐按和重复<b class='flag-5'>按键</b>的<b class='flag-5'>嵌入式</b>系统键盘<b class='flag-5'>驱动</b>设计

    基于arm11的嵌入式linux中nrf24l01驱动实现

    基于arm11的嵌入式linux中nrf24l01驱动实现(嵌入式开发找哪家)-基于arm11的嵌入式linux中nrf24l01
    发表于 07-30 14:36 15次下载
    基于arm11的<b class='flag-5'>嵌入式</b>linux中nrf24l01<b class='flag-5'>驱动</b>的<b class='flag-5'>实现</b>

    嵌入式】串口按键

    嵌入式】串口按键1. 操作内容2. 原理解释3. 操作步骤3.1 编写键控制代码,将代码编译为二进制文件3.2 安装 USB 驱动3.3 使用 DNW 软件下载裸机程序 uart.bin至
    发表于 10-19 18:33 2次下载
    【<b class='flag-5'>嵌入式</b>】串口<b class='flag-5'>按键</b>

    嵌入式按键控制 LED

    嵌入式按键控制 LED 实验1. 操作内容2. 原理解释2.1 实验箱按键电路2.2 实验箱LED电路2.3 寄存器说明3. 操作步骤3.1 编写键控制3.2 安装 USB 驱动3
    发表于 10-20 14:21 3次下载
    【<b class='flag-5'>嵌入式</b>】<b class='flag-5'>按键</b>控制 LED

    视频教程-嵌入式Linux驱动开发-嵌入式

    嵌入式Linux驱动开发 10年以上嵌入式软件开发经历,5年以上嵌入式及物联...
    发表于 11-02 11:36 13次下载
    视频教程-<b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>驱动</b>开发-<b class='flag-5'>嵌入式</b>

    韦东山嵌入式Linux学习——012 按键中断

    韦东山嵌入式Linux学习——012 按键中断
    发表于 12-04 17:36 10次下载
    韦东山<b class='flag-5'>嵌入式</b>Linux学习——012 <b class='flag-5'>按键</b>中断