?? key_scan.c
字號(hào):
#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; //鍵掃描時(shí)間
BYTE xdata PreTimeKeyPressed; //上一次鍵是否按下
BYTE xdata WhichKey; //按下了什么鍵
BYTE xdata IndexInWhichKey; //采用這個(gè)鍵的第幾個(gè)鍵值
BYTE xdata TimeIntervalOfNoKeyPress; //沒(méi)有鍵按下的時(shí)間間隔
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;
}
//是否處于按下?tīng)顟B(tài)
BYTE IsKeyPressed()
{
//373給高低電平
KeyOutPort = 0;
KeyPort0 = 1;
KeyPort1 = 1;
//輸入端口是否出現(xiàn) 0
if(KeyPort0 == 0 || KeyPort1 == 0)
return TRUE;
else
return FALSE;
}
BYTE GetKey()
{
BYTE i,veil;
KeyPort0 = 1;
KeyPort1 = 1;
//假設(shè)鍵值,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;
//檢測(cè)是否ScanKeyInterval==0
if(ScanKeyInterval != 0)
return SCAN_KEY_NO_KEY_PRESSED;
else
{
#ifdef KEY_DEBUG
printf(".");
#endif
//是則表明從上次檢測(cè)到鍵盤(pán)按下一個(gè)SCAN_KEY_INTERVAL時(shí)間已到
//將ScanKeyInterval置成SCAN_KEY_INTERVAL
ScanKeyInterval = SCAN_KEY_INTERVAL;
tWhichKey = GetKey();
//檢測(cè)鍵盤(pán)是否按下,而且鍵值要有效(防止后面出錯(cuò))
if(IsKeyPressed() && (tWhichKey >= 0 && tWhichKey < KEY_NUM))
{
#ifdef KEY_DEBUG
printf("\npressed");
#endif
//檢測(cè)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;
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -