4X4矩阵键盘扫描 基于MC9S12XEP100

发布者:变形金刚最新更新时间:2021-07-26 来源: eefocus关键字:4X4  矩阵键盘扫描  MC9S12XEP100 手机看文章 扫描二维码
随时随地手机看文章

引言

本文基于之前封装好的 机械按钮模块 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上。

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

[1] [2] [3]
关键字:4X4  矩阵键盘扫描  MC9S12XEP100 引用地址:4X4矩阵键盘扫描 基于MC9S12XEP100

上一篇:MC9S12XEP100 ATD模块 驱动程序
下一篇:MC9S12XEP100 SCI(UART)驱动程序2 - 基于uCOS-II

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
更多往期活动

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved