⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 keypro.c

📁 一个LCD TV的源程序, 用的是realtek的IC
💻 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 + -