原创 [原创]Mega48解码PS/2键盘+串口显示

2008-7-15 16:32 5453 9 11 分类: MCU/ 嵌入式

前几天在单位发现了一个古董机级的键盘,估计是以前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;
  }
 }


下载完整代码:rar
另附PS/2协议中文版pdf


 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户461316 2008-9-4 08:37

支持ps2的代码!!!

用户1399169 2008-7-28 15:24

支持下,好东西!
相关推荐阅读
用户1079511 2009-07-10 16:08
Mega16读取SD卡内的FAT16文件
最近一直在学习FAT文件系统,在网络上找了一些资料加上参考别人写的程序,现在已经可以读取SD/MMC卡指定的文件,有些东西自己也不是很懂,回头还得慢慢研究。程序比较简单,就是读取SD卡的基本信息和初始...
用户1079511 2009-04-14 08:38
[原创]AVR M16热敏电阻测温LCM12864显示
https://static.assets-stash.eet-china.com/album/old-resources/2009/4/14/d085d878-6d8f-4245-acdb-cf44...
用户1079511 2009-04-08 11:34
Mega16 Bootloader+PC端上位机
AVR的Bootloader功能很方便产品的在线升级,以前参考网上的资料写过下位机的程序,标准的XMODEM协议,用超级终端来升级程序。最近在学习C#,所以用C#写个简单的上位机软件,配合以前的boo...
用户1079511 2009-01-22 16:15
Mega16热敏电阻测温上位机曲线显示
最近在一直学习用C#做上位机,把以前的做的m16热敏电阻测温的程序翻出来,稍加修改通过串口发给PC;PC端用c#2008写程序,接收数据后通过ZedGraph绘图控件实时显示出曲线图。ZedGraph...
用户1079511 2009-01-09 09:25
[原创]c#的Hex转Bin小程序
最近在搞AVR的bootloader,程序已经写好了,参考网上的代码用的是XMODEM协议用XP自带的超级终端。问题是xmodem支持bin格式的文件,一般用编译器生成的是hex文件不用直接使用,需要...
用户1079511 2008-12-31 10:42
[学习]用595驱动LED实现灰度调节
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />前一段时间在ouravr论坛里闲逛的...
EE直播间
更多
我要评论
2
9
关闭 站长推荐上一条 /3 下一条