品牌 资讯 搭配 材料 时尚 热点 行业 首饰 玉石 行情

一个小巧的按键处理模块!

2023-04-26 23:18:04 来源:面包芯语

已支持的键盘

矩阵键盘
单io按键

详细使用说明

key_board.ckey_board.hkey_board_config.h放进key_board文件夹中并包含进你的工程,添加头文件路径。

基础功能移植(以stm32矩阵键盘为例)

首先需要一个可使用的定时器(如果不想使用定时器也可直接放到主循环中,但不推荐,会导致时基不准确),固定为1ms触发一次;


(资料图片)

准备待检测的按键的基本信息,可参考key_board_sample.c文件中的struct key_pin_t结构体,如:

structkey_pin_t{GPIO_TypeDef*port;//按键端口号uint16_tpin;//按键的引脚号GPIO_PinStatevalid;//按键的有效电平(即按键按下时的电平)GPIO_PinStateinvalid;//按键的无效电平(即按键空闲时的电平)/*可添加你的其它参数*/};

定义待检测的按键信息,可参考key_board_sample.c文件中的const struct key_pin_t key_pin_sig[]结构体数组,对应头文件为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的相关信息,可参考key_board_sample.c文件中的const struct key_pin_t key_pin_ctrl[]结构体数组,对应头文件为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},};

实现按键io的电平读取函数,可参考key_board_sample.c文件中的pin_level_get函数,如:

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

如果为矩阵键盘还需要实现按键io的电平写入函数,可参考key_board_sample.c文件中的pin_level_set函数,如:

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及功能结构体struct key_public_sig_t,可参考key_board_sample.c文件中的const struct key_public_sig_t key_public_sig[]结构体数组,对应头文件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),//下面的是因为使用的矩阵键盘而扩展出来的三个按键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及功能结构体struct key_public_ctrl_t,可参考key_board_sample.c文件中的const struct key_public_ctrl_t key_public_ctrl[]结构体数组,对应头文件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函数,如:

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;i

主流程伪代码框架,更多例子参考main_test.c文件:

