程序只是读取PS2的键码,在数码管显示,问题出现在最后,发现复位后,第一个按键的键码是正确的,而再按其他按键时,开始出现乱码;而复位后,也就只是第一次按的按键的键码才正确,调试了很久都发现不了原因,有没有哪个人可以从代码中发现错误呢?
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define _Nop() _nop_()
sbit psdata=P3^0;
sbit psclk=P3^2;
uchar code num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};
uchar sled_data[2]={16,16}; /*缓冲值*/
uchar code light[2]={0xfe,0xfd};/*定义需要点亮的数码管*/
uchar numbit;
uchar keyv;
uchar key[3];
uchar keynum;
/*1MS为单位的延时程序*/
void delay_1ms(uchar x)
{
uchar j;
while(x--){
for(j=0;j<125;j++) ;
}
}
void main()
{
uchar i;
IT0=1;//外部中断下降沿触发
EX0=1;
EA=1;
while(1)
{
if(keynum==3) //读完键码后,取第一个键码
{
keynum=0;
sled_data[0]=key[0]/16;
sled_data[1]=key[0]%16;
}
for(i=0;i<2;i++) //数码管显示
{
P2 = 0xff; /*关闭显示*/
_Nop();
_Nop();
_Nop();
 0 = num[sled_data]; /*输出段码数据到数码管*/
 2 = light; /*输出位码数据到数码管*/
delay_1ms(1);
}
}
}
void int0() interrupt 0 //读取键码
{
if((numbit>0) && (numbit<9))
{
keyv=keyv>>1;
if(psdata) keyv=keyv | 0x80;
}
numbit++;
if(numbit>10)
{
numbit=0;
key[keynum]=keyv; //保存键码
keynum++;
}
}
|