📄 key.c
字号:
}
/*$PAGE*/
/*
*********************************************************************************************************
* 虐啊 倔付唱 坷贰 喘妨廉 乐菌绰 瘤甫 舅酒晨
*
* 汲疙 : 捞 窃荐绰 虐啊 喘妨廉 乐绰 矫埃阑 府畔茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : 虐啊 喘妨柳 矫埃(剐府檬, milliseconds)
*********************************************************************************************************
*/
INT32U KeyGetKeyDownTime (void)
{
INT16U tmr;
OS_ENTER_CRITICAL();
tmr = KeyDownTmr;
OS_EXIT_CRITICAL();
return (tmr * KEY_SCAN_TASK_DLY);
}
/*$PAGE*/
/*
*********************************************************************************************************
* 滚欺俊 胶牡内靛啊 历厘登绢 乐绰 瘤 舅酒晨
*
* 汲疙 : 捞 窃荐绰 虐啊 喘妨廉 乐菌绰 瘤甫 犬牢茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : TRUE 虐啊 喘妨脸带 版快
* FALSE 虐啊 喘妨瘤瘤 臼疽带 版快
*********************************************************************************************************
*/
BOOLEAN KeyHit (void)
{
BOOLEAN hit;
OS_ENTER_CRITICAL();
hit = (BOOLEAN)(KeyNRead > 0) ? TRUE : FALSE;
OS_EXIT_CRITICAL();
return (hit);
}
/*
*********************************************************************************************************
* 虐焊靛 檬扁拳
*
* 汲疙 : 虐焊靛 檬扁拳 窃荐. KeyInit()绰 虐焊靛 包访等 荤侩磊 窃荐甫 龋免窍扁 傈俊 馆靛矫 弥檬肺
* 龋免登绢具 茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : 绝澜
*********************************************************************************************************
*/
void KeyInit (void)
{
KeySelRow(KEY_ALL_ROWS); /* 葛电 青阑 急琶茄促 */
KeyScanState = KEY_STATE_UP; /* 虐焊靛 胶某醋 怕胶农狼 檬扁惑怕甫 技飘茄促 */
KeyNRead = 0; /* 佬囚柳 虐狼 荐甫 历厘窍绰 函荐 檬扁拳 */
KeyDownTmr = 0;
KeyBufInIx = 0; /* 历厘瞪 胶牡内靛绰 滚欺狼 贸澜何磐 矫累凳 */
KeyBufOutIx = 0; /* 佬囚龙 胶牡内靛绰 滚欺狼 贸澜何磐 矫累凳 */
KeySemPtr = OSSemCreate(0); /* 虐焊靛 技付器绢 檬扁拳 */
KeyInitPort(); /* 虐焊靛 靛扼捞滚俊辑 荤侩登绰 I/O器飘 檬扁拳 */
OSTaskCreate(KeyScanTask, (void *)0, &KeyScanTaskStk[KEY_SCAN_TASK_STK_SIZE], KEY_SCAN_TASK_PRIO);
}
/*$PAGE*/
/*
*********************************************************************************************************
* SEE IF KEY PRESSED
*
* 汲疙 : 捞 窃荐绰 泅犁 虐啊 喘妨廉 乐绰 瘤甫 舅酒辰促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : TRUE 虐啊 喘妨柳 版快
* FALSE 虐啊 喘妨瘤瘤 臼篮 版快
* 畴飘 : (1 << KEY_MAX_COLS) - 1 绰 凯涝仿阑 盒府窍扁 困秦 荤侩登绰 付胶农 蔼捞促
* (i.e. mask off the SHIFT keys).
*********************************************************************************************************
*/
static BOOLEAN KeyIsKeyDown (void)
{
if (KeyGetCol() & ((1 << KEY_MAX_COLS) - 1)) { /* 0捞搁 虐啊 喘妨瘤瘤 臼澜阑 狼固 */
OS_ENTER_CRITICAL();
KeyDownTmr++; /* 虐促款 墨款磐甫 刘啊茄促 */
OS_EXIT_CRITICAL();
return (TRUE);
} else {
return (FALSE);
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 虐焊靛 胶某醋 怕胶农
*
* 汲疙 : 捞 窃荐绰 虐焊靛 胶某醋 怕胶农促. 捞 怕胶农狼 快急鉴困绰 撤霸 且寸蹬具 窍哥
* 胶某醋 林扁绰 KEY_SCAN_TASK_DLY俊 狼秦 搬沥等促
* 傈崔牢磊 : 'data' 怕胶农啊 积己瞪 锭 傈崔登绰 牢磊狼 器牢磐(荤侩登瘤绰 臼澜)
* 府畔蔼 : KeyScanTask()绰 汗蓖登瘤 臼绰促
* 畴飘 : KEY_RPT_START_DLY焊促 坷阀悼救 虐啊 喘妨廉 乐绰 版快 磊悼馆汗 扁瓷捞 悼累茄促
* 老窜 磊悼馆汗 扁瓷捞 矫累登搁 虐啊 喘妨廉 乐绰 茄 KEY_RPT_DLY付促 馆汗等促
* 抗甫 甸搁, 虐焊靛 胶某醋捞 50msec付促 荐青登绊 KEY_RPT_START_DLY绰 40, KEY_RPT_DLY绰 2肺
* 汲沥登绢 乐促搁, 磊悼馆汗篮 虐甫 穿弗 饶 2檬饶俊 矫累登绊 100msec付促 虐啊 馆汗瞪 巴捞促
*
*
*********************************************************************************************************
*/
/*$PAGE*/
static void KeyScanTask (void *data)
{
INT8U code;
data = data; /* 哪颇老矾 版绊甫 乔茄促 (uC/OS-II req.) */
for (;;) {
OSTimeDlyHMSM(0, 0, 0, KEY_SCAN_TASK_DLY); /* 虐焊靛 胶某醋 掉饭捞 */
switch (KeyScanState) {
case KEY_STATE_UP: /* 虐啊 喘妨廉 乐绰 瘤甫 犬牢且 鞘夸啊 乐澜 */
if (KeyIsKeyDown()) { /* 虐喘覆阑 犬牢茄促 */
KeyScanState = KEY_STATE_DEBOUNCE; /* 叼官款胶 胶抛捞飘肺 惑怕 函版 */
KeyDownTmr = 0; /* 虐促款 鸥捞赣甫 府悸 */
}
break;
case KEY_STATE_DEBOUNCE: /* 虐 喘覆, 胶牡内靛甫 犬牢 */
if (KeyIsKeyDown()) { /* 虐啊 喘啡绰啊? */
code = KeyDecode(); /* 喘赴 虐狼 胶牡内靛甫 舅酒辰促 */
KeyBufIn(code); /* 胶牡内靛甫 滚欺俊 历厘 */
KeyRptStartDlyCtr = KEY_RPT_START_DLY;/* 磊悼馆汗 扁瓷阑 矫累窍扁 困秦 掉饭捞 矫累*/
KeyScanState = KEY_STATE_RPT_START_DLY;
} else {
KeySelRow(KEY_ALL_ROWS); /* 葛电 青阑 急琶 */
KeyScanState = KEY_STATE_UP; /* 虐啊 喘妨廉 乐瘤 臼促 */
}
break;
case KEY_STATE_RPT_START_DLY:
if (KeyIsKeyDown()) { /* 酒流档 虐啊 喘妨廉 乐绰啊? */
if (KeyRptStartDlyCtr > 0) { /* 磊悼馆汗 扁瓷 矫累傈俊 掉饭捞啊 鞘夸茄啊?*/
KeyRptStartDlyCtr--; /* 抗, 磊悼馆汗 矫累阑 困秦 墨款磐甫 皑家 */
if (KeyRptStartDlyCtr == 0) { /* 磊悼馆汗阑 困茄 掉饭捞啊 肯丰登菌绰啊?...*/
code = KeyDecode(); /* 胶牡内靛甫 舅酒辰促 */
KeyBufIn(code); /* 滚欺俊 胶牡内靛甫 历厘茄促 */
KeyRptDlyCtr = KEY_RPT_DLY; /* 促澜 馆汗阑 困茄 掉饭捞 蔼阑 肺靛 */
KeyScanState = KEY_STATE_RPT_DLY;
}
}
} else {
KeyScanState = KEY_STATE_DEBOUNCE; /* 虐啊 喘妨廉 乐瘤 臼促 */
}
break;
case KEY_STATE_RPT_DLY:
if (KeyIsKeyDown()) { /* 酒流档 虐啊 喘妨廉 乐绰啊? */
if (KeyRptDlyCtr > 0) { /* 虐 馆汗傈俊 扁促副 鞘夸啊 乐绰啊? */
KeyRptDlyCtr--; /* 抗, 皑家窍绊 促澜 虐馆汗阑 扁促赴促 */
if (KeyRptDlyCtr == 0) { /* 虐甫 馆汗且 锭牢啊 */
code = KeyDecode(); /* 胶牡内靛甫 舅酒辰促 */
KeyBufIn(code); /* 胶牡内靛甫 历厘茄促 */
KeyRptDlyCtr = KEY_RPT_DLY; /* 磊悼馆汗俊 鞘夸茄 掉饭捞 蔼阑 府肺靛茄促 */
}
}
} else {
KeyScanState = KEY_STATE_DEBOUNCE; /* 虐啊 喘妨廉 乐瘤 臼澜 */
}
break;
}
}
}
/*$PAGE*/
/*
*********************************************************************************************************
* 凯 佬扁
*
* 汲疙 : 捞 窃荐绰 凯 器飘甫 佬扁困秦 龋免等促
* 傈崔牢磊 : 绝澜
* 府畔蔼 : 凯 器飘狼 哪敲府刚飘 捞骨肺 1狼 蔼阑 爱绰 厚飘俊 秦寸窍绰 凯捞 喘妨咙
*********************************************************************************************************
*/
#ifdef ORIGINAL_DRIVER
INT8U KeyGetCol (void)
{
return (~inp(KEY_PORT_COL)); /* Complement columns (1捞 虐啊 喘啡澜阑 狼固) */
}
#else
INT8U KeyGetCol (void)
{
INT8U val;
val = ioport1;
val = ~val;
val >>= 4;
val &= 0x07;
return val;
}
#endif
/*
*********************************************************************************************************
* I/O 器飘 檬扁拳
*********************************************************************************************************
*/
#ifdef ORIGINAL_DRIVER
void KeyInitPort (void)
{
outp(KEY_PORT_CW, 0x82); /* 82C55檬扁拳 : A=免仿, B=涝仿(凯), C=免仿(青) */
}
#else
void KeyInitPort (void)
{
}
#endif
/*
*********************************************************************************************************
* 青 急琶
*
* 汲疙 : 捞 窃荐绰 虐焊靛狼 青阑 急琶窍扁 困秦 龋免等促
* 傈崔牢磊 : row 绰 青狼 荐甫 富窃(0..7) 肚绰 KEY_ALL_ROWS
* 府畔蔼 : 绝澜
* Note : 阿 青篮 0阑 免仿窃栏肺结 急琶凳
*********************************************************************************************************
*/
#ifdef ORIGINAL_DRIVER
void KeySelRow (INT8U row)
{
if (row == KEY_ALL_ROWS) {
outp(KEY_PORT_ROW, 0x00); /* 葛电 青阑 0栏肺 免仿窃 */
} else {
outp(KEY_PORT_ROW, ~(1 << row)); /* 盔窍绰 青父 0栏肺 免仿窃 */
}
}
#else
void KeySelRow (INT8U row)
{
if (row == KEY_ALL_ROWS) {
ioport1 = 0xf0; /* 葛电 青阑 0栏肺 免仿窃 */
} else {
row = ~(1 << row);
row |= 0xf0;
ioport1 = row; /* 盔窍绰 青父 0栏肺 免仿窃 */
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -