永发信息网

求PS2键盘协议C代码

答案:1  悬赏:80  手机版
解决时间 2021-02-06 21:25
要求就是:利用8051单片机的外部中断0作时钟输入,当按下一个按键时,单片机能正确接受它的扫描码。我自己写的代码就是收不到数据,跪求哪位大牛发个好用的代码。感激万分~没有财富,只求分享经验~
邮箱:446375200@qq.com
最佳答案


#include<REG52.h>

sbit LS138A=P2^2;
sbit LS138B=P2^3;
sbit LS138C=P2^4;

sbit BEEP = P1^5;

sbit Key_Data = P1^6 ; //定义键盘引脚
sbit Key_CLK = P3^2; //使用外部中断




void Decode(unsigned char ScanCode); //解码子程序
void delay(unsigned int i); //函数声名
void display();
void beep();

// 此表为 LED 的字模 // 0 1 2 3 4 5 6 7 8 9 A b c d E - L P U Hidden _ (20)
unsigned char code Disp_Tab[] = { ~0xC0,~0xF9,~0xA4,~0xB0,~0x99,~0x92,~0x82,~0xF8,~0x80,~0x90,~0x88,~0x83,~0xC6,~0xA1,~0x86,~0xbf,~0xc7,~0x8c,~0xc1, ~0xff, ~0xf7 };
bit BF;
unsigned char KeyV;
unsigned char LedNumVal ;
int KEY_val,IntNum;




void main()
{

IT1 = 0; //设外部中断1为低电平触发
EA = 1; //外部中断开
EX0 = 1; //开中断

while(1)
{
if (BF)
{
if (KeyV != 240) beep();

Decode(KeyV); //解码

}
else
EA = 1; //开中断
display();
}

}




void Keyboard_out(void) interrupt 0
{
if ((IntNum > 0) && (IntNum < 9))
{
KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
if (Key_Data)
KeyV = KeyV | 0x80; //当键盘数据线为1时到最高位
}
IntNum++;
while (!Key_CLK); //等待PS/2CLK拉高

if (IntNum > 10)
{
IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
BF = 1; //标识有字符输入完了
EA = 0; //关中断等显示完后再开中断
}

}




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

switch (ScanCode)
{
case 0x70 : // 当收到0xF0,Key_UP置1表示断码开始
KEY_val = 0;
break;

case 0x69 :
KEY_val = 1;
break;

case 0x72 :
KEY_val = 2;
break;

case 0x7A :
KEY_val = 3;
break;

case 0x6B :
KEY_val = 4;
break;

case 0x73 :
KEY_val = 5;
break;

case 0x74 :
KEY_val = 6;
break;

case 0x6c :
KEY_val = 7;
break;

case 0x75 :
KEY_val = 8;
break;

case 0x7d :
KEY_val = 9;
break;

case 0x71 :

// dot = 0x7F;
break;

}

BF = 0; //标识字符处理完了
}


void display( )
{
unsigned char i;
unsigned int LedOut[8];

LedNumVal = KEY_val ;

LedOut[0]=Disp_Tab[LedNumVal%10000/1000];
LedOut[1]=Disp_Tab[LedNumVal%1000/100];
LedOut[2]=Disp_Tab[LedNumVal%100/10];
LedOut[3]=Disp_Tab[LedNumVal%10];

LedOut[4]=Disp_Tab[LedNumVal%10000/1000]; //千位
LedOut[5]=Disp_Tab[LedNumVal%1000/100]; //百位带小数点
LedOut[6]=Disp_Tab[LedNumVal%100/10]; //十位
LedOut[7]=Disp_Tab[LedNumVal%10]; //个位

for( i=0; i<8; i++)
{ P0 = LedOut[i];

switch(i)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
case 2:LS138A=0; LS138B=1; LS138C=0; break;
case 3:LS138A=1; LS138B=1; LS138C=0; break;
case 4:LS138A=0; LS138B=0; LS138C=1; break;
case 5:LS138A=1; LS138B=0; LS138C=1; break;
case 6:LS138A=0; LS138B=1; LS138C=1; break;
case 7:LS138A=1; LS138B=1; LS138C=1; break;

}

delay(50);
}

}


void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}


void beep()
{
unsigned char i;
for (i=0;i<255;i++)
{
delay(5);
BEEP=!BEEP; //BEEP取反
}
BEEP=1; //关闭蜂鸣器
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
【2003年3月20号发生了什么大事】2003年3月20
博罗县龙华司法所地址在什么地方,想过去办事
有谁知道长沙河东有比较好的画室?不要推荐河
襄城县质监局怎么去啊,我要去那办事
写出配置8051串行口为异步通信口,通信规约为:
国建集团企业未来发展怎么样?有前景吗?
已知函数f(x)=k+√(x+2 ),若在其定义域内存
下列六个句子,组成语意连贯的一段话,恰当的
在VS2013进行VB的编程picturebox保存图片问题
为什么长春取消货币安置?
喜友家(御江璟城西)我想知道这个在什么地方
谁能帮我一把,只要你愿意帮我,我帮你做什么
泰勒的哪一首MV是一个动画?
单亲家庭最高住房公积金贷款额
冰心老人前的某些事
推荐资讯
DNF号被封15天,怎么减刑
我每天都帮父母做家务英语
请问这是不是金毛啊?
广东中山至云南丽江路线费用
如何安装和破解powerdesigner
西城中学地址在哪,我要去那里办事
汾阳市西关村打架事件,谁知道?
手机碎屏险怎样激活
看望病人送玫瑰花好吗
在小组工作的开始阶段,组员一般会表现出的特
同道居地址在什么地方,想过去办事
请问“孤独”的反义词是什么?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?