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

📄 ps2_key.c

📁 ps2键盘动态扫描程序
💻 C
字号:

#include<iom128v.h>
#include<macros.h>
#define  ASK           (PINE&0X40)
#define  SBT_ANSWER    PORTE|=BIT(PORTE7)
#define  CLR_ANSWER    PORTE&=~BIT(PORTE7)
#define  SBT_RESET     PORTC|=BIT(PORTC3)
#define  CLR1_RESET    PORTC&=~BIT(PORTC3)
#define  DPORT_A       PORTA
#define  DATA1          0x20
unsigned char dat=0,flag=0;
unsigned char count=0;
unsigned char DisNumx=0,DisNumy=0, Shift=0,Key_UP=0;
unsigned char  UnShifted[60][2] = {
0x1C, 'a',
0x32, 'b',
0x21, 'c',
0x23, 'd',
0x24, 'e',
0x2B, 'f',
0x34, 'g',
0x33, 'h',
0x43, 'i',
0x3B, 'j',
0x42, 'k',
0x4B, 'l',
0x3A, 'm',
0x31, 'n',
0x44, 'o',
0x4D, 'p',
0x15, 'q',
0x2D, 'r',
0x1B, 's',
0x2C, 't',
0x3C, 'u',
0x2A, 'v',
0x1D, 'w',
0x22, 'x',
0x35, 'y',
0x1A, 'z',
0x45, '0',
0x16, '1',
0x1E, '2',
0x26, '3',
0x25, '4',
0x2E, '5',
0x36, '6',
0x3D, '7',
0x3E, '8',
0x46, '9',
0x0E, '`',
0x4E, '-',
0x55, '=',
0x5D, '\\',
0x29, ' ',
0x54, '[',
0x5B, ']',
0x4C, ';',
0x52, '\'',
0x41, ',',
0x49, '.',
0x4A, '/',
0x71, '.',
0x70, '0',
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
0x0d, ' ',
};

unsigned char  Shifted[59][2] = {
0x1C, 'A',
0x32, 'B',
0x21, 'C',
0x23, 'D',
0x24, 'E',
0x2B, 'F',
0x34, 'G',
0x33, 'H',
0x43, 'I',
0x3B, 'J',
0x42, 'K',
0x4B, 'L',
0x3A, 'M',
0x31, 'N',
0x44, 'O',
0x4D, 'P',
0x15, 'Q',
0x2D, 'R',
0x1B, 'S',
0x2C, 'T',
0x3C, 'U',
0x2A, 'V',
0x1D, 'W',
0x22, 'X',
0x35, 'Y',
0x1A, 'Z',
0x45, '0',
0x16, '1',
0x1E, '2',
0x26, '3',
0x25, '4',
0x2E, '5',
0x36, '6',
0x3D, '7',
0x3E, '8',
0x46, '9',
0x0E, '~',
0x4E, '_',
0x55, '+',
0x5D, '|',
0x29, ' ',
0x54, '{',
0x5B, '}',
0x4C, ':',
0x52, '"',
0x41, '<',
0x49, '>',
0x4A, '?',
0x71, '.',
0x70, '0',
0x69, '1',
0x72, '2',
0x7A, '3',
0x6B, '4',
0x73, '5',
0x74, '6',
0x6C, '7',
0x75, '8',
0x7D, '9',
};

 void delay(unsigned char n)
  {
    unsigned char i;
    for(;n>0;n--)
        for(i=0;i<200;i++);
 }
