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

📄 keyboard.c

📁 液晶6963模块 240*64,外接PS2键盘,多级菜单.这是我工作中的一个程序,有兴趣的可以看
💻 C
字号:
/******************************************/
/*           广州天河双龙电子公司         */
/*           http://www.sl.com.cn         */
/*              PS2键盘驱动程序           */
/*            作者:ntzwq@wx88.net         */
/*               2002年5月11日            */
/*  目标MCU:MEGA8   晶振:外部(EXT) 8MHZ   */
/******************************************/
/******************************************/
/*			经过改动移植到51芯片上  	  */
/*			改动者:jifeng                 */
/******************************************/

#include <REG52.h>
#include "scancodes.h"
#define BUFF_SIZE 64
unsigned char bitcount;  
unsigned char xdata kb_buffer[BUFF_SIZE];
unsigned char input=0;
unsigned char output=0;
sbit PINDATA= P1^0; //连接数据线
unsigned char Temp_Key;

 //使用软件模拟FIFO
void put_kbbuff(unsigned char c)
{
  kb_buffer[input]=c;
  if (input<(BUFF_SIZE-1))
     input++; 
  else
     input=0;	 
}
//从缓冲区读取键值
unsigned char getchar(void)
{
   unsigned char temp;
   if(output==input)
       return 0;
   else
      {
	   temp=kb_buffer[output];
	   if(output<(BUFF_SIZE-1))
	     {
		  output++;
		 }
	   else
	     output=0;
	   return temp;	  
	  }	     
}
//初始化
void init_kb(void)
{
	IT1 = 1;//下降延触发
	EX1 = 1;
	PX1 = 0;
	EA=1;
    bitcount = 11;
}  
//键值分析
void decode(unsigned char sc)	  
    {
      static unsigned char shift,shiftup,alt,altup,up;

	  unsigned char i;
	  if (sc==0xf0)
	      {
		   up=1;
		   return;
		  }
	  if (up==1)
	  	  {
		   up=0;
		   if ((sc==0x12)||(sc==0x59)) shift=0;
		   if (sc==0x11) alt=0;
		   return;
		  }	 
	  switch (sc)
	    {
		 case 0x11:
		 {	  alt=1;		
			  altup=1;
		 }break;		           
		 case 0x12:{
		 			if((Temp_Key==0xe0)||(Temp_Key==0xf0))  //按键PRINT出现的特殊情况
					{	put_kbbuff(27);
					}
					else
					{	shift=1;		
						shiftup=1;
					}
		           }break;		           
		 case 0x59:{
		 				shift=1;		
						shiftup=1;
		           }
					break;		           
		 default:{
		          if ((shift==0)&&(alt==0))
					 {
					 for(i = 0;i<90; i++)
                     {	if (unshifted[i][0] == sc)
						{ 	if(((Temp_Key==0xe0)||(Temp_Key==0xf0))&&(sc==0x7c))	{}
							else	
							{	if(((Temp_Key==0xe0)||(Temp_Key==0xf0))&&(sc==0x71))
									put_kbbuff(15);	 
								else put_kbbuff(unshifted[i][1]);	 
							}
							i=90;
						}
						
					 }
					}	
				  else if((shift==1)&&(alt==0))		   //使用SHIFT+字母的方式,输入大写字母
				  {
					 for(i = 0;shifted[i][0]!=sc && shifted[i][0]; i++);
                     	if (shifted[i][0] == sc)
                         {
						  put_kbbuff(shifted[i][1]);						  
						 }
				 } 			
				  else if((shift==0)&&(alt==1))   //使用ALT+字母的方式,用于焦点的跳转
				  {
					 for(i = 0;alted[i][0]!=sc && alted[i][0]; i++);
                     	if (alted[i][0] == sc)
                         {
						  put_kbbuff(alted[i][1]);						  
						 }
				 }		
        	 }		         
  		} 	
}
//键盘信息接收,使用中断 ,连接时钟线
void Key_isr() interrupt 2
{
    static unsigned char dat;
    switch (bitcount)
	  {
	   case 11:{
	            //if ((PIN_KB&(1<<DATAPIN))!=0)
				if (PINDATA!=0)
				     return;
			    else		 
	   			    bitcount--;
	    		break;
				}
	   case 2:{
	   			bitcount--;	   		   
			    break;
				}
	   case 1:{
	   			bitcount--;	 
	            //if ((PIN_KB&(1<<DATAPIN))!=0)
				if (PINDATA==0)
				    {
					 bitcount=11;
					 return;
					}
				else
				   {
				    bitcount=11;
					decode(dat);
					Temp_Key=dat;
				   }	  
	   	        break;
				}
	   default:{
	   	        dat = (dat >> 1);
	            //if ((PIN_KB&(1<<DATAPIN))!=0)
				if (PINDATA!=0)
                    dat|=0x80;
				bitcount--;
	            }		
	  }		 		 	  	
} 




⌨️ 快捷键说明

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