📄 kpd.c
字号:
/****************************************Copyright (c)**************************************************
**
** 公 司
** 部 门
**
** http://www.chipapp.com
**
**--------------文件信息--------------------------------------------------------------------------------
** 文 件 名: kpd.c
** 创 建 人: 罗辉联
** 创建日期: 2006年7月23日
** 描 述: kpd应用部分函数、变量定义
**
**--------------历史版本--------------------------------------------------------------------------------
** 修 改 人: 罗辉联
** 版 本: V1.0
** 日 期: 2006年7月23日
** 描 述: 原始版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#define KPD_SLEEP_TIMER_STANDRAD 6
/***************************************** 全局变量定义 ************************************************/
const WORD8 keypad_layout[KPD_MAX_ROWS][KPD_MAX_COLS]={ /* 键盘物理键值映射表 */
{KPD_PKEY_5, KPD_PKEY_6, KPD_PKEY_7, KPD_PKEY_8 },
{KPD_PKEY_9, KPD_PKEY_RIGHT, KPD_PKEY_LEFT, KPD_PKEY_ESC },
{KPD_PKEY_0, KPD_PKEY_1, KPD_PKEY_2, KPD_PKEY_3 },
{KPD_PKEY_4, KPD_PKEY_UP, KPD_PKEY_DOWN, KPD_PKEY_OK },
};
MMI_MSG_STRUCT_T *kpd_msg = (void*)0; /* 定义全局指针需要这样赋初值 */
/***************************************** 函数原型声明 ************************************************/
void kpd_us_sleep(UWORD16 counter);
/*********************************************************************************************************
** 函数名称: kpd_init
** 功能描述: 初始化行列式键盘接口
**
** 参 数: None
** None
**
** 返 回 值: None
**
** 作 者: 罗辉联
** 日 期: 2006年7月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void kpd_init(void)
{
GPIO_ModeConfig(GPIO1,4,GPIO_OUT_PP); /* 列配置(输出) */
GPIO_ModeConfig(GPIO1,5,GPIO_OUT_PP);
GPIO_ModeConfig(GPIO1,6,GPIO_OUT_PP);
GPIO_ModeConfig(GPIO1,7,GPIO_OUT_PP);
GPIO_ModeConfig(GPIO2,12,GPIO_IN_COMS); /* 行配置(输入) */
GPIO_ModeConfig(GPIO2,13,GPIO_IN_COMS);
GPIO_ModeConfig(GPIO2,14,GPIO_IN_COMS);
GPIO_ModeConfig(GPIO2,15,GPIO_IN_COMS);
}
/*********************************************************************************************************
** 函数名称: kpd_scan_keypad
** 功能描述: 行列式键盘扫描
**
** 参 数: None
**
** 返 回 值: 扫描键盘所得的值
**
** 作 者: 罗辉联
** 日 期: 2006年7月23日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
WORD8 kpd_scan_keypad(void)
{
UWORD8 row, col;
volatile UWORD16 rows;
KPD_COL_OUT = KPD_COL_OUT | KPD_ALL_OFF;
kpd_us_sleep(15);
rows = KPD_ROW_IN & 0xF000;
if(rows != 0xF000)
{
KPD_COL_OUT = KPD_COL_OUT & KPD_ALL_ON;
return KPD_PKEY_NULL; /* 干扰, 返回*/
}
KPD_COL_OUT = KPD_COL_OUT & KPD_ALL_ON;
kpd_us_sleep(15);
rows = KPD_ROW_IN & 0xF000;
if(rows == 0xF000)
return KPD_PKEY_NULL;
KPD_COL_OUT = KPD_COL_OUT | KPD_ALL_OFF;
/* 每次激活一列 */
for (col = 0; col < KPD_MAX_COLS; col++)
{
KPD_COL_OUT = KPD_COL_OUT & (KPD_ACTIVATE(col));
kpd_us_sleep(10);
rows = KPD_ROW_IN & 0xF000; /* 扫描那个行被激活 */
if (rows != 0xF000)
{
for (row = 0; row < KPD_MAX_ROWS; row++)
{
/* 首先被激活的行 */
if ( KPD_IS_ACTIVE(rows,row))
{
/* 重新激活所有的列 */
KPD_COL_OUT = KPD_COL_OUT & KPD_ALL_ON;
return keypad_layout[row][col]; /* 返回扫描的键值 */
}
}
}
}
KPD_COL_OUT = KPD_COL_OUT & KPD_ALL_ON; /* 没有行被激活,重新激活所有的列然后返回 */
return KPD_PKEY_NULL;
}
/********************************************************************************************************
;** 函数名称: kpd_scan_task_core
;** 功能描述: 键盘扫描任务core函数
;**
;** 参 数: *pdata
;**
;** 返 回 值: None
;**
;** 作 者: 罗辉联
;** 日 期: 2006年7月1日
;**-------------------------------------------------------------------------------------------------------
;** 修 改 人:
;** 日 期:
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
void kpd_scan_task_core(void *pdata)
{
WORD8 key_value = KPD_PKEY_NULL;
while(1)
{
key_value = kpd_scan_keypad();
if(key_value != KPD_PKEY_NULL)
{
kpd_msg->msg_id = 1; //MMI_MSG_GET_KEY=1;
kpd_msg->callback_func = NULL;
kpd_msg->msg_param[0] = key_value;
mmi_msg_send(kpd_msg);
key_value = KPD_PKEY_NULL;
}
OSTimeDly(30); /* 大约150MS 扫描一次 */
}
}
/*********************************************************************************************************
** 函数名称: kpd_ns_sleep
** 功能描述: 纳秒级延时
**
** 参 数: counter:
**
** 返 回 值: None
**
** 作 者: 罗辉联
** 日 期: 2006年5月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void kpd_ns_sleep(UWORD32 cpt_loop)
{
// while (cpt_loop -- != 0);
__asm
{
CMP A1, #0
BEQ END_FUNCTION
LOOP_LINE:
SUB A1, A1, #1
CMP A1, #0
BNE LOOP_LINE
END_FUNCTION:
}
}
/*********************************************************************************************************
** 函数名称: kpd_us_sleep
** 功能描述: 微秒级延时
**
** 参 数: counter:
**
** 返 回 值: None
**
** 作 者: 罗辉联
** 日 期: 2006年5月25日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void kpd_us_sleep(UWORD16 counter)
{
UWORD16 i = 0;
UWORD16 base = KPD_SLEEP_TIMER_STANDRAD ; //MCLK=48M 时大约1us
for(i = 0; i < counter; i++)
kpd_ns_sleep(base);
}
/**********************************************end of file***********************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -