一个应用于单片机的按键处理模块_第1页
一个应用于单片机的按键处理模块_第2页
一个应用于单片机的按键处理模块_第3页
一个应用于单片机的按键处理模块_第4页
一个应用于单片机的按键处理模块_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第第页一个应用于单片机的按键处理模块

key_board介绍

key_board用于(单片机)中的小巧多功能按键支持,软件采用了分层的思想,并且做到了与平台无关,用户只需要提供按键的基本信息和读写io电平的函数即可,非常方便移植,同时支持多个矩阵键盘及多个单io控制键盘。

目前已实现按下触发、弹起触发、长按自动触发、长按弹起触发、多击触发、连续触发等功能,并且能够随意组合(支持状态的同一时间轴和非同一时间轴),后续还会添加更多的功能。

使用说明

初始化相关的(硬件)资源。提供一个1ms的(定时器),用于周期性的调用'key_check'函数。提供按键的描述及读写io的函数。将键盘注册到系统。具体的操作参考提供的(stm32)例程。因为程序默认使用了堆内存,当发现程序运行结果不正常时,尝试增大你的程序堆空间,或者注册调试接口查看原因。更详细的使用(教程)见详细使用说明或者提供的stm32例程。已支持的键盘

矩阵键盘矩阵键盘单io按键单io按键详细使用说明

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

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

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

准备待(检测)的按键的基本信息,可参考key_board_sample.c文件中的structkey_(pi)n_t结构体,如:

structkey_pin_t{GPIO_TypeDef*port;//按键端口号uint16_tpin;//按键的引脚号GPIO_PinStatevalid;//按键的有效电平(即按键按下时的电平)GPIO_PinStateinvalid;//按键的无效电平(即按键空闲时的电平)/*可添加你的其它参数*/};定义待检测的按键信息,可参考key_board_sample.c文件中的conststructkey_pin_tkey_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文件中的conststructkey_pin_tkey_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_Re(ad)Pin(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_Wri(te)Pin(pdesc->port,pdesc->pin,flag?pdesc->valid:pdesc->invalid);}定义按键的id及功能结构体structkey_public_sig_t,可参考key_board_sample.c文件中的conststructkey_public_sig_tkey_public_sig[]结构体数组,对应头文件key_board.h,如:

conststructkey_public_sig_tkey_public_sig[]={KEY_PUBLIC_SIG_DEF(KEY_UP,如果为矩阵键盘还需要定义控制io的id及功能结构体structkey_public_ctrl_t,可参考key_board_sample.c文件中的conststructkey_public_ctrl_tkey_public_ctrl[]结构体数组,对应头文件key_board.h,如:

conststructkey_public_ctrl_tkey_public_ctrl[]={KEY_PUBLIC_CTRL_DEF(初始化键盘,可参考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");}if(key_check_state(KEY_UP,KEY_PRESS)){PRINTF("KEY_UPKEY_PRESS");}}}//定时器到期回调处理函数voidtmr_irq_callback(void){//调用按键扫描核心函数key_check();}扩展功能长按的使用

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

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

KEY_PUBLIC_SIG_DEF(KEY_UP,}if(key_check_state(KEY_UP,KEY_RELEASE_LONG)){PRINTF("KEY_UPKEY_RELEASE_LONG");}扩展功能连按的使用

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

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

KEY_PUBLIC_SIG_DEF(KEY_UP,}扩展功能多击的使用

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

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

KEY_PUBLIC_SIG_DEF(KEY_UP,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);}扩展功能组合状态(同一时间轴)

感谢网友:石玉虎[@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_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(te

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论