📄 keyscan.cpp
字号:
#include <stdio.h>
#include <dos.h>
#include "etr232i.h"
//#include "keyisr.h"
#include "keyscan.h"
#include <time.h>
#define PIOMODE0 0xFF70
#define PIODIR0 0xFF72
#define PIODATA0 0xFF74
#define PIOMODE1 0xFF76
#define PIODIR1 0xFF78
#define PIODATA1 0xFF7A
#define ALLHIGH 0x0f
#define DEYTIMETICK 2 //110ms
//enum KEYSTATE { READY, SCAN, CHECK, DELAY };
struct BIOSRAM
{
unsigned char padd1[0x1a];
unsigned int KbBufferHead; // 0x1a
unsigned int KbBufferTail; // 0x1c
unsigned char padd2[0x62]; // 0x1e
unsigned int KbBufferStart; // 0x80
unsigned int KbBufferEnd; // 0x82
};
extern unsigned int DatBit[8];
char DoutTab[8] = { 0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15 };
int KeyCode[4][5] =
{ {0x000f, 0x0118, 0x0119, 0x011a, 0x011b },
{0x0211, 0x0231, 0x0534, 0x0837, 0x0c2a },
{0x0312, 0x0332, 0x0635, 0x0938, 0x0b30 },
{0x1c0d, 0x0433, 0x0736, 0x0a39, 0x0b23 } };
// return = -1: no key
int GetKeyCode( );
int LoadBuffer( unsigned int ScanWord );
/*////////////////////////////////////////////////
Local Variances for Keypad Operation
////////////////////////////////////////////////*/
int KeyPressed;
unsigned int InByte;
unsigned int OutByte;
/*////////////////////////////////////////////////
Local Routines for Keypad Operation
////////////////////////////////////////////////*/
// return = { GPIO7, GPIO5, GPIO3, GPIO1 }
unsigned char GetDIN( )
{
unsigned int ui0, ui1;
unsigned char uc = ALLHIGH;
ui0 = inport(PIODATA0);
ui1 = inport(PIODATA1);
if( (ui0&DatBit[1]) == 0 ) uc &= 0xfe;
if( (ui1&DatBit[3]) == 0 ) uc &= 0xfd;
if( (ui1&DatBit[5]) == 0 ) uc &= 0xfb;
if( (ui1&DatBit[7]) == 0 ) uc &= 0xf7;
return uc;
}
// set Idx => {GPIO4,GPIO2,GPIO0} levels
void PutDOUT( int Idx )
{
unsigned int Dat0, Dat1;
Dat0 = inport( PIODATA0 );
Dat1 = inport( PIODATA1 );
switch( Idx )
{
case 0:
Dat0 = Dat0 & ~(DatBit[0]|DatBit[2]);
Dat1 = Dat1 & ~DatBit[4];
break;
case 1:
Dat0 = (Dat0 | DatBit[0]) & ~DatBit[2];
Dat1 = Dat1 & ~DatBit[4];
break;
case 2:
Dat0 = (Dat0 & ~DatBit[0]) | DatBit[2];
Dat1 = Dat1 & ~DatBit[4];
break;
case 3:
Dat0 = Dat0 | DatBit[0] | DatBit[2];
Dat1 = Dat1 & ~DatBit[4];
break;
case 4:
Dat0 = Dat0 & ~(DatBit[0] | DatBit[2]);
Dat1 = Dat1 | DatBit[4];
break;
case 5:
Dat0 = (Dat0 | DatBit[0]) & ~DatBit[2];
Dat1 = Dat1 | DatBit[4];
break;
case 6:
Dat0 = (Dat0 & ~DatBit[0]) | DatBit[2];
Dat1 = Dat1 | DatBit[4];
break;
default:
Dat0 = Dat0 | DatBit[0]|DatBit[2];
Dat1 = Dat1 | DatBit[4];
}
outport( PIODATA0, Dat0 );
outport( PIODATA1, Dat1 );
unsigned char uc;
if( Idx>7 ) Idx = 7;
uc = DoutTab[Idx];
uc = 0x55&uc;
GPIOWrite( uc );
}
KEYSTATE KeyPadScan( )
{
unsigned int i, i1;
unsigned char Din, Dout;
int ScanWord;
static KEYSTATE KeyState=READY;
static unsigned long startDelayTime=0;
switch( KeyState )
{
case READY:
for( i=0, i1=0; i<5; i++ )//////////////扫描键盘
{
Dout = i;
PutDOUT( Dout );
Din = GetDIN( );
if( Din == ALLHIGH ) continue;
i1 = 1;
break;
}
if( i1 > 0 ) //////////////扫描键盘
{
startDelayTime = clock();
KeyState = DELAY;
KeyPressed = 1;
InByte = Din;
OutByte = Dout;
}
break;
case DELAY:
Din = GetDIN( );
if( Din != ALLHIGH ) startDelayTime = clock();
if( clock()>=(startDelayTime+DEYTIMETICK))
{
KeyState = READY;
PutDOUT( 7 ); //
}
break;
}
return KeyState;
}
/*/////////////////////////////////////////
Public Routines for Key Operation
/////////////////////////////////////////*/
int InitKeyPad( )
{
unsigned int i1, i2;
// init local variances
KeyPressed = 0;
// KeyState = READY;
//SetTMR1( 5000 ); // 5ms
//SetTMR1( 10000 ); // 10ms
/*////////////////////////////////////////////////////////////////////
// Set GPIO0, GPIO2, GPIO4 as Dout[0], Dout[2], Dout[3]
// GPIO1, GPIO3, GPIO5, GPIO7 as Din[0], Din[1], Din[2], Din[3]
////////////////////////////////////////////////////////////////////*/
//GPIODirCfg( GPIOBIT );
i1 = inport( PIOMODE0 );
i2 = inport( PIODIR0 );
i1 = i1 | (DatBit[0]|DatBit[2]); // GPIO0, GPIO2 as output
i1 = i1 & ~DatBit[1]; // GPIO1 as input
i2 = i2 & ~(DatBit[0]|DatBit[2]); // GPIO0, GPIO2 as output
i2 = i2 | DatBit[1]; // GPIO1 as input
outport( PIOMODE0, i1 );
outport( PIODIR0, i2 );
i1 = inport( PIOMODE1 );
i2 = inport( PIODIR1 );
// GPIO3 GPIO5 GPIO7 as input
i1 = i1 & ~(DatBit[3]|DatBit[5]|DatBit[7]);
i1 = i1 | DatBit[4]; // GPIO4 as output
i2 = i2 | DatBit[3] | DatBit[5] | DatBit[7];
i2 = i2 & ~DatBit[4];
outport( PIOMODE1, i1 );
outport( PIODIR1, i2 );
// set GPIO0=GPIO2=GPIO4=1
outport( PIODATA0, inport(PIODATA0)|DatBit[0]|DatBit[2] );
outport( PIODATA1, inport(PIODATA1)|DatBit[4] );
// install interrupt service routines
//InstallISR0( );
return 0;
}
// return = -1: no key
int GetKeyCode( )
{
int i=-1, i1=-1;
if( KeyPressed==0 ) return -1;
switch( InByte )
{
case 0x0e: i = 0; break;
case 0x0d: i = 1; break;
case 0x0b: i = 2; break;
case 0x07: i = 3; break;
}
i1 = OutByte;
KeyPressed = 0;
if( (i<0)||(i1<0 ) ) return -1;
return KeyCode[i][i1];
}
int MulKeyFlg=0;
int Key2TimesCnt=0;
int Key3TimesCnt=0;
int Key4TimesCnt=0;
int Key5TimesCnt=0;
int Key6TimesCnt=0;
int Key7TimesCnt=0;
int Key8TimesCnt=0;
int Key9TimesCnt=0;
int KeyWellSymbolTimesCnt=0;
int KeyStarSymbolTimesCnt=0;
unsigned int Key2ScanTmrCnt=0;
unsigned int Key3ScanTmrCnt=0;
unsigned int Key4ScanTmrCnt=0;
unsigned int Key5ScanTmrCnt=0;
unsigned int Key6ScanTmrCnt=0;
unsigned int Key7ScanTmrCnt=0;
unsigned int Key8ScanTmrCnt=0;
unsigned int Key9ScanTmrCnt=0;
unsigned int KeyWellSymbolScanTmrCnt=0;
unsigned int KeyStarSymbolScanTmrCnt=0;
void KeyScanTmrCnt( )
{
Key2ScanTmrCnt++;
Key3ScanTmrCnt++;
Key4ScanTmrCnt++;
Key5ScanTmrCnt++;
Key6ScanTmrCnt++;
Key7ScanTmrCnt++;
Key8ScanTmrCnt++;
Key9ScanTmrCnt++;
KeyWellSymbolScanTmrCnt++;
KeyStarSymbolScanTmrCnt++;
}
int ReturnKeyCode( )
{
int i, keyvalue=-1;
i = GetKeyCode( );
if( i!=-1 )
{
switch( i )
{
case 0x000f: //printf("Menu");
keyvalue=0x000f;
break;
case 0x0211: //printf("Esc");
keyvalue=0x0211;
break;
case 0x0312: //printf( "Del" );
keyvalue=0x0312;
break;
case 0x1c0d: //printf("Enter");
keyvalue=0x1c0d;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -