历史上的今天
今天是:2025年07月26日(星期六)
2021年07月26日 | 4X4矩阵键盘扫描 基于MC9S12XEP100
2021-07-26 来源:eefocus
引言
本文基于之前封装好的 机械按钮模块 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上。
* 如改成其他单片机或其他端口,需要进行相应修改
史海拾趣
|
这是我根据单片机教学的需要开发的“袖珍型单片机实验/开发板”,让学生自已动手组装,即作为电子工艺实习的产品,其成果又作为学生学习单片机的实验板,并用它来完成毕业设计。 板子大小仅为170mmX120mm,携带方便,包含了单片机应用的常用的典型 ...… 查看全部问答> |
|
如何用JLink仿真LM3S8962 “TI Stellaris 给我的感觉单步仿真比较慢”,Hanker520在论坛如是说。 我也有同感,看到他的发言后,不禁去想:到底是TI Stellaris本身慢,还是仿真器的原因。事实是最有力的语言,下面我们就来试一下,用不同的仿真器 ...… 查看全部问答> |
|
我在对话框下做了一个编辑框,因为编辑框比较大,原始的字的输出比较小,不想改变编辑框的大小,想知道怎么把输入的字的放大一些,有没有简单一些的方法?? 谢谢!!!… 查看全部问答> |
|
IMS研究:媒体播放器,个人电脑,显示驱动器的数字标牌近收入50亿美元(翻译版) 本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 IMS研究:媒体播放器,个人电脑,显示驱动器的数字标牌近收入50亿美元(翻译版) 根据IMS Research的分析报告, 在2011年期间硬件支持,如媒体播放器,电脑,显示器和LED视频阵列的数字标牌的 ...… 查看全部问答> |
|
一 系统环境说明PC:Windows 7家庭普通版(32bit)CCS: Version: 5.3.0.00090 工作目录:F:\\workspace_v5_3二 工作目录组织1.在工作目录下新建文件夹LM4F120 &nbs ...… 查看全部问答> |




