在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊

硬件攻城獅 ? 來源:gitee ? 作者:gitee ? 2023-02-17 09:37 ? 次閱讀

key_board介紹

key_board用于單片機(jī)中的小巧多功能按鍵支持,軟件采用了分層的思想,并且做到了與平臺無關(guān),用戶只需要提供按鍵的基本信息和讀寫io電平的函數(shù)即可,非常方便移植,同時(shí)支持多個(gè)矩陣鍵盤及多個(gè)單io控制鍵盤。

目前已實(shí)現(xiàn)按下觸發(fā)、彈起觸發(fā)、長按自動觸發(fā)、長按彈起觸發(fā)、多擊觸發(fā)、連續(xù)觸發(fā)等功能,并且能夠隨意組合(支持狀態(tài)的同一時(shí)間軸和非同一時(shí)間軸),后續(xù)還會添加更多的功能。

使用說明

  1. 初始化相關(guān)的硬件資源。
  2. 提供一個(gè)1ms的定時(shí)器,用于周期性的調(diào)用'key_check'函數(shù)。
  3. 提供按鍵的描述及讀寫io的函數(shù)。
  4. 將鍵盤注冊到系統(tǒng)。
  5. 具體的操作參考提供的stm32例程。
  6. 因?yàn)槌绦蚰J(rèn)使用了堆內(nèi)存,當(dāng)發(fā)現(xiàn)程序運(yùn)行結(jié)果不正常時(shí),嘗試增大你的程序堆空間,或者注冊調(diào)試接口查看原因。
  7. 更詳細(xì)的使用教程見詳細(xì)使用說明或者提供的stm32例程。

已支持的鍵盤

  1. 矩陣鍵盤
55f04004-ae5f-11ed-bfe3-dac502259ad0.jpg矩陣鍵盤
  1. 單io按鍵
5600aa84-ae5f-11ed-bfe3-dac502259ad0.jpg單io按鍵

詳細(xì)使用說明

key_board.ckey_board.hkey_board_config.h放進(jìn)key_board文件夾中并包含進(jìn)你的工程,添加頭文件路徑。

基礎(chǔ)功能移植(以stm32矩陣鍵盤為例)

首先需要一個(gè)可使用的定時(shí)器(如果不想使用定時(shí)器也可直接放到主循環(huán)中,但不推薦,會導(dǎo)致時(shí)基不準(zhǔn)確),固定為1ms觸發(fā)一次;

準(zhǔn)備待檢測的按鍵的基本信息,可參考key_board_sample.c文件中的struct key_pin_t結(jié)構(gòu)體,如:

structkey_pin_t{
GPIO_TypeDef*port;//按鍵端口
uint16_tpin;//按鍵的引腳號
GPIO_PinStatevalid;//按鍵的有效電平(即按鍵按下時(shí)的電平)
GPIO_PinStateinvalid;//按鍵的無效電平(即按鍵空閑時(shí)的電平)
/*
可添加你的其它參數(shù)
*/
};

定義待檢測的按鍵信息,可參考key_board_sample.c文件中的const struct key_pin_t key_pin_sig[]結(jié)構(gòu)體數(shù)組,對應(yīng)頭文件為key_board_sample.h,如:

//全局變量
conststructkey_pin_tkey_pin_sig[]={
{
.port=KEY_PORT_J12,
.pin=KEY_PIN_J12,
.valid=KEY_PRESS_LEVEL_J12,
.invalid=KEY_RELEASE_LEVEL_J12
},
{
.port=KEY_PORT_J34,
.pin=KEY_PIN_J34,
.valid=KEY_PRESS_LEVEL_J34,
.invalid=KEY_RELEASE_LEVEL_J34
},
{
.port=KEY_PORT_J56,
.pin=KEY_PIN_J56,
.valid=KEY_PRESS_LEVEL_J56,
.invalid=KEY_RELEASE_LEVEL_J56
},
};

如果為矩陣鍵盤還需要定義控制io的相關(guān)信息,可參考key_board_sample.c文件中的const struct key_pin_t key_pin_ctrl[]結(jié)構(gòu)體數(shù)組,對應(yīng)頭文件為key_board_sample.h,如:

conststructkey_pin_tkey_pin_ctrl[]={
{
.port=KEY_PORT_J135,
.pin=KEY_PIN_J135,
.valid=KEY_CTL_LINE_ENABLE,
.invalid=KEY_CTL_LINE_DISABLE
},
{
.port=KEY_PORT_J246,
.pin=KEY_PIN_J246,
.valid=KEY_CTL_LINE_ENABLE,
.invalid=KEY_CTL_LINE_DISABLE
},
};

實(shí)現(xiàn)按鍵io的電平讀取函數(shù),可參考key_board_sample.c文件中的pin_level_get函數(shù),如:

staticinlineboolpin_level_get(constvoid*desc)
{
structkey_pin_t*pdesc;

pdesc=(structkey_pin_t*)desc;
returnHAL_GPIO_ReadPin(pdesc->port,pdesc->pin)==pdesc->valid;
}

如果為矩陣鍵盤還需要實(shí)現(xiàn)按鍵io的電平寫入函數(shù),可參考key_board_sample.c文件中的pin_level_set函數(shù),如:

staticinlinevoidpin_level_set(constvoid*desc,boolflag)
{
structkey_pin_t*pdesc;

pdesc=(structkey_pin_t*)desc;
HAL_GPIO_WritePin(pdesc->port,pdesc->pin,flag?pdesc->valid:pdesc->invalid);
}

定義按鍵的id及功能結(jié)構(gòu)體struct key_public_sig_t,可參考key_board_sample.c文件中的const struct key_public_sig_t key_public_sig[]結(jié)構(gòu)體數(shù)組,對應(yīng)頭文件key_board.h,如:

conststructkey_public_sig_tkey_public_sig[]={
KEY_PUBLIC_SIG_DEF(KEY_UP,&key_pin_sig[0],pin_level_get,KEY_FLAG_NONE),
KEY_PUBLIC_SIG_DEF(KEY_LEFT,&key_pin_sig[1],pin_level_get,KEY_FLAG_NONE),
KEY_PUBLIC_SIG_DEF(KEY_DOWN,&key_pin_sig[2],pin_level_get,KEY_FLAG_NONE),
//下面的是因?yàn)槭褂玫木仃囨I盤而擴(kuò)展出來的三個(gè)按鍵
KEY_PUBLIC_SIG_DEF(KEY_ENTER,&key_pin_sig[0],pin_level_get,KEY_FLAG_NONE),
KEY_PUBLIC_SIG_DEF(KEY_RIGHT,&key_pin_sig[1],pin_level_get,KEY_FLAG_NONE),
KEY_PUBLIC_SIG_DEF(KEY_EXIT,&key_pin_sig[2],pin_level_get,KEY_FLAG_NONE),
};

如果為矩陣鍵盤還需要定義控制io的id及功能結(jié)構(gòu)體struct key_public_ctrl_t,可參考key_board_sample.c文件中的const struct key_public_ctrl_t key_public_ctrl[]結(jié)構(gòu)體數(shù)組,對應(yīng)頭文件key_board.h,如:

conststructkey_public_ctrl_tkey_public_ctrl[]={
KEY_PUBLIC_CTRL_DEF(&key_pin_ctrl[0],pin_level_set),
KEY_PUBLIC_CTRL_DEF(&key_pin_ctrl[1],pin_level_set),
};

初始化鍵盤,可參考key_board_sample.c文件中的GPIO_Key_Board_Init函數(shù),如:

