EDN首页   博客首页

日志档案

发表于 2008-7-15 16:32:42

2

标签: PS/2  键盘  Meag48  AVR  串口  

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

前几天在单位发现了一个古董机级的键盘,估计是以前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[i]) == bKeyCode)
      {
       PS2KeyStatus.bKeyAsiic =
         pgm_read_byte(PS2CodeUnShift[i] + 1);
       PS2KeyStatus.bKeyNewFlag = TRUE;
       break;
      }
     }
    }
    else  //如果shift键按下
    {       
     for(i=0; i < 65; i++)//查表找按键ASIIC码
     {
      if(pgm_read_byte(PS2CodeShift[i]) == bKeyCode)
      {
       PS2KeyStatus.bKeyAsiic =
         pgm_read_byte(PS2CodeShift[i] + 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

 

系统分类: 单片机   |   用户分类: AVR   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(355)    回复(2)  

投一票您将和博主都有获奖机会!