前几天在单位发现了一个古董机级的键盘,估计是以前X86机器上的键盘,虽然出的早但键盘依然很结识,拿起来很有手感(很重金属材料用的不少),连接上电脑居然还能使用,不过遗憾的是有现按键在XP系统下识别不了。仍了怪可惜的,作为研究PS2协议还是很不错的,于是乎就查资料写了个PS/2键盘的小程序,AVR GCC环境下编写,单片机用是AVR的Mega48v,硬件平台还是我的m48Dev 外置7.3728M晶体,PS/2键盘与单片机连接如下:
PS/2_DATA -------------------PC0
PS/2_CLK----------------------INT0
PS/2_VCC----------------------+5V
PS/2_GND----------------------GND
串口接收截图
部分核心代码:
/************************************************************************
*名称: unsigned char PS2_KeyDeCode(unsigned char bKeyCode)
*功能: PS2键盘解码程序
*参数: bKeyCode 键盘码
*返回: 按键的ASIIC码
************************************************************************/
unsigned char PS2_KeyDeCode(unsigned char bKeyCode)
{
unsigned char i;
if (!PS2KeyStatus.bBreakFlag)//通码
{
switch (bKeyCode)//开始翻译扫描码
{
case 0xF0: //键盘释放随后的一个字节是断码
{
PS2KeyStatus.bBreakFlag = 1;//断码标志置位
break;
}
case 0x12: //左shift键按下
{
PS2KeyStatus.bShiftFlag = 1; //shift标志置位
break;
}
case 0x59: //右shift键按下
{
PS2KeyStatus.bShiftFlag = 1; //shift标志置位
break;
}
default:
{
PS2KeyStatus.bBreakFlag = FALSE;
if(!PS2KeyStatus.bShiftFlag) //如果shift键没有按下
{
for(i = 0; i < 65; i++)//查表找按键ASIIC码
{
if(pgm_read_byte(PS2CodeUnShift) == bKeyCode)
{
PS2KeyStatus.bKeyAsiic =
pgm_read_byte(PS2CodeUnShift + 1);
PS2KeyStatus.bKeyNewFlag = TRUE;
break;
}
}
}
else //如果shift键按下
{
for(i=0; i < 65; i++)//查表找按键ASIIC码
{
if(pgm_read_byte(PS2CodeShift) == bKeyCode)
{
PS2KeyStatus.bKeyAsiic =
pgm_read_byte(PS2CodeShift + 1);
PS2KeyStatus.bKeyNewFlag = TRUE;
break;
}
}
}
break;
}
}
}
else //断码
{
PS2KeyStatus.bBreakFlag = 0; //将断码标志复位
switch (bKeyCode) //检测shift键释放
{
case 0x12 : //左shift键
PS2KeyStatus.bShiftFlag = 0;
break;
case 0x59 : //右shift键
PS2KeyStatus.bShiftFlag = 0;
break;
default:
break;
}
}
}
用户461316 2008-9-4 08:37
用户1399169 2008-7-28 15:24