voidGPIO_Key_Board_Init(void)
{
//硬件io的初始化
GPIO_InitTypeDefGPIO_InitStruct;
unsignedinti;

RCC_KEY_BOARD_CLK_ENABLE();

GPIO_InitStruct.Pull=GPIO_PULLUP;
GPIO_InitStruct.Mode=GPIO_MODE_INPUT;
for(i=0;ifor(i=0;i//初始化鍵盤
key_board_init();
//注冊鍵盤到系統(tǒng)中(矩陣鍵盤)
key_board_register(KEY_BOARD_MATRIX,key_public_sig,ARRAY_SIZE(key_public_sig),key_public_ctrl,ARRAY_SIZE(key_public_ctrl));
}

主流程偽代碼框架,更多例子參考main_test.c文件:

intmain(void)
{
//初始化硬件io,并注冊鍵盤
GPIO_Key_Board_Init();
//初始化定時(shí)器,用于按鍵掃描(1ms)
init_tmr();

for(;;)
{
if(key_check_state(KEY_UP,KEY_RELEASE))
{
PRINTF("KEY_UPKEY_RELEASE
");
}
if(key_check_state(KEY_UP,KEY_PRESS))
{
PRINTF("KEY_UPKEY_PRESS
");
}
}
}

//定時(shí)器到期回調(diào)處理函數(shù)
voidtmr_irq_callback(void)
{
//調(diào)用按鍵掃描核心函數(shù)
key_check();
}

擴(kuò)展功能長按的使用

首先確保key_board_config.h文件中宏KEY_LONG_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_LONG_TRRIGER_TIME的值;

設(shè)置按鍵功能需要對長按進(jìn)行檢測,如:

KEY_PUBLIC_SIG_DEF(KEY_UP,&key_pin_sig[0],pin_level_get,KEY_FLAG_PRESS_LONG|KEY_FLAG_RELEASE_LONG)

使用例程:

if(key_check_state(KEY_UP,KEY_PRESS_LONG))
{
PRINTF("KEY_UPKEY_PRESS_LONG
");
}
if(key_check_state(KEY_UP,KEY_RELEASE_LONG))
{
PRINTF("KEY_UPKEY_RELEASE_LONG
");
}

擴(kuò)展功能連按的使用

首先確保key_board_config.h文件中宏KEY_CONTINUOUS_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_CONTINUOUS_INIT_TRRIGER_TIMEKEY_DEFAULT_CONTINUOUS_PERIOD_TRRIGER_TIME的值;

設(shè)置按鍵功能需要對連按進(jìn)行檢測,如:

KEY_PUBLIC_SIG_DEF(KEY_UP,&key_pin_sig[0],pin_level_get,KEY_FLAG_PRESS_CONTINUOUS)

使用例程:

if(key_check_state(KEY_UP,KEY_PRESS_CONTINUOUS))
{
PRINTF("KEY_UPKEY_PRESS_CONTINUOUS
");
}

擴(kuò)展功能多擊的使用

首先確保key_board_config.h文件中宏KEY_MULTI_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_MULTI_INTERVAL_TIME的值;

設(shè)置按鍵功能需要多擊進(jìn)行檢測,如:

KEY_PUBLIC_SIG_DEF(KEY_UP,&key_pin_sig[0],pin_level_get,KEY_FLAG_PRESS_MULTI|KEY_FLAG_RELEASE_MULTI)

使用例程:

unsignedintres;
res=key_check_state(KEY_UP,KEY_PRESS_MULTI);
if(res)
{
PRINTF("KEY_UPKEY_PRESS_MULTI:%d
",res);
}
res=key_check_state(KEY_UP,KEY_RELEASE_MULTI);
if(res)
{
PRINTF("KEY_UPKEY_RELEASE_MULTI:%d
",res);
}

擴(kuò)展功能組合狀態(tài)(同一時(shí)間軸)

感謝網(wǎng)友:石玉虎[@shi-yuhu]的反饋,已更正之前錯(cuò)誤的使用案例。

使用例程:

unsignedintkey_down_release_long,key_up_release_long;
key_down_release_long=key_check_state(KEY_DOWN,KEY_RELEASE_LONG);
key_up_release_long=key_check_state(KEY_UP,KEY_RELEASE_LONG);
if(key_down_release_long&&key_up_release_long)
{
PRINTF("KEY_DOWNKEY_RELEASE_LONG&&KEY_UPKEY_RELEASE_LONG
");
}

擴(kuò)展功能組合狀態(tài)(非同一時(shí)間軸)

首先確保key_board_config.h文件中宏KEY_COMBINE_SUPPORT已處于使能狀態(tài),并且正確設(shè)置了宏KEY_DEFAULT_COMBINE_INTERVAL_TIME的值;

使用例程:

//用于保存注冊后的組合狀態(tài)id
staticunsignedinttest_id1,test_id2;

//定義要檢測的狀態(tài)
conststructkey_combine_ttest_combine1[]={
{.id=KEY_UP,.state=KEY_PRESS},
{.id=KEY_DOWN,.state=KEY_PRESS_LONG},
{.id=KEY_UP,.state=KEY_PRESS},
};
//注冊組合狀態(tài)
test_id1=key_combine_register(test_combine1,ARRAY_SIZE(test_combine1));

conststructkey_combine_ttest_combine2[]={
{.id=KEY_UP,.state=KEY_PRESS},
{.id=KEY_DOWN,.state=KEY_PRESS},
{.id=KEY_UP,.state=KEY_PRESS},
{.id=KEY_DOWN,.state=KEY_PRESS},
};
test_id2=key_combine_register(test_combine2,ARRAY_SIZE(test_combine2));

if(key_check_combine_state(test_id1))
{
PRINTF("combinetest_id1
");
}

if(key_check_combine_state(test_id2))
{
PRINTF("combinetest_id2
");
}

審核編輯 :李倩


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

    關(guān)注

    6060

    文章

    44835

    瀏覽量

    645205
  • STM32
    +關(guān)注

    關(guān)注

    2287

    文章

    10988

    瀏覽量

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

    關(guān)注

    23

    文章

    3274

    瀏覽量

    116880
  • 按鍵
    +關(guān)注

    關(guān)注

    4

    文章

    225

    瀏覽量

    57900

原文標(biāo)題:一個(gè)應(yīng)用于單片機(jī)的按鍵處理模塊!

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于單片機(jī)按鍵電路設(shè)計(jì)(1)

    按鍵作為個(gè)輸入模塊,在單片機(jī)開發(fā)板中必不可少,本文來討論按鍵的設(shè)計(jì)方案。本文1500字。下篇文
    的頭像 發(fā)表于 10-31 15:15 ?3315次閱讀
    基于<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>按鍵</b>電路設(shè)計(jì)(1)

    如何制作個(gè)單片機(jī)獨(dú)立按鍵掃描的模塊

    如何制作個(gè)單片機(jī)獨(dú)立按鍵掃描的模塊
    發(fā)表于 02-17 06:38

    單片機(jī)按鍵處理總結(jié)——含程序詳解

    講述幾種常用的按鍵的應(yīng)用及程序處理方法,幫助大家掌握單片機(jī)處理按鍵的方法。
    發(fā)表于 11-10 10:55 ?11次下載

    單片機(jī)按鍵處理框架資料和函數(shù)詳細(xì)說明

    寫過段時(shí)間單片機(jī)程序,也看了單片機(jī)程序,書上的,網(wǎng)上的,基本都是非常原始的讀取按鍵,延時(shí)判斷,這些
    發(fā)表于 09-12 17:23 ?1次下載
    <b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>按鍵</b><b class='flag-5'>處理</b>框架資料和函數(shù)詳細(xì)說明

    分享可應(yīng)用于單片機(jī)的內(nèi)存管理模塊mem_malloc

    本次給大家分享位大佬寫的應(yīng)用于單片機(jī)內(nèi)存管理模塊mem_malloc,這個(gè)mem_malloc的使用不會產(chǎn)生內(nèi)存碎片,可以高效利用單片機(jī)r
    的頭像 發(fā)表于 06-25 08:54 ?3215次閱讀
    分享可<b class='flag-5'>應(yīng)用于</b><b class='flag-5'>單片機(jī)</b>的內(nèi)存管理<b class='flag-5'>模塊</b>mem_malloc

    單片機(jī)按鍵使用程序 (51單片機(jī)

    單片機(jī)獨(dú)立按鍵使用程序 (51單片機(jī))獨(dú)立按鍵單片機(jī)中很重要的
    發(fā)表于 11-11 18:36 ?108次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>使用程序 (51<b class='flag-5'>單片機(jī)</b>)

    51單片機(jī)按鍵檢測--獨(dú)立按鍵與矩陣鍵盤

    按鍵,每個(gè)按鍵對應(yīng)個(gè)IO口,通過循環(huán)或者中斷去檢測,這種方法常用于按鍵個(gè)數(shù)較少得時(shí)候。如果
    發(fā)表于 11-12 11:06 ?17次下載
    51<b class='flag-5'>單片機(jī)</b><b class='flag-5'>按鍵</b>檢測--獨(dú)立<b class='flag-5'>按鍵</b>與矩陣鍵盤

    PIC單片機(jī) 按鍵檢測識別

    目錄按鍵和PIC單片機(jī)按鍵二、按鍵的物理連接與檢測三、PIC16F18854單片機(jī)
    發(fā)表于 11-16 12:36 ?12次下載
    PIC<b class='flag-5'>單片機(jī)</b> <b class='flag-5'>按鍵</b>檢測識別

    基于AT32(STM32)單片機(jī)模塊化代碼之——按鍵代碼模塊

    基于AT32(STM32)單片機(jī)模塊化代碼之按鍵模塊化1.環(huán)境介紹平臺:AT32F415單片機(jī),雅特力公司的AT32系列
    發(fā)表于 11-19 10:06 ?37次下載
    基于AT32(STM32)<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>模塊</b>化代碼之——<b class='flag-5'>按鍵</b>代碼<b class='flag-5'>模塊</b>化

    單片機(jī)學(xué)習(xí)-矩陣按鍵

    目錄矩陣按鍵介紹檢測方法C51例程歡迎加QQ及郵件交流矩陣按鍵介紹 獨(dú)立鍵盤與單片機(jī)連接時(shí),每一個(gè)按鍵都需要
    發(fā)表于 12-31 19:37 ?15次下載
    <b class='flag-5'>單片機(jī)</b>學(xué)習(xí)-矩陣<b class='flag-5'>按鍵</b>

    如何實(shí)現(xiàn)單片機(jī)個(gè)I/O采集多個(gè)按鍵信號?

    如何實(shí)現(xiàn)單片機(jī)個(gè)I/O采集多個(gè)按鍵信號 使用模數(shù)轉(zhuǎn)換(ADC)的特點(diǎn)就可以實(shí)現(xiàn)單片機(jī)
    發(fā)表于 02-11 14:23 ?11次下載
    如何實(shí)現(xiàn)<b class='flag-5'>單片機(jī)</b>用<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>I/O采集多個(gè)<b class='flag-5'>按鍵</b>信號?

    stm32單片機(jī)如何實(shí)現(xiàn)個(gè)按鍵切換兩個(gè)程序?

    ,非常實(shí)用。下面,我們將詳細(xì)介紹如何在STM32單片機(jī)上實(shí)現(xiàn)個(gè)按鍵切換兩個(gè)程序。 、 STM
    的頭像 發(fā)表于 09-14 14:22 ?6726次閱讀

    個(gè)應(yīng)用于單片機(jī)按鍵處理模塊

    個(gè)應(yīng)用于單片機(jī)按鍵處理模塊
    的頭像 發(fā)表于 10-24 16:28 ?952次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>個(gè)</b><b class='flag-5'>應(yīng)用于</b><b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>按鍵</b><b class='flag-5'>處理</b><b class='flag-5'>模塊</b>!

    單片機(jī)按鍵切換模式怎么設(shè)置

    單片機(jī):選擇款合適的單片機(jī)型號,例如常見的8051、STM32等。 按鍵模塊用于實(shí)現(xiàn)
    的頭像 發(fā)表于 12-13 11:07 ?5371次閱讀

    單片機(jī)按鍵切換模式命令

    單片機(jī)按鍵切換模式命令的原理、實(shí)現(xiàn)方法和應(yīng)用場景。 、原理與概述 單片機(jī)系統(tǒng)是由單片機(jī)芯片、外部器件和外圍電路組成的
    的頭像 發(fā)表于 12-15 10:31 ?3852次閱讀
    主站蜘蛛池模板: 天天爱天天干天天 | 国产老头和美女在线观看 | 国产精品情人露脸在线观看 | 大象焦伊人久久综合网色视 | 农村妇女野外一级毛片 | 成人在线色视频 | 一级特黄aa大片 | 美女视频黄a全部免费看小说 | 天天色视频 | 狠狠色狠色综合曰曰 | 夜夜五月天| 男男生子大肚play做到生 | 四虎影视免费看 | 国产成人一级片 | 日韩国产片 | 亚洲欧洲色 | 网站黄色在线观看 | 日本在线亚洲 | 久久999 | 色综合久久中文字幕网 | 日本黄色大片免费观看 | 米奇777色狠狠8888影视 | 一级无毛片 | 永久视频免费 | 麻豆三级在线播放 | swag系列国产精品 | 日韩天天干 | 免费一级大片 | 人人澡人人射 | 四虎国产精品永久地址49 | 狠狠操天天干 | 国产特黄1级毛片 | 日本a级片免费 | 手机在线看片国产日韩生活片 | 在线高清国产 | 一级一级女人18毛片 | 欧美三级在线视频 | 曰本又色又爽又黄三级视频 | 欧美色丁香 | 波多野结衣在线观看一区二区三区 | 成人国产一区二区 |