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

📄 zifu.c

📁 s52单片机对PS2键盘的输入解码
💻 C
字号:
#include <reg51.h>


#define uint unsigned int
#define uchar unsigned char

#define Ese   0x76				//清屏指令
#define Bksp  0x66				//删除一个指令
#define Cplk  0x58				//双键值区分



sbit Clk=P3^2;                   		//时钟线接在P32
sbit Dat=P3^0;                   		//数据线接在P30

uchar BUF		  =0;					//中断完成标志
uchar Degree      =0;                 	//中断次数
uchar Data        =0;                 	//句路数据
uchar   i         =0;					//采集到的数据在数组中的位置
uchar Update      =0;					//数据更新标志
uchar Caps_Lock   =0;					//双键值区分标志位
char Key_Data[32] ;            			//得到的键盘输入值数组

void  Dispose(void); 

void  Get_Date(void);
/*=====================
 中断函数,负责采集数据
=======================*/
void Get_data(void) interrupt 0 using 1
{
 if((Degree>11)&&(Degree<20))
 	{
		Data=Data>>1;
	 	if(Dat){Data|=0x80;};		
	}                                          	//只用采集到的中间11位的八位数据

 Degree++;
 if(Degree>=33)                       			//32次后重新计数
	{
		Degree=0;
		BUF = 1;                    			//进行数据处理,只在中断中得到数据,不用等待
    }
}

/*=====================================
 数据/指令处理函数,处理得到的数据/指令
======================================*/

void  Dispose(void)
{
 uchar temp ;
 switch(Data)                                            //判断指令的输入
  {
 	case	0x76	 :
		//Write_ZL(0x01) ;
		for(temp=0;temp<32;temp++) Key_Data[temp] = 0 ; 
		i=0;
		P2=Ese ;
		break  ;											//清屏,数组清0
	
	case    0x66:
		i-- ; Update=0;
		Key_Data[i]	= 0 ;               				//删除刚输入的数据
	  	Update = 1;                                    //数据更新标志
		break ;
	
   	case	0x58 :
		Caps_Lock^= 1 ;								//双键值区分标志位改变
		break ;   
	
	default  :Get_Date();
													//处理得到的字符码值
  }	

}

/*=================
 处理得到的字符数据
==================*/

 void Get_Date(void)
{

 if(i>=32) i=0 ;
 
 switch(Data)											//处理得到的字符码值,转化对应的1602码值
 	{
	
		case 0x1C: Key_Data[i]='A';break;
		case 0x32: Key_Data[i]='B';break;
		case 0x21: Key_Data[i]='C';break;
		case 0x23: Key_Data[i]='D';break;
		case 0x24: Key_Data[i]='E';break;
		case 0x2B: Key_Data[i]='F';break;
		case 0x34: Key_Data[i]='G';break;
		case 0x33: Key_Data[i]='H';break;
		case 0x43: Key_Data[i]='I';break;
		case 0x3B: Key_Data[i]='J';break;
		case 0x42: Key_Data[i]='K';break;	
		case 0x4B: Key_Data[i]='L';break;
		case 0x3A: Key_Data[i]='M';break;
		case 0x31: Key_Data[i]='N';break;
		case 0x44: Key_Data[i]='O';break;
		case 0x4D: Key_Data[i]='P';break;
		case 0x15: Key_Data[i]='Q';break;
		case 0x2D: Key_Data[i]='R';break;
		case 0x1B: Key_Data[i]='S';break;
		case 0x2C: Key_Data[i]='T';break;
		case 0x3C: Key_Data[i]='U';break;
		case 0x2A: Key_Data[i]='V';break;
		case 0x1D: Key_Data[i]='W';break;
		case 0x22: Key_Data[i]='X';break;
		case 0x35: Key_Data[i]='Y';break;
		case 0x1A: Key_Data[i]='Z';break;
		case 0x45: Key_Data[i]='0';break;
		case 0x16: Key_Data[i]='1';break;
		case 0x1E: Key_Data[i]='2';break;
		case 0x26: Key_Data[i]='3';break;
		case 0x25: Key_Data[i]='4';break;
		case 0x2E: Key_Data[i]='5';break;
		case 0x36: Key_Data[i]='6';break;
		case 0x3D: Key_Data[i]='7';break;
		case 0x3E: Key_Data[i]='8';break;
		case 0x46: Key_Data[i]='9';break;
		case 0x29: Key_Data[i]=' ';break;
		case 0x41: Key_Data[i]=',';break;
		case 0x49: Key_Data[i]='.';break;
		
	}
 Update=0;
 if(!Caps_Lock)
	Key_Data[i] |= 0x20 ;              					//Caps_Lock未按下则小写
	
  		 i++ ;                                          //计数加一
        Update=1;	
														//数据更新标志
}


//长延时
void Delay400Ms(void)
{
	uchar d=5;
	uint j;
	while(d--)
	{
		j=8269;
		while(j--);
	}
}

	
void main()
{
 uchar m=0;
 IT0=1;
 EA=1;
 EX0=1;
 while(1)
 {
 	
 	if(BUF){Dispose();BUF=0;}
 	if(Update)
	   {    
	   		for(m=0;m<10;m++){P2=Key_Data[m];Delay400Ms();}
			Update=0;
	   }
 }
}

⌨️ 快捷键说明

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