精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

EmbeddedButton嵌入式按鍵驅(qū)動(dòng)設(shè)計(jì)實(shí)現(xiàn)

冬至子 ? 來(lái)源:530china ? 作者:530china ? 2023-08-28 15:47 ? 次閱讀

EmbeddedButton

簡(jiǎn)介

EmbeddedButton是一個(gè)輕量級(jí)簡(jiǎn)單易用的嵌入式按鍵驅(qū)動(dòng)模塊,可無(wú)限拓展按鍵,支持多連擊、長(zhǎng)按、短按長(zhǎng)按等多種按鍵事件;該模塊通過(guò)異步回調(diào)方式來(lái)簡(jiǎn)化程序結(jié)構(gòu),根據(jù)幾個(gè)簡(jiǎn)單原則完成了整個(gè)代碼邏輯的支撐。

使用方法

1.定義按鍵實(shí)體

struct button_obj_t button1;

2.建立鍵值映射表(設(shè)置回調(diào)事件)

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.初始化按鍵對(duì)象,參數(shù)含義分別為

按鍵實(shí)體
綁定按鍵的GPIO電平讀取接口read_button1_pin()
設(shè)置有效觸發(fā)電平
按鍵ID
鍵值映射表
鍵值映射表大小
button_init(&button1, read_button1_pin, 0, 0, button1_map, ARRAY_SIZE(button1_map));

4.啟動(dòng)按鍵

button_start(&button1);
5.設(shè)置一個(gè)5ms間隔的定時(shí)器循環(huán)調(diào)用按鍵后臺(tái)處理函數(shù)

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

特性

1.依靠簡(jiǎn)單幾個(gè)原則,支持起整個(gè)按鍵判斷邏輯

只要鍵值非零,時(shí)間tick++
只要按鍵狀態(tài)發(fā)生變化,改變一次鍵值(__append_bit()),tick時(shí)間清零(確保tick為按下或抬起的時(shí)間)
以tick時(shí)間的長(zhǎng)短及按鍵抬起作為一次狀態(tài)結(jié)束的判斷依據(jù),可以很好的實(shí)現(xiàn)短按長(zhǎng)按等操作;

2.使用C語(yǔ)言實(shí)現(xiàn),巧妙利用位運(yùn)算來(lái)實(shí)現(xiàn)每個(gè)按鍵鍵值的二進(jìn)制記錄表示,1代表按下,0代表松開(kāi)

1.jpg

