📄 key_scan.c
字号:
#include "GloblDef.h"
#include "key.h"
struct SKeyValue xdata KeyValue[KEY_NUM]={
{1,{0}}, //功能键1 KEY_FUN1
{1,{1}}, //退格键 KEY_C
{1,{2}}, //功能键2 KEY_FUN2
{2,{'1','.'}},
{4,{'2','a','b','c'}},
{4,{'3','d','e','f'}},
{4,{'4','g','h','i'}},
{4,{'5','j','k','l'}},
{4,{'6','m','n','o'}},
{5,{'7','p','q','r','s'}},
{4,{'8','t','u','v'}},
{5,{'9','w','x','y','z'}},
{1,{'0'}}
};
BYTE xdata ScanKeyInterval; //键扫描时间
BYTE xdata PreTimeKeyPressed; //上一次键是否按下
BYTE xdata WhichKey; //按下了什么键
BYTE xdata IndexInWhichKey; //采用这个键的第几个键值
BYTE xdata TimeIntervalOfNoKeyPress; //没有键按下的时间间隔
BYTE xdata KeyOutPort _at_ KEY_ADDRESS;
sbit KeyPort0 = KEY_PORT0;
sbit KeyPort1 = KEY_PORT1;
void KeyInitial()
{
ScanKeyInterval = 0;
PreTimeKeyPressed = FALSE;
WhichKey = 0;
IndexInWhichKey = 0;
TimeIntervalOfNoKeyPress = 0;
}
//是否处于按下状态
BYTE IsKeyPressed()
{
//373给高低电平
KeyOutPort = 0;
KeyPort0 = 1;
KeyPort1 = 1;
//输入端口是否出现 0
if(KeyPort0 == 0 || KeyPort1 == 0)
return TRUE;
else
return FALSE;
}
BYTE GetKey()
{
BYTE i,veil;
KeyPort0 = 1;
KeyPort1 = 1;
//假设键值,port0为0-7,port1为8-15
for(i = 0, veil = 0xFE; i < 8; i++, veil <<= 1)
{
KeyOutPort = veil;
if(KeyPort0 == 0 || KeyPort1 == 0)
break;
}
if(KeyPort1 == 0)
i += 8;
return i;
}
// 返回ASCII码
BYTE GetKeyValue()
{
return KeyValue[WhichKey].value[IndexInWhichKey];
}
BYTE ScanKey()
{
BYTE tWhichKey;
//检测是否ScanKeyInterval==0
if(ScanKeyInterval != 0)
return SCAN_KEY_NO_KEY_PRESSED;
else
{
#ifdef KEY_DEBUG
printf(".");
#endif
//是则表明从上次检测到键盘按下一个SCAN_KEY_INTERVAL时间已到
//将ScanKeyInterval置成SCAN_KEY_INTERVAL
ScanKeyInterval = SCAN_KEY_INTERVAL;
tWhichKey = GetKey();
//检测键盘是否按下,而且键值要有效(防止后面出错)
if(IsKeyPressed() && (tWhichKey >= 0 && tWhichKey < KEY_NUM))
{
#ifdef KEY_DEBUG
printf("\npressed");
#endif
//检测PreTimeKeyPressed是否为0
if(PreTimeKeyPressed == TRUE)
{
return SCAN_KEY_NO_KEY_PRESSED;
}
else
{
//是则表明这是一次新的按下
#ifdef KEY_DEBUG
printf("\nagain");
#endif
PreTimeKeyPressed = TRUE;
if(tWhichKey == WhichKey && TimeIntervalOfNoKeyPress > 0)
{
#ifdef KEY_DEBUG
printf("\nshift");
#endif
//是,改变键值
IndexInWhichKey++;
if(IndexInWhichKey == KeyValue[WhichKey].ValueNum)
IndexInWhichKey = 0;
TimeIntervalOfNoKeyPress = TIME_INTERVAL_CHANGE_KEY_VALUE;
return SCAN_KEY_CHANGE_KEY_VALUE;
}
else
{
//否,新的键
WhichKey = tWhichKey;
IndexInWhichKey = 0;
TimeIntervalOfNoKeyPress = TIME_INTERVAL_CHANGE_KEY_VALUE;
return SCAN_KEY_NEW_KEY_PRESSED;
}
}
}
else
{
//将PreTimeKeyPressed置0
PreTimeKeyPressed = FALSE;
//TimeIntervalOfNoKeyPress减一,最小到0
if(TimeIntervalOfNoKeyPress > 0)
TimeIntervalOfNoKeyPress--;
return SCAN_KEY_NO_KEY_PRESSED;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -