历史上的今天
返回首页

历史上的今天

今天是: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上。

*             如改成其他单片机或其他端口,需要进行相应修改

推荐阅读

史海拾趣

Dynawave Incorporated公司的发展小趣事

作为一家有社会责任感的企业,Dynawave一直注重环保和可持续发展。他们采用环保材料和生产工艺,减少了对环境的污染。同时,公司还积极参与各种环保活动,宣传环保理念。这些做法不仅提升了公司的品牌形象,也赢得了社会各界的赞誉。

Astron Wireless Technologies Inc公司的发展小趣事

随着公司的发展,Astron Wireless Technologies Inc开始寻求与其他行业的领军企业建立战略合作关系。通过与一家知名通信设备制造商的合作,公司成功将其无线通信技术集成到了对方的产品中,从而进一步扩大了市场份额。这一合作不仅提升了公司的知名度,还为公司带来了稳定的收入来源。

Compostar Technology Co Ltd公司的发展小趣事

Compostar Technology Co Ltd公司自成立以来,一直致力于电子技术的研发与创新。在早期,公司凭借一款具有高效能耗比的电源管理芯片,成功打入了市场。随着技术的不断进步,公司逐渐将业务扩展到通信、智能家居和可穿戴设备等多个领域。公司不断投入研发资金,吸引了一批优秀的科研人才,成功研发出多款具有竞争力的产品,逐渐在电子行业中树立了良好的口碑。

EXCELTA公司的发展小趣事

随着科技的不断进步和市场的不断变化,Excelta始终将技术创新作为公司发展的核心驱动力。公司投入大量资金和资源进行技术研发和产品创新,不断推出具有竞争力的新产品。其中,一款高性能的微型连接器产品凭借其出色的性能和稳定性在市场上取得了巨大成功。此外,Excelta还积极探索新的应用领域和市场机会,为公司的持续发展注入了新的活力。

Green Solution Technology Co Ltd公司的发展小趣事

Excelta公司创立于20世纪90年代初,当时电子元器件市场正处于快速发展阶段。创始人李明看到连接器市场的巨大潜力,决定投身其中。然而,初创时期资金紧张,技术储备薄弱,公司面临巨大挑战。李明带领团队日夜兼程,通过技术创新和成本控制,成功开发出第一款具有竞争力的连接器产品,并迅速获得了市场的认可。此后,Excelta逐渐在连接器领域崭露头角。

General Electric Company公司的发展小趣事
在高压物理、化学等科研实验中,用于信号采集和处理。

问答坊 | AI 解惑

适合于初学单片机的S51实验/开发板

这是我根据单片机教学的需要开发的“袖珍型单片机实验/开发板”,让学生自已动手组装,即作为电子工艺实习的产品,其成果又作为学生学习单片机的实验板,并用它来完成毕业设计。 板子大小仅为170mmX120mm,携带方便,包含了单片机应用的常用的典型 ...…

查看全部问答>

大家说说。。单片机底下要不要覆双面铜啊

来自EEWORLD合作群:arm linux fpga 嵌入0(49900581)…

查看全部问答>

如何用JLink仿真LM3S8962

如何用JLink仿真LM3S8962 “TI Stellaris 给我的感觉单步仿真比较慢”,Hanker520在论坛如是说。 我也有同感,看到他的发言后,不禁去想:到底是TI Stellaris本身慢,还是仿真器的原因。事实是最有力的语言,下面我们就来试一下,用不同的仿真器 ...…

查看全部问答>

怎样在编辑框中把字的显示放大??

我在对话框下做了一个编辑框,因为编辑框比较大,原始的字的输出比较小,不想改变编辑框的大小,想知道怎么把输入的字的放大一些,有没有简单一些的方法?? 谢谢!!!…

查看全部问答>

我的看法正确吗?

在我的系统中,用430f149的端口驱动max7219(数码管显示),还专门加了三极管用于电平转换,同样的程序在51 下运行完全正常,但在430下却始终无法正常显示,后来在用示波器表笔的地端接地时却发现会使之显示正常的数据,显然是由于系统抗干扰能力的问题?…

查看全部问答>

为什么数码管静态显示,在有效位上显示,在不显示的位上会有残影

为什么数码管静态显示,在有效位上显示,在不显示的位上会有残影…

查看全部问答>

IMS研究:媒体播放器,个人电脑,显示驱动器的数字标牌近收入50亿美元(翻译版)

本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 IMS研究:媒体播放器,个人电脑,显示驱动器的数字标牌近收入50亿美元(翻译版) 根据IMS Research的分析报告, 在2011年期间硬件支持,如媒体播放器,电脑,显示器和LED视频阵列的数字标牌的 ...…

查看全部问答>

摄像头如何确定目标靶上点光斑位置

有人知道如何通过摄像头确定目标靶上点光斑的位置?点光斑是移动的…

查看全部问答>

CCS新建M4工程入门

一 系统环境说明PC:Windows 7家庭普通版(32bit)CCS: Version: 5.3.0.00090 工作目录:F:\\workspace_v5_3二 工作目录组织1.在工作目录下新建文件夹LM4F120                       &nbs ...…

查看全部问答>

TI资料的学习

很好的设计学习资料,很实用,给实际的设计方案一定的参考价值,TI提供的技术工程师的学习资料还是很好的。详细的介绍了Hercules的使用方法!…

查看全部问答>