📄 drv_kpp.c
字号:
/*-------------------------------------------------------------------
FILE NAME:
drv_kpp.c
DESCRIPTION:
this file includes keyboard driver.
AUTHOR:
WYF
VERSION:
2005.1122.00
COMPANY:
DATANG MICROELECTRONICS TECHNOLOGY CO,.LTD
HISTORY:
2005.1122 Creat this file
...
--------------------------------------------------------------------*/
#include <stdio.h>
#include <assert.h>
#include <string.h>
#include "nucleus.h"
#include "ADSmx21_defs.h"
#include "drv_defs.h"
#include "drv_extr.h"
static TDRV_KPP kpp;
static void kb_TIMER(UNSIGNED id)
{
STATUS s;
static unsigned short col_idx = 0;
unsigned char col, row;
unsigned short i, key, key_v;
if (col_idx > 0){
row = ~(KPDR_ROW);
if (row){
key = KPDR;
col_idx = 0;
KPDR_COL = 0;
i = 0x000c;
KPSR |= i;
i = (1<<9); /* Enable release interrupt */
KPSR |= i;
key_v = ~key;
kpp.key = key_v;
kpp.status = 1;
if (kpp.cb){
(kpp.cb)(0,key_v);
}
return;
}
}
col = ~(1<<col_idx);
KPDR_COL = col;
col_idx ++;
if (col_idx <= 6){
s = NU_Reset_Timer(&(kpp.timer), kb_TIMER, 2, 0, NU_ENABLE_TIMER);
assert(s == NU_SUCCESS);
}
else{
col_idx = 0;
KPDR_COL = 0;
i = 0x000c;
KPSR |= i;
i = (1<<8);
KPSR |= i;
}
}
static void kpp_LISR(INT vector)
{
STATUS s = 0xFFFFFFFF;
short i;
i = (1<<8)|(1<<9);
KPSR &= (~i); /* Disable press & release interrupt */
s = NU_Activate_HISR(&(kpp.hisr));
assert(s == NU_SUCCESS);
}
static void kpp_HISR(void)
{
unsigned short i;
if (kpp.status){
KPDR_COL = 0;
i = 0x000c;
KPSR |= i;
i = (1<<8);
KPSR |= i;
kpp.status = 0;
if (kpp.cb){
(kpp.cb)(1,kpp.key);
}
}
else {
KPDR_COL = 0x3f;
KPCR_COL = 0; /* Switch column to totem pole output */
i = 0x3f;
KPCR_COL = i; /* Switch column back open-drain output */
kb_TIMER(0);
}
}
void keypad_init(void (*cb)(int,int))
{
unsigned short i;
STATUS s;
void (*old)(int);
kpp.cb = cb;
kpp.status = 0;
PCCR1 |= (1<<30); /* Enable KPP_EN */
KPCR_ROW = 0x3f; /* ROW: 6 */
KPDR_COL = 0; /* Clear column out */
KPCR_COL = 0x3f; /* Column(6) as open-drain */
KDDR_ROW = 0; /* Row: input */
KDDR_COL = 0x3f; /* Column: output */
KPSR = 0;
i = 0x000c;
KPSR |= i;
i = (1<<8)|(1<<10); /* Enable Press interrupt */
KPSR |= i;
s = NU_Register_LISR(21, kpp_LISR, &old);
assert(s == NU_SUCCESS);
s = NU_Create_HISR(&(kpp.hisr), "kpp", kpp_HISR, 2, kpp.stack, 1024);
assert(s == NU_SUCCESS);
memset(&(kpp.timer),0,sizeof(NU_TIMER));
s = NU_Create_Timer(&(kpp.timer), "kpp", kb_TIMER, 1, 2, 2, NU_DISABLE_TIMER);
assert(s == NU_SUCCESS);
INTENNUM = 21; /* Enable KPP interrupt */
}
void keypad_register(void (*cb)(int,int))
{
kpp.cb = cb;
}
void keypad_unregister(void)
{
kpp.cb = NULL;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -