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

📄 keyscan.cpp

📁 湖北水文黄石试点集中器代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -