PS/2键盘一直读取不出来

2019-07-15 16:53发布

  1. /*******************************************
  2. 函数名称:Decode
  3. 功    能:对来自键盘的信息进行解码,转换成对
  4. 应的ASCII编码并压入缓存
  5. 参    数:sc--键盘发送过来的信息
  6. 返回值  :是否收到有效数据:0--否,1--是
  7. 说明    :本程序只能对基本按键(即键被按下时产
  8. 生三个字节的扫描码的按键)做出解码,
  9. 包括所有的可显示字符键和Table,
  10. Back Space和Enter三个特殊功能键。
  11. 基本按键的扫描码由三个字节组成,第1个字节为接通
  12. 码,第2、3字节为断开码;其中第1字节和第3字节相
  13. 同,中间字节为断开标志0xf0。
  14. ********************************************/
  15. //在中断程序中每接收一个字节调用一次解码程序
  16. uchar Decode(uchar sc)
  17. {
  18.         static uchar shift = 0; //Shift键是否按下标志:1--按下,0--未按
  19.         static uchar up = 0;    //键已放开标志:       1--放开,0--按下
  20.         uchar i, flag = 0;

  21.         if(sc == 0xf0)    //如果收到的是扫描码的第2个字节---0xf0:按键断开标志
  22.         {
  23.                 up = 1;            //按键已经松开
  24.                 return 0;
  25.         }
  26.         else if(up == 1)  //如果收到的是扫描码的第3个字节,即为通码
  27.         {
  28.                 up = 0;
  29.                 if((sc == 0x12) || (sc == 0x59))
  30.                         shift = 0;
  31.                 return 0;
  32.         }

  33.         //如果收到的是扫描码的第1个字节
  34.         if((sc == 0x12) || (sc == 0x59))         //如果是左右shift键,左shift:0x12,右shift:0x59
  35.         {
  36.                 shift = 1;                //设置Shift按下标志
  37.                 flag = 0;
  38.         }
  39.         else if(sc == 0x58)                                        // ']'
  40.         {
  41.                 shift = ~shift;
  42.                 if(shift != 0)                                                // shift键按下
  43.                 {
  44.                         P1OUT &= ~BIT6;                                        // 灯灭
  45.                 }
  46.                 else if(shift == 0)                                        // shift键没有按下
  47.                 {
  48.                         P1OUT |= BIT6;                                        // 灯亮
  49.                 }
  50.         }
  51.         else
  52.         {
  53.                 if(shift)                                        //shift按下,对按下Shift的键进行解码
  54.                 {
  55.                         /*  for(i = 0;(shifted[i][0] != sc) && shifted[i][0];i++);
  56.                          if (shifted[i][0] == sc)
  57.                          {
  58.                          PutChar(shifted[i][1]);
  59.                          flag = 1;
  60.                          }*/
  61.                         for (i = 0;; i++)
  62.                         {
  63.                                 if(shifted[i][0] == sc)
  64.                                 {
  65.                                         PutChar(shifted[i][1]);
  66.                                         flag = 1;
  67.                                         break;
  68.                                 }
  69.                         }
  70.                 }
  71.                 else  //直接对按键进行解码
  72.                 {
  73.                         for (i = 0; (unshifted[i][0] != sc) && unshifted[i][0]; i++)
  74.                                 ;
  75.                         if(unshifted[i][0] == sc)
  76.                         {
  77.                                 PutChar(unshifted[i][1]);
  78.                                 flag = 1;
  79.                         }
  80.                 }
  81.         }
  82.         if(flag)                          // 按键处理完毕
  83.                 return 1;
  84.         else
  85.                 return 0;
  86. }
复制代码
这个是解码的函数,就是接收到一个字节就解码一次,分别判断 通码 断码,可以读取组合按键,PS:我用的是小的数字键盘
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。