色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    3587

    瀏覽量

    129438
  • 定時器
    +關注

    關注

    23

    文章

    3246

    瀏覽量

    114731
  • 狀態機
    +關注

    關注

    2

    文章

    492

    瀏覽量

    27530
  • GPIO
    +關注

    關注

    16

    文章

    1204

    瀏覽量

    52059
  • 按鍵驅動
    +關注

    關注

    0

    文章

    11

    瀏覽量

    7133
收藏 人收藏

    評論

    相關推薦

    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 ?873次閱讀
    基于<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 ?3300次閱讀
    <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>中斷
    主站蜘蛛池模板: 97国产在线播放| 国产视频精品在线偷拍| 午夜影院费试看黄| 久久最新地址获取| 国产成人在线视频免费观看| 一区三区三区不卡| 少妇人妻偷人精品视蜜桃| 老太婆性BBWBBW| 国语对白嫖老妇胖老太| 大陆女人内谢69XXXORG| 伊人久久影视| 亚洲 欧美 国产在线视频| 亚洲精品成A人在线观看| 麻花传媒MD0044视频| 国色天香视频在线社区| 国产 在线 亚洲 欧美 动漫| 757一本到午夜宫| 印度最猛性ⅹxxxxx| 香蕉在线播放| 色女孩综合| 欧美123区| 美女被爽cao免费漫画| 韩日午夜在线资源一区二区| 国产99青草全福视在线| JEALOUSVUE成熟老师APP| 最近中文字幕2019免费版日本| 亚洲欧美日韩中字视频三区| 无限资源在线看影院免费观看 | 狠狠鲁 我喜欢| 国产露脸150部国语对白| 东京热无码中文字幕av专区| 扒开美女嫩bbb| 99在线精品国自产拍| 97国产露脸精品国产麻豆| 正在播放一区二区| 伊伊人成亚洲综合人网| 一本大道手机在线看| 亚洲伊人久久网| 亚洲永久免费视频| 亚洲字幕久久| 伊伊人成亚洲综合人网|