引言
本文基于之前封装好的 机械按钮模块 http://blog.csdn.net/lin_strong/article/details/78897160,示例实现了一个4X4矩阵键盘的模块,简述了键盘扫描的实现,同时示例了怎么把模块原先的同步返回的事件转换为异步事件通知。
模块源码
这次先贴出模块代码。
.h文件:
/*
*******************************************************************************************
*
*
* MATRIX KEYBOARD MODULE
* 矩阵键盘模块
*
* File : MatKB.h
* By : Lin Shijun(http://blog.csdn.net/lin_strong)
* Date: 2017/12/27
* version: V1.0
* History: 2017/12/27 V1.0 the prototype
*
* NOTE(s): 1. 基于机械按钮模块实现对矩阵键盘的封装,实现行列扫描及异步事件通知
* 2. 当前实现使用的矩阵键盘的排布如下,如使用其他排布,请自行修改实现
* 1 2 3 A
* 4 5 6 B
* 7 8 9 C
* * 0 # D
*
*********************************************************************************************
*/
#ifndef MATKB_H
#define MATKB_H
#ifdef MATKB_GLOBALS
#define MATKB_EXT
#else
#define MATKB_EXT extern
#endif
/*
*******************************************************************************************
* INCLUDE FILE
*******************************************************************************************
*/
// 根据实际存放位置修改
#include "../机械按钮模块/MecBtn.h"
/*
********************************************************************************************
* MISCELLANEOUS
********************************************************************************************
*/
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef NULL
#define NULL 0x00
#endif
/*
*******************************************************************************************
* CONFIGURATION 配置
*******************************************************************************************
*/
// 按钮支持的功能请去MecBtn.h内设置
// 是否支持DOWN事件
#define MATKB_SUPPORT_EVENT_DOWN TRUE
// 是否支持up事件
#define MATKB_SUPPORT_EVENT_UP TRUE
// 是否支持click事件
#define MATKB_SUPPORT_EVENT_CLICK TRUE
// 是否支持long-press事件
#define MATKB_SUPPORT_EVENT_LPRESS MECBTN_SUPPORT_LONGPRESS
/*
*******************************************************************************************
* TYPE DEFINE
*******************************************************************************************
*/
// ID of each key
enum KEY_ID{
KEY_1, KEY_2, KEY_3, KEY_A,
KEY_4, KEY_5, KEY_6, KEY_B,
KEY_7, KEY_8, KEY_9, KEY_C,
KEY_STAR, KEY_0, KEY_HASH, KEY_D,
};
/*
******************************************************************************************
* EVENTS
******************************************************************************************
*/
typedef void (* MatKB_KeyEvent)(INT8U keyID,void *arg);
#if(MATKB_SUPPORT_EVENT_DOWN == TRUE)
// 当有按键被按下时被触发,keyID为对应按键的ID,arg为NULL
MATKB_EXT MatKB_KeyEvent MatKB_onKeyDown;
#endif
#if(MATKB_SUPPORT_EVENT_UP == TRUE)
// 当有按键被抬起时被触发,keyID为对应按键的ID,arg为NULL
MATKB_EXT MatKB_KeyEvent MatKB_onKeyUp;
#endif
#if(MATKB_SUPPORT_EVENT_CLICK == TRUE)
// 当有按键被抬起时被触发,keyID为对应按键的ID,((INT16U)arg)为连击次数
MATKB_EXT MatKB_KeyEvent MatKB_onKeyClick;
#endif
#if(MATKB_SUPPORT_EVENT_LPRESS == TRUE)
// 当有按键发生长按事件时被触发,keyID为对应按键的ID,arg为NULL
MATKB_EXT MatKB_KeyEvent MatKB_onKeyLPress;
#endif
/*
******************************************************************************************
* Function 函数
******************************************************************************************
*/
/*
*********************************************************************************************
* MatKB_Init()
*
* Description : To initialize module.
* 用其来初始化模块
*
* Arguments :
*
* Return : TRUE if success
* FALSE if fail
*
* Note(s) :
*********************************************************************************************
*/
INT8U MatKB_Init(void);
/*
*********************************************************************************************
* MatKB_TimeTick()
*
* Description : Indicate a time tick to drive the module. User should use a hardware/software
* timer to periodically call this routine. The definition of a tick can be
* found in MecBtn.h .
* 通知一次tick以驱动模块。 用户应该使用一个软/硬件定时器来定时调用这个例程。tick
* 的定义详见MecBtn.h。
*
* Arguments :
*
* Return :
*
* Note(s) :
*********************************************************************************************
*/
void MatKB_TimeTick(void);
/*
*********************************************************************************************
* MatKB_isPressedKey()
*
* Description : To check whether the indicated key is pressed
*
* Arguments : keyID the ID of the key(see KEY_ID)
*
* Return : TRUE is pressed
* FALSE is not pressed.
*
* Note(s) :
*********************************************************************************************
*/
INT8U MatKB_isPressedKey(INT8U keyID);
/*
*********************************************************************************************
* MatKB_isLongPressedKey()
*
* Description : To check whether the indicated key is long-pressed
*
* Arguments : keyID the ID of the key(see KEY_ID)
*
* Return : TRUE is long-pressed
* FALSE is not long-pressed.
*
* Note(s) :
*********************************************************************************************
*/
INT8U MatKB_isLongPressedKey(INT8U keyID);
/*
************************************************************************************
* ERROR CHECK 错误检查
************************************************************************************
*/
#endif // of MATKB_H
然后是.c文件
/*
*******************************************************************************************
*
*
* MATRIX KEYBOARD MODULE
* 矩阵键盘模块
*
* File : MatKB.c
* By : Lin Shijun(http://blog.csdn.net/lin_strong)
* Date: 2017/12/27
* version: V1.0
* History: 2017/12/27 V1.0 the prototype
*
* NOTE(s): 1. 基于机械按钮模块实现对矩阵键盘的封装,实现行列扫描及异步事件通知
* 2. 当前实现使用的矩阵键盘的排布如下,如使用其他排布,请自行修改实现
* 1 2 3 A
* 4 5 6 B
* 7 8 9 C
* * 0 # D
* 3. 当前实现基于HCS12XEP100的,4X4键盘的列线0-3接在A0-A3上,行线0-3接在A4-A7上。
* 如改成其他单片机或其他端口,需要进行相应修改
上一篇:MC9S12XEP100 ATD模块 驱动程序
下一篇:MC9S12XEP100 SCI(UART)驱动程序2 - 基于uCOS-II
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 LTC4162IUFD-LAD 的参考设计
- CH552G自定义功能键盘可扩展
- 使用 Infineon Technologies AG 的 OM7585AST 的参考设计
- 使用 ON Semiconductor 的 NUD4022 的参考设计
- LTC3835EGN-1 高效降压转换器的典型应用电路
- 使用 ON Semiconductor 的 CAT3614 的参考设计
- 使用 Analog Devices 的 LTC1871-7 的参考设计
- #第七届立创电赛#usb功率表
- L7805A 功率 AM 调制器的典型应用(单位电压增益,IO = 0.5)
- LDK120C15R 1.5V低压降稳压器典型应用(D版)电路