intmain(void){//初始化硬件io,并注册键盘GPIO_Key_Board_Init();//初始化定时器,用于按键扫描(1ms)init_tmr();for(;;){if(key_check_state(KEY_UP,KEY_RELEASE)){PRINTF("KEY_UPKEY_RELEASE\r\n");}if(key_check_state(KEY_UP,KEY_PRESS)){PRINTF("KEY_UPKEY_PRESS\r\n");}}}//定时器到期回调处理函数voidtmr_irq_callback(void){//调用按键扫描核心函数key_check();}

扩展功能长按的使用

首先确保key_board_config.h文件中宏KEY_LONG_SUPPORT已处于使能状态,并且正确设置了宏KEY_DEFAULT_LONG_TRRIGER_TIME的值;

设置按键功能需要对长按进行检测,如:

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\r\n");}if(key_check_state(KEY_UP,KEY_RELEASE_LONG)){PRINTF("KEY_UPKEY_RELEASE_LONG\r\n");}

扩展功能连按的使用

首先确保key_board_config.h文件中宏KEY_CONTINUOUS_SUPPORT已处于使能状态,并且正确设置了宏KEY_DEFAULT_CONTINUOUS_INIT_TRRIGER_TIMEKEY_DEFAULT_CONTINUOUS_PERIOD_TRRIGER_TIME的值;

设置按键功能需要对连按进行检测,如:

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\r\n");}

扩展功能多击的使用

首先确保key_board_config.h文件中宏KEY_MULTI_SUPPORT已处于使能状态,并且正确设置了宏KEY_DEFAULT_MULTI_INTERVAL_TIME的值;

设置按键功能需要多击进行检测,如:

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\r\n",res);}res=key_check_state(KEY_UP,KEY_RELEASE_MULTI);if(res){PRINTF("KEY_UPKEY_RELEASE_MULTI:%d\r\n",res);}

扩展功能组合状态(同一时间轴)

感谢网友:石玉虎[@shi-yuhu]的反馈,已更正之前错误的使用案例。

使用例程:

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\n");}

扩展功能组合状态(非同一时间轴)

首先确保key_board_config.h文件中宏KEY_COMBINE_SUPPORT已处于使能状态,并且正确设置了宏KEY_DEFAULT_COMBINE_INTERVAL_TIME的值;

使用例程:

//用于保存注册后的组合状态idstaticunsignedinttest_id1,test_id2;//定义要检测的状态conststructkey_combine_ttest_combine1[]={{.id=KEY_UP,.state=KEY_PRESS},{.id=KEY_DOWN,.state=KEY_PRESS_LONG},{.id=KEY_UP,.state=KEY_PRESS},};//注册组合状态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\r\n");}if(key_check_combine_state(test_id2)){PRINTF("combinetest_id2\r\n");}

猜你喜欢:

柔性数组在实际项目中的应用?

干货 | protobuf-c之嵌入式平台使用

C语言、嵌入式重点知识:回调函数

实用 | 10分钟教你搭建一个嵌入式web服务器

在公众号聊天界面回复1024,可获取嵌入式资源;回复m,可查看文章汇总

标签:

相关文章

一个小巧的按键处理模块!

​来源:https: gitee com wei513723 key_boardkey_board介绍key_board用于单片机中的小巧多功能按键支持,

2023-04-26 23:18:04

看热讯:网易成立巴塞罗那工作室 前心灵杀手2首席设计师领导

​网易在巴塞罗那成立了新工作室AnchorPointStudios,并在西雅图设立了办事处,致力于主机和PC平台动作冒险游

2023-04-26 22:25:47

亲民!港女星全身超十万名牌现身地铁,婚后变过亿阔太拒做少奶奶

​照片中看到文咏珊一个人拖着行李箱现身地铁站,并且非常有秩序地上了地铁,上地铁后的文咏珊也是找了个角落

2023-04-26 21:43:50

当前简讯:爱玛科技(603529):爱玛科技关于使用银行承兑汇票等方式支付募投项目资金并以募集资金等额置换

​证券代码:603529证券简称:爱玛科技公告编号:2023-044转债代码:113666转债简称:爱玛转债

2023-04-26 21:10:49

体彩回应小球悬浮空中静电导致|当前快播

​26日,中国体彩客服回应,小球悬浮是静电导致的,开奖结果真实有效。该工作人员表示:“摇奖完成后,这个摇奖球

2023-04-26 20:03:20

中关村2022年营收20.6亿元 归母净亏损0.43 亿元-报道

​观点网讯:4月26日,北京中关村(000931)科技发展(控股)股份有限公司公布2022年年报。观点新媒体了解,202

2023-04-26 19:34:34

今日要闻!第三代长安CS75PLUS上市,产品力再进阶,12.49万元起

​4月26日,长安第三代CS75PLUS上市发布,共发布5款车型,售价12 49万-14 99万。长安CS75系列自2014年上市至

2023-04-26 19:04:41

【天天播资讯】江苏省水稻集中育秧现场观摩培训会在连云港召开

​农时催人,当下正值水稻育秧的关键时期。24日到25日,全省水稻集中育秧现场观摩培训会在我市召开。中国工程

2023-04-26 18:32:55

国台办回应“蛟龙行动”宣传片发布:守护万里海疆需要强大的人民海军 快看

​国台办回应“蛟龙行动”宣传片发布:守护万里海疆需要强大的人民海军---点蓝色字关注“央视新闻”今天(26

2023-04-26 17:52:56

“儒风浩荡润古今”网络主题宣传活动启动

​4月26日上午,山东济宁、河北衡水、浙江衢州、福建南平在济宁市共同启动“儒风浩荡润古今”网络主题宣传活

2023-04-26 17:21:19

即时焦点:梦见自己剃光头是什么意思_梦见自己剃光头预示着什么

​欢迎观看本篇文章,小柴来为大家解答以上问题。梦见自己剃光头是什么意思,梦见自己剃光头预示着什么很多人

2023-04-26 17:01:54

深圳高速公路股份将于7月15日派发末期股息每股0.462元|环球热消息

​热点栏目。自选股数据中心行情中心资金流向模拟交易。炒股开户享福利,送投顾服务60天体验权,一对一指导服

2023-04-26 16:41:31

失业金领取期限计算方法 领取失业金对以后养老金有什么影响?-前沿资讯

​领取失业金需要什么手续?领取失业金后有什么影响?失业金领取期限如何计算接下来跟社保网小编一起来看看最

2023-04-26 16:16:53

2023年自考《思修》必背论述题(30)

​2023年自考《思修》必背论述题(30)由自学考试栏目提供,查找更多2023年自考《思修》必背论述题(30)请访

2023-04-26 15:37:43

书写汉字之美 传承经典文化--文峰区小营小学汉字书写大赛

​为弘扬中国优秀文化传统艺术,培养学生规范书写汉字的意识,营造书香校园的建设氛围,4月26日上午,文峰区

2023-04-26 15:19:54

要闻速递:A股异动丨庞大集团(601258.SH)跌停 审计机构称其持续经营存在重大不确定性

​格隆汇4月26日丨庞大集团(601258 SH)跌停,报0 86元,暂成交2 66亿元,最新市值88亿元。庞大集团公告,4月2

2023-04-26 15:00:50

通讯!倒计时1天!抖音520好礼季招商大会带你抓住「甜蜜经济」

​5月将至,520浪漫经济逐渐开始吸引了一波新的消费关注。从不易出错的大牌口红,到气味迷人的小众香氛;从外

2023-04-26 14:05:38

世界观点:亏损3.7亿元,年报被“非标”面临“戴帽”,鞋王奥康国际何以落寞?

​亏损3 7亿元,年报被“非标”面临“戴帽”,鞋王奥康国际何以落寞?,安踏,彪马,李宁,年报,王振滔,奥康国际

2023-04-26 13:52:59

第三批假冒中央企业名单公布,共295家_环球即时看

​据“国资小新”微信公众号消息,近期,部分中央企业对外公告了一批假冒国企名单,明确有关公司及其下设各级

2023-04-26 13:02:46

热点聚焦:肥强有料|G3深度复盘:巨星闪耀背后,湖人灰熊的调整与博弈

​肥强有料|G3深度复盘:巨星闪耀背后,湖人灰熊的调整与博弈

2023-04-26 12:28:36

2023山西省面向司法行政系统所属院校司法行政警察类专业毕业生考试录用公务员体能测评公告

​根据《2023年度面向司法行政系统所属院校司法行政警察类专业毕业生考试录用公务员工作实施方案》,现将体能

2023-04-26 12:10:33

惟愿与唯愿的区别_唯与惟的区别-每日快讯

​1、“惟”和“唯”的区别:字意不同“唯”一般表示应答,集中心思于一点;“惟”的意思“仅”。2、2、偏旁

2023-04-26 12:00:27

微头条丨047期程成双色球预测奖号:六码蓝球参考

​本文把16个蓝球号码划分为三个区间:01-05为第一区间06-11为第二区间12-16为第三区间福彩双色球第2023046期

2023-04-26 11:14:36

五香卤猪蹄的做法大全_卤猪蹄的做法大全

​1、做法一猪蹄450克,花生38克,香料1包,香菜少许。2、味精1 6茶匙,冰糖19克,酱油1大匙,海山酱1 4茶匙。3

2023-04-26 10:54:21

【新要闻】浙农股份:公司将在4月27日披露2022年度报告,相关业绩情况届时请关注查询定期报告

​浙农股份(002758)04月26日在投资者关系平台上答复了投资者关心的问题。

2023-04-26 10:32:41

兔子喝水吗为何我喂兔子不喝水_兔子喝水吗_环球观速讯

​1、喂兔粮的兔子要多喂水。2、大多数兔友都会选择喂兔粮。兔粮有一个很大的优点就是排泄时不臭(众所周知,

2023-04-26 10:14:41

今日最新!4月26日专用设备板块涨幅达2%

​4月26日9点58分,专用设备板块指数报2009 288点,涨幅达2%,成交87 74亿元,换手率0 49%。板块个股中,涨幅

2023-04-26 10:01:11

天天观天下!中国数据创新应用与合作推动可持续发展

​中国不断强化数字创新应用,加快推进数字化转型,推动数字技术融入经济社会发展各领域和全过程。正在杭州举

2023-04-26 09:16:13

硕世生物:4月25日融券卖出5397股,融资融券余额1.88亿元|每日消息

​4月25日,硕世生物(688399)融资买入642 1万元,融资偿还821 23万元,融资净卖出179 13万元,融资余额1 86

2023-04-26 09:03:53

环球速递!岩石股份:4月25日融资买入840.23万元,融资融券余额5602.04万元

​4月25日,岩石股份(600696)融资买入840 23万元,融资偿还305 82万元,融资净买入534 4万元,融资余额5404 13万元。

2023-04-26 08:10:20