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

📄 shuru.c

📁 s52单片机对PS2键盘的输入解码
💻 C
字号:
/*========================================
 用PS2的小键盘采集三位数据,只能用一般的键
 输入时,先输入的是高位
 当不足三位时要用0补齐
 当输入的是高于三位的数据时,再从高位计起
 =======================================*/

#include<reg51.h>
#define uchar unsigned char


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

uchar Degree      =0;                 //中断次数
uchar Data        =0;                 //句路数据
uchar Data_Over   =0;                 //确定标志位
uchar   i         =0;
uchar Key_Data[3] =0;              //得到的键盘输入值
uchar Get_Key_Data = 0;        //最后得到的数据

void  Dispose(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;
		Dispose();                    //进行数据处理,只在中断中得到数据,不用等待
    }
}

/*===========================
 数据处理函数,处理得到的数据
============================*/
void  Dispose(void)
{
 uchar n=0;
 
 if  (Data==0x77)                                           //收到NUM(确定)
		{
			Get_Key_Data=Key_Data[0]*100
					         +Key_Data[1]*10
					             +Key_Data[2];
			for(n=0;n<3;n++)  Key_Data[n] = 0 ;             //将数组置为0
			i  =  0;                                        //将下次收到的数据放在第一      
			Data_Over   = 1;                                //确定标志
		}
 
 
else
		{
			if(i>=3)     i = 0;                                 //可以按键多于3次
			switch(Data)
			{
				case 0x70: 	Key_Data[i]=0;   	break;
				case 0x69: 	Key_Data[i]=1;		break;
				case 0x72: 	Key_Data[i]=2;		break;
				case 0x7A: 	Key_Data[i]=3;		break;
				case 0x6b: 	Key_Data[i]=4;		break;
				case 0x73: 	Key_Data[i]=5;		break;
				case 0x74: 	Key_Data[i]=6;		break;
				case 0x6C: 	Key_Data[i]=7;		break;
				case 0x75: 	Key_Data[i]=8;		break;
				case 0x7D: 	Key_Data[i]=9;		break;
			}
			i++;
		}
}


void main()
{
 IT0=1;
 EA=1;
 EX0=1;
 while(1)                                             //下面的写法可以直接在Dispose函数中P2=Get_Key_Data;
		{
			if(Data_Over)                             //这样写只是为了用在其他程序上的接口
	        	{
					P2=Get_Key_Data;
			    	Data_Over=0;
				 }
		}


}

⌨️ 快捷键说明

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