📄 shuru.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 + -