📄 key.c
字号:
#define KEY
#include "includes.h"
void KeyBufIn(unsigned char kcode)
{
EA=0;
if(KeyNRead < KEY_BUF_SIZE)
{
KeyNRead++;
KeyBuf[KeyBufInIx++] = kcode;
if (KeyBufInIx >= KEY_BUF_SIZE)
{
KeyBufInIx = 0;
}
EA=1;
}
else
{
EA=1;
}
}
unsigned char KeyDecode(void)
{
unsigned char col;
unsigned char row;
unsigned char offset;
unsigned char done;
unsigned char col_id;
unsigned char 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)
{
offset += KEY_SHIFT1_OFFSET;
}
if (col & KEY_SHIFT2_MSK)
{
offset += KEY_SHIFT2_OFFSET;
}
if (col & KEY_SHIFT3_MSK)
{
offset += KEY_SHIFT3_OFFSET;
}
*/
msk=0x01;
col_id=0;
done=FALSE;
while(col_id < KEY_MAX_COLS && !done)
{
if (col&msk)
{
done=TRUE;
}
else
{
col_id++;
msk <<= 1;
}
}
// return (row*KEY_MAX_COLS + offset + col_id);
return (row*KEY_MAX_COLS + col_id);
}
/*
void KeyFlush(void)
{
while(KeyHit())
{
KeyGetKey();
}
}
*/
unsigned char KeyGetKey(void)
{
unsigned char kcode;
EA=0;
if(KeyNRead > 0)
{
KeyNRead--;
kcode=KeyBuf[KeyBufOutIx];
KeyBufOutIx++;
if(KeyBufOutIx >= KEY_BUF_SIZE)
{
KeyBufOutIx = 0;
}
EA=1;
return (kcode);
}
else
{
EA=1;
return (0xff);
}
}
/*
unsigned int KeyGetKeyDownTime(void)
{
unsigned int tmr;
EA=0;
tmr = KeyDownTmr;
EA=1;
return(tmr * KEY_SCAN_TASK_DLY);
}
*/
unsigned char KeyHit(void)
{
unsigned char hit;
EA=0;
hit=(unsigned char)(KeyNRead > 0) ? TRUE : FALSE;
EA=1;
return(hit);
}
void KeyInit(void)
{
KeySelRow(KEY_ALL_ROWS);
KeyScanState = KEY_STATE_UP;
KeyNRead = 0;
KeyDownTmr = 0;
KeyBufInIx = 0;
KeyBufOutIx = 0;
}
unsigned char KeyIsKeyDown(void)
{
if (KeyGetCol() & ((1 << KEY_MAX_COLS) - 1))
{
EA=0;
KeyDownTmr++;
EA=1;
return(TRUE);
}
else
{
return (FALSE);
}
}
//键盘扫描任务,定时调用
void KeyScanTask(void)
{
unsigned char kcode;
switch (KeyScanState)
{
case KEY_STATE_UP:
if(KeyIsKeyDown()) //是否有键按下
{
KeyScanState=KEY_STATE_DEBOUNCE;//进入下一状态(判断是否回弹)
KeyDownTmr=0;
}
break;
case KEY_STATE_DEBOUNCE:
if(KeyIsKeyDown()) //键是否仍然按下
{
kcode=KeyDecode(); //键值译吗
KeyBufIn(kcode);
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)
{
kcode=KeyDecode();
KeyBufIn(kcode);
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)
{
kcode=KeyDecode();
KeyBufIn(kcode);
KeyRptDlyCtr = KEY_RPT_DLY;//重装计数值
}
}
}
else
{
KeyScanState = KEY_STATE_DEBOUNCE;
}
break;
}
}
unsigned char KeyGetCol(void)
{
unsigned char i;
i=XBYTE[0x7f1d];
return (~i);
}
void KeySelRow(unsigned char row)
{
if(row == KEY_ALL_ROWS)
{
XBYTE[0x7f1d]=0x00;
}
else
{
XBYTE[0x7f1d]=~(1<<row);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -