上周了半天没啥眉目,原来是我把上的跳线接错了,害的我周末都没过好,郁闷!
今天早上无意间用万用表测了一下管脚才发现跳线接错了,呵呵!
所以嘛!兄弟们调试的时候,如果按键盘没反应,看看是不是跳线接错了!
PS2键盘协议
看完后,有人可能觉得这程序是网上已经有的,没错是网上的,我只做了修修改改,使它能在咱们的上运行,能够适合,去去了解。如果有的人,会明白有时候网上的程序本身没有错误,但是运行的自己的硬件上就达不到预期的效果,或者就没法实现想要的,出了问题也没法去问人家,因为代码可能发了好长时间了,人家有可能已经忘了!
所以我发这个程序是我参考网上的程序,并且我已经在咱们免费的PCB上调试好的,我的目的是让初学者能够更好的认识,更清楚的熟悉PS2协议,同时也让高手们以后编程序时直接复制过去用就可以了,把主要精力用在其他方面。就这点目的,要不我也不会费这么大劲儿发上来,当然欢迎大家拍砖,对我也是一种鞭策!
贴上代码:
#include <AT89X52.H>
#include <INTRINS.H>
#define Sel_one P1_0
#define Sel_two P1_1
#define Sel_three P1_2
#define Sel_four P1_3
#define LEDData P0
#define KB_CLK P3_3
#define KB_DATA P3_4
#defineOFF 0x0b
unsigned char code led[]={0xc0,0xf9,0xa4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff,0x00};
unsigned char LedUpdataWord;
////////////////////////////////////
void delay(unsigned char k) //k ms延时
{
unsigned char j;
for(;k!=0;k--)
{
for(j=20;j!=0;j--)
continue;
}
}
void Timer1Init()
{
TMOD=0x01;
TH0=(65536-15000)/256;
TL0=(65536-15000)%256;
TR0=1;
ET0=1;
EA=1;
}
unsigned char Key_SCAN(void)
{
unsigned char i,KeyData;
KB_CLK=1; //给高电平,将控制权交给键盘
KB_DATA=1;
KeyData=0;
while(KB_CLK); //读取信号
EA=0; //为防止影响键盘时序,关闭总中断
for(i=0;i<8;i++)
{
KeyData>>=1;
while(!KB_CLK); //等待下降沿
while(KB_CLK);
_nop_();
if(KB_DATA)
{
KeyData|=0x80; //低位在前
}
}
while(!KB_CLK); //校验位
while(KB_CLK);
while(!KB_CLK); //停止位
while(KB_CLK);
while(!KB_CLK);
EA=1; //键值扫描完毕,开启总中断
return KeyData;
}
unsigned char Decode(unsigned char Mydata) //键码解析
{
switch(Mydata)
{
case 0x45: return 0;break;
case 0x16: return 1;break;
case 0x1e: return 2;break;
case 0x26: return 3;break;
case 0x25: return 4;break;
case 0x2e: return 5;break;
case 0x36: return 6;break;
case 0x3d: return 7;break;
case 0x3e: return 8;break;
case 0x46: return 9;break;
default: return 0xff; break;
}
}
void display(unsigned char a1,unsigned char a2,unsigned char a3,unsigned char a4)
{
Sel_one=0;
LedData=led[a4];;
delay(10);
Sel_one=1;
Sel_two=0;
LedData=led[a3];
delay(10);
Sel_two=1;
Sel_three=0;
LedData=led[a2];
delay(10);
Sel_three=1;
Sel_four=0;
LedData=led[a1];
delay(10);
Sel_four=1;
}
main()
{
unsigned char KeyCode;
Timer1Init();
LedUpdataWord=0;
while(1)
{
KeyCode=Decode(Key_Scan()); //扫描,解码
if(KeyCode!=0xff) LedUpdataWord=KeyCode; //更新led显示
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-15000)/256;
TL0=(65536-15000)%256;
display(LedUpdataWord,LEDOFF,LEDOFF,LEDOFF);
}
源代码下载:http://www.wang1jin.com/bbs/viewthread.php?tid=407&extra=page%3D1