3.利用數(shù)據(jù)驅(qū)動(dòng)思想完成對(duì)應(yīng)按鍵事件的調(diào)用:

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.基于面向?qū)ο蠓绞皆O(shè)計(jì)思路,每個(gè)按鍵對(duì)象單獨(dú)用一份數(shù)據(jù)結(jié)構(gòu)管理:

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)
{}
}

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3568

    瀏覽量

    129234
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3240

    瀏覽量

    114477
  • 狀態(tài)機(jī)
    +關(guān)注

    關(guān)注

    2

    文章

    492

    瀏覽量

    27478
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1196

    瀏覽量

    51919
  • 按鍵驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7126
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    EmbeddedButton嵌入式按鍵處理框架

    EmbeddedButton嵌入式按鍵處理框架 項(xiàng)目鏈接 ? 簡(jiǎn)介 EmbeddedButton是一個(gè)輕量級(jí)簡(jiǎn)單易用的嵌入式
    發(fā)表于 08-08 00:15

    嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的實(shí)現(xiàn)原理是什么?

    嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的結(jié)構(gòu)是如何構(gòu)成的?嵌入式Linux網(wǎng)絡(luò)驅(qū)動(dòng)程序的實(shí)現(xiàn)原理是什么?如何將設(shè)備
    發(fā)表于 06-04 06:25

    如何去實(shí)現(xiàn)嵌入式LINUX驅(qū)動(dòng)的軟件代碼呢

    如何對(duì)嵌入式LINUX驅(qū)動(dòng)的硬件信息進(jìn)行配置呢?如何去實(shí)現(xiàn)嵌入式LINUX驅(qū)動(dòng)的軟件代碼呢?
    發(fā)表于 12-24 07:31

    嵌入式loader下PCIe網(wǎng)卡驅(qū)動(dòng)設(shè)計(jì)與實(shí)現(xiàn)

    某些嵌入式系統(tǒng)需要在Bootloader中驅(qū)動(dòng)網(wǎng)卡完成特定的網(wǎng)絡(luò)功能。本文針對(duì)嵌入式系統(tǒng)存儲(chǔ)容量有限的特點(diǎn),提出了PCIe類(lèi)網(wǎng)卡簡(jiǎn)化驅(qū)動(dòng)模型,并給出一個(gè)具體
    發(fā)表于 06-16 10:54 ?41次下載

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

    描述了基于嵌入式Linux的字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程。以電機(jī)、數(shù)碼管、串口和mini鍵盤(pán)的驅(qū)動(dòng)設(shè)計(jì)為例,詳細(xì)闡述了嵌入式linu
    發(fā)表于 02-23 15:45 ?24次下載

    嵌入式Linux下PCSC驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)

    本文分析了PCSC驅(qū)動(dòng)的體系結(jié)構(gòu),針對(duì)嵌入式Linux平臺(tái)的基本特征,設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)基于嵌入式Linux的PCSC驅(qū)動(dòng)程序,
    發(fā)表于 02-24 11:23 ?46次下載

    嵌入式Linux字符設(shè)備驅(qū)動(dòng)的設(shè)計(jì)與應(yīng)用

    描述了基于嵌入式Linux的字符設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)方法和實(shí)現(xiàn)過(guò)程。以電機(jī)、數(shù)碼管、串口和mini鍵盤(pán)的驅(qū)動(dòng)設(shè)計(jì)為例,詳細(xì)闡述了嵌入式linu
    發(fā)表于 07-14 17:31 ?31次下載

    基于嵌入式技術(shù)的感應(yīng)按鍵設(shè)計(jì)

    基于Atmel QTouch技術(shù)的嵌入式感應(yīng)按鍵設(shè)計(jì),簡(jiǎn)化了設(shè)計(jì)難度,降低了系統(tǒng)的應(yīng)用成本,節(jié)省了印刷電路板的尺寸空間,系統(tǒng)應(yīng)用穩(wěn)定,可靈活應(yīng)用于各類(lèi)電子產(chǎn)品中
    發(fā)表于 06-02 09:28 ?864次閱讀
    基于<b class='flag-5'>嵌入式</b>技術(shù)的感應(yīng)<b class='flag-5'>按鍵</b>設(shè)計(jì)

    LCD原理與基于嵌入式的LCD驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)

    主要的工作是驅(qū)動(dòng)程序的開(kāi)發(fā)。因此結(jié)合液晶顯示器(LCD) 設(shè)備,本課題研究嵌入式Linux 的LCD 驅(qū)動(dòng)的設(shè)計(jì)與實(shí)現(xiàn)。 本設(shè)計(jì)實(shí)現(xiàn)了LCD
    發(fā)表于 10-19 17:12 ?8次下載
    LCD原理與基于<b class='flag-5'>嵌入式</b>的LCD<b class='flag-5'>驅(qū)動(dòng)</b>的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

    實(shí)現(xiàn)了多鍵齊按和重復(fù)按鍵嵌入式系統(tǒng)鍵盤(pán)驅(qū)動(dòng)設(shè)計(jì)

    隨著電子信息技術(shù)飛速發(fā)展,嵌入式系統(tǒng)構(gòu)成的各種設(shè)備得到了廣泛的應(yīng)用, 嵌入式 Linux是一種開(kāi)放源碼、 軟實(shí)時(shí)、 多任務(wù)的操作系統(tǒng),是開(kāi)發(fā)嵌入式產(chǎn)品的優(yōu)秀操作系統(tǒng)平臺(tái),其中鍵盤(pán)是人機(jī)界面中人類(lèi)監(jiān)控
    發(fā)表于 06-26 10:39 ?3270次閱讀
    <b class='flag-5'>實(shí)現(xiàn)</b>了多鍵齊按和重復(fù)<b class='flag-5'>按鍵</b>的<b class='flag-5'>嵌入式</b>系統(tǒng)鍵盤(pán)<b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)

    基于arm11的嵌入式linux中nrf24l01驅(qū)動(dòng)實(shí)現(xiàn)

    基于arm11的嵌入式linux中nrf24l01驅(qū)動(dòng)實(shí)現(xiàn)(嵌入式開(kāi)發(fā)找哪家)-基于arm11的嵌入式linux中nrf24l01
    發(fā)表于 07-30 14:36 ?15次下載
    基于arm11的<b class='flag-5'>嵌入式</b>linux中nrf24l01<b class='flag-5'>驅(qū)動(dòng)</b>的<b class='flag-5'>實(shí)現(xiàn)</b>

    嵌入式】串口按鍵

    嵌入式】串口按鍵1. 操作內(nèi)容2. 原理解釋3. 操作步驟3.1 編寫(xiě)鍵控制代碼,將代碼編譯為二進(jìn)制文件3.2 安裝 USB 驅(qū)動(dòng)3.3 使用 DNW 軟件下載裸機(jī)程序 uart.bin至
    發(fā)表于 10-19 18:33 ?2次下載
    【<b class='flag-5'>嵌入式</b>】串口<b class='flag-5'>按鍵</b>

    嵌入式按鍵控制 LED

    嵌入式按鍵控制 LED 實(shí)驗(yàn)1. 操作內(nèi)容2. 原理解釋2.1 實(shí)驗(yàn)箱按鍵電路2.2 實(shí)驗(yàn)箱LED電路2.3 寄存器說(shuō)明3. 操作步驟3.1 編寫(xiě)鍵控制3.2 安裝 USB 驅(qū)動(dòng)3
    發(fā)表于 10-20 14:21 ?3次下載
    【<b class='flag-5'>嵌入式</b>】<b class='flag-5'>按鍵</b>控制 LED

    視頻教程-嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā)-嵌入式

    嵌入式Linux驅(qū)動(dòng)開(kāi)發(fā) 10年以上嵌入式軟件開(kāi)發(fā)經(jīng)歷,5年以上嵌入式及物聯(lián)...
    發(fā)表于 11-02 11:36 ?13次下載
    視頻教程-<b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>驅(qū)動(dòng)</b>開(kāi)發(fā)-<b class='flag-5'>嵌入式</b>

    韋東山嵌入式Linux學(xué)習(xí)——012 按鍵中斷

    韋東山嵌入式Linux學(xué)習(xí)——012 按鍵中斷
    發(fā)表于 12-04 17:36 ?10次下載
    韋東山<b class='flag-5'>嵌入式</b>Linux學(xué)習(xí)——012 <b class='flag-5'>按鍵</b>中斷