📄 key.c
字号:
/*
*********************************************************************************************************
* Embedded Systems Building Blocks
* Complete and Ready-to-Use Modules in C
*
* Matrix Keyboard Driver
*
* (c) Copyright 1999, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* Filename : KEY.C
* Programmer : Jean J. Labrosse
* Translated by : Won-Ho, Sung
*********************************************************************************************************
* 汲疙
*
* 虐焊靛 葛碘篮 4俺狼 青苞 6俺狼 凯肺 备己等 概飘腐胶肺 啊沥窍绊 乐促. 弊矾唱 捞 内靛绰 8 x 8鳖瘤狼
* 绢恫 屈怕狼 概飘腐胶档 瘤盔茄促. 肚茄 捞 靛扼捞滚绰 凯(column)涝仿 吝 窍唱何磐 技 俺鳖瘤狼 涝仿阑
* 荤侩窍搁 3俺鳖瘤狼 浆橇飘虐甫 瘤盔茄促. 捞 虐绰 SHIFT1, SHIFT2 弊府绊 SHIFT3捞促.
*
* 览侩 橇肺弊伐篮 促澜阑 馆靛矫 汲沥秦具 茄促(KEY.H甫 焊扼):
*
* KEY_BUF_SIZE 虐焊靛 滚欺狼 农扁
*
* KEY_MAX_ROWS 虐焊靛狼 弥措 青(row) 荐
* KEY_MAX_COLS 虐焊靛狼 弥措 凯(column) 荐
*
* KEY_RPT_DLY 磊悼 馆汗扁瓷捞 促矫 荐青登扁 傈狼 胶牡鸥烙 蔼
* KEY_RPT_START_DLY 磊悼 馆汗扁瓷捞 荐青登扁鳖瘤狼 胶牡鸥烙 蔼
*
* KEY_SCAN_TASK_DLY 虐甫 胶牡窍绰 矫埃 埃拜
* KEY_SCAN_TASK_PRIO 虐焊靛 胶某醋 怕胶农狼 快急鉴困
* KEY_SCAN_TASK_STK_SIZE 虐焊靛 胶某醋 怕胶农狼 胶琶 农扁
*
* KEY_SHIFT1_MSK SHIFT1虐啊 凯涝仿 吝 绢恫 厚飘俊 秦寸窍绰 啊甫 搬沥窍绰单 荤侩登绰 付胶农
* (0x00篮 SHIFT1虐啊 绝澜阑 富茄促)
* KEY_SHIFT1_OFFSET SHIFT1虐啊 喘妨脸阑 锭 歹秦龙 坷橇悸 蔼
*
* KEY_SHIFT2_MSK SHIFT2虐啊 凯涝仿 吝 绢恫 厚飘俊 秦寸窍绰 啊甫 搬沥窍绰单 荤侩登绰 付胶农
* (0x00篮 SHIFT2虐啊 绝澜阑 富茄促)
* KEY_SHIFT2_OFFSET SHIFT2虐啊 喘妨脸阑 锭 歹秦龙 坷橇悸 蔼
*
* KEY_SHIFT3_MSK SHIFT3虐啊 凯涝仿 吝 绢恫 厚飘俊 秦寸窍绰 啊甫 搬沥窍绰单 荤侩登绰 付胶农
* (0x00篮 SHIFT3虐啊 绝澜阑 富茄促)
* KEY_SHIFT3_OFFSET SHIFT3虐啊 喘妨脸阑 锭 歹秦龙 坷橇悸 蔼
*
*
* KEY_PORT_ROW 虐焊靛 概飘腐胶狼 青俊 秦寸窍绰 器飘狼 绢靛饭胶
* KEY_PORT_COL 虐焊靛 概飘腐胶狼 凯俊 秦寸窍绰 器飘狼 绢靛饭胶
* KEY_PORT_CW 虐焊靛 I/O器飘 力绢侩 况靛狼 绢靛饭胶
*
* KeyInitPort, KeySelRow() 弊府绊 KeyGetCol()捞 窍靛傀绢客 包访等 3俺狼 窃荐促.
* 捞巴篮 窍靛傀绢肺狼 牢磐其捞胶甫 捞甸 3俺狼 窃荐肺 瘤开拳 窃栏肺结 荤侩磊 绊蜡狼 矫胶袍栏肺
* 捞侥窍绰 巴阑 祈府窍档废 秦霖促.
*********************************************************************************************************
*/
/*$PAGE*/
/*
*********************************************************************************************************
* 牢农风靛 颇老
*********************************************************************************************************
*/
#include "c:\\IC96\\Work\\ucos_ii\\includes.h"
#include "key.h"
/*
*********************************************************************************************************
* 瘤开惑荐
*********************************************************************************************************
*/
#define KEY_STATE_UP 1 /* KeyScan()俊辑 荤侩登绰 虐 胶某醋 怕胶农狼 惑怕 */
#define KEY_STATE_DEBOUNCE 2
#define KEY_STATE_RPT_START_DLY 3
#define KEY_STATE_RPT_DLY 4
/*
*********************************************************************************************************
* 傈开函荐
*********************************************************************************************************
*/
static INT8U KeyBuf[KEY_BUF_SIZE]; /* 虐焊靛 滚欺 */
static INT8U KeyBufInIx; /* 虐焊靛 滚欺俊辑 促澜 锅俊 历厘瞪 胶牡内靛狼 牢郸胶 */
static INT8U KeyBufOutIx; /* 虐焊靛 滚欺俊辑 促澜 锅俊 佬鳃 胶牡内靛狼 牢郸胶 */
static INT16U KeyDownTmr; /* 虐啊 倔付唱 坷阀悼救 喘妨 乐绰 瘤甫 墨款飘茄促 */
static INT8U KeyNRead; /* 虐焊靛肺何磐 佬腮 虐狼 俺荐 */
static INT8U KeyRptStartDlyCtr; /* 磊悼馆汗 扁瓷捞 矫累登扁 傈狼 胶牡鸥烙 */
static INT8U KeyRptDlyCtr; /* 磊悼馆汗 扁瓷捞 促矫 矫累登扁 傈狼 胶牡鸥烙 */
static INT8U KeyScanState; /* 虐焊靛 胶某醋 窃荐狼 泅犁 惑怕 */
static OS_STK KeyScanTaskStk[KEY_SCAN_TASK_STK_SIZE]; /* 虐焊靛 胶某醋 怕胶农狼 胶琶 */
static OS_EVENT *KeySemPtr; /* 虐焊靛 技付器绢狼 器牢磐 */
const char UserKeyMapTbl[] = {
'1',
'2',
'3',
'4',
'5',
'6',
'7',
'8',
'9',
'*',
'0',
'#'
};
/*
*********************************************************************************************************
* 瘤开窃荐 盔屈
*********************************************************************************************************
*/
static void KeyBufIn(INT8U code); /* 胶牡内靛甫 虐焊靛 滚欺俊 历厘茄促 */
static INT8U KeyDecode(void); /* 泅犁 喘妨柳 虐焊靛狼 胶牡内靛甫 掘绰促 */
static BOOLEAN KeyIsKeyDown(void); /* 虐啊 喘妨廉 乐绰 瘤甫 犬牢茄促 */
static void KeyScanTask(void *data); /* 虐焊靛 胶某醋 怕胶农 */
/*$PAGE*/
/*
*********************************************************************************************************
* 虐 巩磊甫 虐焊靛 滚欺俊 历厘
*
* 汲疙 : 捞 窃荐绰 虐 巩磊甫 虐焊靛 滚欺俊 历厘茄促
* 傈崔牢磊 : code 绰 虐焊靛 滚欺俊 历厘瞪 胶牡内靛促
* 府畔蔼 : 绝澜
*********************************************************************************************************
*/
static void KeyBufIn (INT8U code)
{
OS_ENTER_CRITICAL(); /* 农府萍拿 冀记阑 矫累窃. 牢磐反飘啊 叼技捞喉 等促 */
if (KeyNRead < KEY_BUF_SIZE) { /* 滚欺俊 坷滚敲肺快啊 绝绰瘤 犬牢茄促 */
KeyNRead++; /* 佬囚柳 虐狼 箭磊甫 刘啊茄促 */
KeyBuf[KeyBufInIx++] = code; /* 胶牡内靛甫 滚欺俊 历厘茄促 */
if (KeyBufInIx >= KEY_BUF_SIZE) { /* 促澜 锅俊 历厘瞪 滚欺 牢郸胶甫 炼例茄促 */
KeyBufInIx = 0;
}
OS_EXIT_CRITICAL(); /* 农府萍拿 冀记阑 辆丰窃 */
OSSemPost(KeySemPtr); /* 滚欺俊 胶牡内靛啊 历厘等 版快 技付器绢甫 矫弊澄傅窃*/
} else { /* 滚欺啊 菜 谩澜. 胶牡内靛甫 酪绢滚覆 */
OS_EXIT_CRITICAL(); /* 农府萍拿 冀记阑 辆丰窃 */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 虐焊靛 叼内靛
*
* 汲疙 : 捞 窃荐绰 喘妨柳 虐狼 胶牡内靛甫 搬沥窍扁 困秦 龋免等促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : 虐 胶牡内靛
*********************************************************************************************************
*/
static INT8U KeyDecode (void)
{
INT8U col;
INT8U row;
INT8U offset;
BOOLEAN done;
INT8U col_id;
INT8U msk;
done = FALSE;
row = 0;
while (row < KEY_MAX_ROWS && !done) { /* 割 锅掳 青狼 虐啊 喘啡绰 瘤甫 舅酒辰促 */
KeySelRow(row); /* 青阑 急琶茄促 */
if (KeyIsKeyDown()) { /* 急琶等 青狼 虐啊 喘啡绰 瘤甫 犬牢茄促 */
done = TRUE; /* 青 茫扁甫 辆丰茄促 */
} else {
row++; /* 促澜 青阑 急琶茄促 */
}
}
col = KeyGetCol(); /* 凯阑 佬绰促 */
offset = 0; /* 酒公繁 矫橇飘 虐档 喘府瘤 臼绰 巴栏肺 茄促 */
if (col & KEY_SHIFT1_MSK) { /* SHIFT1 肚茄 喘妨 乐绰瘤 犬牢 */
offset += KEY_SHIFT1_OFFSET;
}
if (col & KEY_SHIFT2_MSK) { /* SHIFT2 肚茄 喘妨 乐绰瘤 犬牢 */
offset += KEY_SHIFT2_OFFSET;
}
if (col & KEY_SHIFT3_MSK) { /* SHIFT3 肚茄 喘妨 乐绰瘤 犬牢 */
offset += KEY_SHIFT3_OFFSET;
}
msk = 0x01; /* 凯阑 胶牡窍扁 困秦辑 厚飘 付胶农 窃 */
col_id = 0; /* 凯狼 蔼阑 技飘茄促 (0..7) */
done = FALSE;
while (col_id < KEY_MAX_COLS && !done) { /* 葛电 凯阑 炼荤茄促 */
if (col & msk) { /* 捞锅 凯捞 喘妨 乐绰 瘤甫 犬牢茄促 */
done = TRUE; /* 辆丰, i俊 虐狼 凯狼 蔼捞 历厘登绢 乐澜(0..7) */
} else {
col_id++;
msk <<= 1;
}
}
return (row * KEY_MAX_COLS + offset + col_id); /* 胶牡内靛甫 府畔茄促 */
}
/*$PAGE*/
/*
*********************************************************************************************************
* 虐焊靛 滚欺 敲矾浆
*
* 汲疙 : 捞 窃荐绰 虐焊靛 滚欺甫 努府绢 茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : 绝澜
*********************************************************************************************************
*/
void KeyFlush (void)
{
while (KeyHit()) { /* 虐焊靛 滚欺俊 胶牡内靛啊 乐绰 悼救 馆汗... */
KeyGetKey(0); /* ... 滚欺肺 何磐 促澜 胶牡内靛甫 佬绢柯促 */
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 胶牡内靛甫 备茄促
*
* 汲疙 : 虐焊靛 靛扼捞滚肺何磐 胶牡内靛甫 佬绢柯促
* 傈崔牢磊 : 'to' 绰 虐啊 喘妨龙 锭鳖瘤 KeyGetKey()啊 扁促妨具 窍绰 矫埃阑 唱鸥辰促
* 0狼 蔼篮 虐啊 喘妨龙 锭鳖瘤 康盔洒 扁促妨具 窃阑 狼固茄促
* 府畔蔼 : != 0xFF 牢 版快绰 喘妨柳 虐狼 胶牡内靛 烙
* == 0xFF 牢 版快绰 'to'俊 狼秦 汲沥等 鸥烙酒眶 锭鳖瘤 虐啊 喘妨瘤瘤 臼疽澜阑 唱鸥辰促
*********************************************************************************************************
*/
INT8U KeyGetKey (INT16U to)
{
INT8U code;
INT8U err;
OSSemPend(KeySemPtr, to, &err); /* 虐啊 喘妨龙 锭甫 扁促赴促 */
OS_ENTER_CRITICAL(); /* 农府萍拿 冀记阑 矫累茄促. 牢磐反飘绰 叼技捞喉 等促 */
if (KeyNRead > 0) { /* 虐焊靛 滚欺俊 胶牡内靛啊 乐绰 瘤甫 犬牢茄促 */
KeyNRead--; /* 佬囚柳 虐狼 俺荐甫 皑家矫挪促 */
code = KeyBuf[KeyBufOutIx]; /* 滚欺肺 何磐 胶牡内靛甫 佬绢柯促 */
KeyBufOutIx++;
if (KeyBufOutIx >= KEY_BUF_SIZE) { /* 虐焊靛 滚欺狼 牢郸胶甫 炼例茄促 */
KeyBufOutIx = 0;
}
OS_EXIT_CRITICAL(); /* 农府萍拿 冀记阑 辆丰茄促 */
return (code); /* 喘妨柳 虐狼 胶牡内靛甫 府畔茄促 */
} else {
OS_EXIT_CRITICAL(); /* 农府萍拿 冀记阑 辆丰茄促 */
return (0xFF); /* 滚欺俊 胶牡内靛啊 绝澜. -1阑 府畔茄促 */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -