📄 keypro.c
字号:
//*****************************************************************************
// KEYPROC.C
// date : 2001/07/15
//*****************************************************************************
#include <reg52.h> /* special function register declarations */
/* for the intended 8051 derivative */
#include <stdio.h> /* prototype declarations for I/O functions */
#include <intrins.h>
#define _def_keyproc
#include "uSYSTEM.h"
#include inc_struc
#include inc_uSYS
#include inc_main
#include inc_proc
#include inc_menu
#include inc_macro
BYTE code cVerKeyProc[] = "A2";
//*****************************************************************************************
// define constant :
//*****************************************************************************************
#define cMakeDebunce 2 // 48ms at 16ms.
#define cRepeatDelay 31 // 500ms at 16ms.
#define cRepeatDebunce 16 // 250ms at 16ms.
#define cBreakDebunce 2 // 32ms at 16ms.
#define cDoubleDebunce 31 // 500ms at 16ms.
#ifndef cKeyHideBreak
#define cKeyHideBreak 0 // 1 = hide break out if double click occur.(break delay out)
#endif
//*****************************************************************************************
// define local variables :
//*****************************************************************************************
BYTE idata gKeyState; // KeyPad read state machine
BYTE idata gKeyScan; // Key scan code.
BYTE idata gKeyCode; // Key code
BYTE idata gKeyAttr; // Key attribute
BYTE idata gRepeatDebunce;
void code* ptQkMenuItem;
//PMenuItems ptQkMenuItem;
//struct _MenuKeyProc code* idata ptKeyProc;
PMenuKeyProc idata ptKeyProc;
//*****************************************************************************************
// KeyProess subroutine
//*****************************************************************************************
void sKeyMPro(){ // process a matrix of Keycode
// struct _MenuKeyProc *ptKeyProc;
struct _MenuKeyProc* idata tmpKeyProc;
if (gKeyAttr){
if (gKeyCode != 0xff) {
// ptKeyProc = ptMenuItem->pKeyProc;
tmpKeyProc = ptKeyProc;
while (tmpKeyProc->iKeyCode != 0xff) {
if ((gKeyCode == tmpKeyProc->iKeyCode) && (gKeyAttr & tmpKeyProc->iKeyAttr)) {
gMenuCount = gMenuTimer;
ptQkMenuItem = tmpKeyProc->QkNode;
tmpKeyProc->KeyProc();
break;
} else tmpKeyProc += 1;
}
if (tmpKeyProc->iKeyCode == 0xff)
tmpKeyProc->KeyProc();
}
gKeyAttr = 0;
}
}
//*****************************************************************************************
// key pad process :
// OUT : gKeyCode
// gKeyAttr = cAttrMake : key pressed.
// = cAttrBreak : key release.
// = cAttrRepeatFast : key pressed more then 300ms & send every 250ms.
// = cAttrRepeatSlow : key pressed more then 300ms & send every 500ms.
// = cAttrLongMake : key pressed more then 1s.
// = cAttrDouble : key release less then 500ms & pressed again.
//*****************************************************************************************
void sReadKey(){
if (fProcFlag & !fKeyLock) {
iTmpD0.b[0] = sKeySnap();
switch (gKeyState & 0xe0){
case 0x00 : // wait for key pressed.
fDoubClick = 0;
if (iTmpD0.b[0] != 0xff){
gKeyScan = iTmpD0.b[0];
gKeyState = 0x20 | cMakeDebunce;
}
break;
case 0x20 : // wait for make.
if (iTmpD0.b[0] == gKeyScan){
if ((--gKeyState & 0x1f) == 0){
gKeyState = 0x40 | cRepeatDelay;
gRepeatDebunce = cRepeatDebunce;
sConvertKeyCode();
if (gKeyCode != 0xff){
if (fDoubClick)
gKeyAttr = cAttrMake | cAttrDouble;
else
gKeyAttr = cAttrMake;
}
}
} else gKeyState = 0x00;
break;
case 0x40 : // wait for repeat - 1.
if (iTmpD0.b[0] == gKeyScan){
if ((--gKeyState & 0x1f) == 0){
gKeyState = 0x60 | gRepeatDebunce;
gKeyAttr = cAttrRepeatFast | cAttrRepeatSlow;
}
} else gKeyState = 0xc0 | cBreakDebunce;
break;
case 0x60 : // wait for repeat - 2.
if (iTmpD0.b[0] == gKeyScan){
if ((--gKeyState & 0x1f) == 0){
gKeyState = 0x80 | gRepeatDebunce;
gKeyAttr = cAttrRepeatFast;
}
} else gKeyState = 0xc0 | cBreakDebunce;
break;
case 0x80 : // wait for repeat - 3 & delay.
if (iTmpD0.b[0] == gKeyScan){
if ((--gKeyState & 0x1f) == 0){
gKeyState = 0xa0 | gRepeatDebunce;
gKeyAttr = cAttrRepeatFast | cAttrRepeatSlow;
}
} else gKeyState = 0xc0 | cBreakDebunce;
break;
case 0xa0 : // wait for repeat - 3 & delay.
if (iTmpD0.b[0] == gKeyScan){
if ((--gKeyState & 0x1f) == 0){
gKeyState = 0x40 | gRepeatDebunce;
if (gRepeatDebunce == cRepeatDebunce) gKeyAttr = cAttrRepeatFast | cAttrLongMake;
else gKeyAttr = cAttrRepeatFast;
if (gRepeatDebunce > 4) gRepeatDebunce -= 4;
}
} else gKeyState = 0xc0 | cBreakDebunce;
break;
case 0xc0 : // wait for break.
if (iTmpD0.b[0] != gKeyScan){
if ((--gKeyState & 0x1f) == 0){
gKeyState = 0xe0 | cDoubleDebunce;
#if cKeyHideBreak == 0
if (iTmpD0.b[0] == 0xff)
gKeyAttr = cAttrBreak;
#endif
}
} else
gKeyState = 0x40 | cRepeatDebunce;
break;
case 0xe0 : // wait for double click
if (iTmpD0.b[0] == 0xff){
if ((--gKeyState & 0x1f) == 0) {
gKeyState = 0x00;
#if cKeyHideBreak == 1
gKeyAttr = cAttrBreak;
#endif
}
} else {
if (iTmpD0.b[0] == gKeyScan){
fDoubClick = 1;
gKeyState = 0x20 | cMakeDebunce;
} else {
gKeyState = 0x00;
#if cKeyHideBreak == 1
iTmpD0.b[0] ^= 0xff;
gKeyScan ^= 0xff;
iTmpD0.b[0] &= gKeyScan;
if (iTmpD0.b[0] == 0x00)
gKeyAttr = cAttrBreak;
#endif
}
}
break;
}
iDataIF.w = 0xff00;
sReadDirectKey();
if (iDataIF.b[0] != 0xff) {
gKeyCode = iDataIF.b[0];
gKeyAttr = iDataIF.b[1];
}
}
}
//*********************************************************
// convert scan code to key code.
// IN : gKeyScan
// tKeyCode[]
// OUT : gKeyCode.
//*********************************************************
void sConvertKeyCode(){
gKeyCode = 0;
while (tKeyCode[gKeyCode] != 0xff){
if (gKeyScan == tKeyCode[gKeyCode])
return;
gKeyCode++;
}
gKeyCode = 0xff;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -