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

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

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

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

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

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

EmbeddedButton

簡介

EmbeddedButton是一個(gè)輕量級簡單易用的嵌入式按鍵驅(qū)動模塊,可無限拓展按鍵,支持多連擊、長按、短按長按等多種按鍵事件;該模塊通過異步回調(diào)方式來簡化程序結(jié)構(gòu),根據(jù)幾個(gè)簡單原則完成了整個(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.初始化按鍵對象,參數(shù)含義分別為

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

4.啟動按鍵

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

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

特性

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

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

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

1.jpg

3.利用數(shù)據(jù)驅(qū)動思想完成對應(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è)按鍵對象單獨(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)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3618

    瀏覽量

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

    關(guān)注

    23

    文章

    3255

    瀏覽量

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

    關(guān)注

    2

    文章

    492

    瀏覽量

    27615
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1216

    瀏覽量

    52274
  • 按鍵驅(qū)動
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7159
收藏 人收藏

    評論

    相關(guān)推薦

    EmbeddedButton嵌入式按鍵處理框架

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    主要的工作是驅(qū)動程序的開發(fā)。因此結(jié)合液晶顯示器(LCD) 設(shè)備,本課題研究嵌入式Linux 的LCD 驅(qū)動的設(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ū)動</b>的設(shè)計(jì)與<b class='flag-5'>實(shí)現(xiàn)</b>

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

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

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

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

    嵌入式】串口按鍵

    嵌入式】串口按鍵1. 操作內(nèi)容2. 原理解釋3. 操作步驟3.1 編寫鍵控制代碼,將代碼編譯為二進(jìn)制文件3.2 安裝 USB 驅(qū)動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 寄存器說明3. 操作步驟3.1 編寫鍵控制3.2 安裝 USB 驅(qū)動3
    發(fā)表于 10-20 14:21 ?3次下載
    【<b class='flag-5'>嵌入式</b>】<b class='flag-5'>按鍵</b>控制 LED

    視頻教程-嵌入式Linux驅(qū)動開發(fā)-嵌入式

    嵌入式Linux驅(qū)動開發(fā) 10年以上嵌入式軟件開發(fā)經(jīng)歷,5年以上嵌入式及物聯(lián)...
    發(fā)表于 11-02 11:36 ?13次下載
    視頻教程-<b class='flag-5'>嵌入式</b>Linux<b class='flag-5'>驅(qū)動</b>開發(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>中斷
    主站蜘蛛池模板: 国产人在线成免费视频| 777米奇色狠狠俺去啦| 人妻中文字幕乱人伦在线| 凌馨baby| 九九热精品在线| 国产原创中文视频| 国产精品观看视频免费完整版| 成人久久欧美日韩一区二区三区| 91热久久免费精品99| 中文字幕在线视频免费观看| 亚洲在线国产日韩欧美| 亚洲国产AV无码综合在线| 视频成人永久免费视频| 日日干夜夜啪蕉视频| 日韩高清一区二区三区不卡| 人善交XUANWEN200喷水| 日本乱hd高清videos| 日本高清免费一本在线观看| 人人射人人插| 欧美一区二区高清| 欧美亚洲另类热图| 全免费午夜一级毛片| 欧美三级aaa| 欧美最猛性XXXXX肛交| 欧美另类摘花hd| 人妻满熟妇AV无码区国产| 人人干人人插| 色小说在线| 无码毛片内射白浆视频| 亚洲AV精品一区二区三区不卡| 亚洲AV久久久久久久无码| 欧美久久综合性欧美| 青青久久久| 特黄特黄aaaa级毛片免费看| 午夜无码国产理论在线| 亚洲精品视频久久| 中文字幕按摩| couo福利姬图库| 国产成人精品在视频| 国产又黄又硬又粗| 牢记永久免费网址|