/**************************************/
  void initail_ocmj(void)
  { 
    MCUCR=0X00;
   DDRA=0XFF;
   DPORT_A=0XFF;
   DDRE=0X80;      ///PORTE.7作为输出脚
   DDRD=0XFF;
   PORTD=0XfF;
   PORTE=0Xff;
   DDRC=0X08;
   CLR1_RESET;
   delay(100);
   SBT_RESET;
   CLR_ANSWER;
   delay(100);
 }
 /***************************************/ 
  void ocmj_write(unsigned char adata)
   {
      while(ASK);
     DPORT_A=adata;
     _NOP();
    SBT_ANSWER;
    _NOP();
    while(ASK==0);
    CLR_ANSWER;
  }
  
  
 void write_asiic(unsigned char x,unsigned char y,unsigned char asc_p)
        {
	          x+=4;
              ocmj_write(0xf1);
		      ocmj_write(x);
	      	 ocmj_write(y);
		     ocmj_write(asc_p);
		
		 }	
 /********************************************/ 
 
 
 /* 
   void write_lcd_word(unsigned char x,unsigned char y,unsigned char *p)
             /// x:0x00~0x07 y:0x00~0x03  
      { //unsigned char i=0,j=0;
        ocmj_write(0xf0);
        ocmj_write(x);
        ocmj_write(y);
        ocmj_write(*p);
         p++;
        ocmj_write(*p);
      }
*/
/**********************************************/
  void  DisplayListChar(unsigned char x,unsigned char y)
     {
        unsigned char i,asc_p;
         asc_p=' ';
       x+=4;
       for(i=0;i<16;i++)
          {   ocmj_write(0xf1);
		      ocmj_write(x+i);
		      ocmj_write(y);
		      ocmj_write(asc_p);
	      }
		  
        }	
     


   
#pragma interrupt_handler PS2_KEY:6 //PE4中断
 
  void PS2_KEY(void)
  {
   
    if((count>0)&&(count<9))
              {  
			    dat=dat>>1;
          if(PINE&DATA1)//PE5数据
	         dat|=0x80;
              }
         count++;
		
		 while(!(PINE&0X10));	

   if(count>10)
           {
              count=0;
              flag=1;
              EIMSK=0x00;
			
           }
		 
			 
  }

  
 
   void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码+shift的断码+G的断码
   {
	unsigned char TempCyc;	

	if (!Key_UP)                //当键盘松开时
		{
			switch (ScanCode)
				{
					case 0xF0 :	                // 当收到0xF0,Key_UP置1表示断码开始
						Key_UP = 1;
					        break;

					case 0x12 :	                  // 左 SHIFT
						  Shift = 1;
					         break;
							 
          case 0x0d :	  Shift=~Shift;break;
					case 0x59 :	                 // 右 SHIFT
						      Shift = 1;
					            break;
					case 0x71 :		//DEL键	
	
					 {  write_asiic(DisNumx, DisNumy, UnShifted[40][1]);
					    DisNumx--;
					    break;
					 }	

					default:						
							if (DisNumx > 15)
							{
                               DisNumy=DisNumy+8;
                                if( DisNumy==64)DisNumy=0;
								DisplayListChar(0, DisNumy);//清LCD第二行
                                 DisNumx=0;
								 
								
                             }
						if(!Shift)	//如果SHIFT没按下
							{
								for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
								if (UnShifted[TempCyc][0] == ScanCode) 
                                   {  write_asiic(DisNumx, DisNumy, UnShifted[TempCyc][1]);
								      DisNumx++;
									 								 
                                  }
							} 
						else  //按下SHIFT
							{
								for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
								if (Shifted[TempCyc][0] == ScanCode) 
                                     {  write_asiic(DisNumx, DisNumy, Shifted[TempCyc][1]);
								        DisNumx++;
                                     } 
							}

					break;
				}
		}
	else
		{	
			Key_UP = 0;
			switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
				{
					case 0x12 :	// 左 SHIFT
						Shift = 0;
					break;
                    
					case 0x59 :	// 右 SHIFT
						Shift = 0;
					break;
				}
		}
	flag = 0; //标识字符处理完了
} 

   
   void initial_Exinterup(void)
       {
	   DDRE&=~BIT(4);
	   DDRE&=~BIT(5);
	   PORTE|=BIT(4);
	   PORTE|=BIT(5);
	   
         SREG=0X80;
	     MCUCR=0X00;
		 EICRB=0X00; 
         EIMSK=0X10;
		 
       }

/**********************ie************************/

     void main(void)
        {
        
          initail_ocmj();
          ocmj_write(0xf4);     
          initial_Exinterup();
               
           do
		  {
			     if (flag)
				     Decode(dat);
			 else
				  EIMSK=0X10; //开中断
				    
				
				
		  }  while(1);
	         
        }




⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -