打印

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

[复制链接]
862|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mirgo|  楼主 | 2014-8-11 19:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*******************************************
函数名称:Decode
功    能:对来自键盘的信息进行解码,转换成对
应的ASCII编码并压入缓存
参    数:sc--键盘发送过来的信息
返回值  :是否收到有效数据:0--否,1--是
说明    :本程序只能对基本按键(即键被按下时产
生三个字节的扫描码的按键)做出解码,
包括所有的可显示字符键和Table,
Back Space和Enter三个特殊功能键。
基本按键的扫描码由三个字节组成,第1个字节为接通
码,第2、3字节为断开码;其中第1字节和第3字节相
同,中间字节为断开标志0xf0。
********************************************/
//在中断程序中每接收一个字节调用一次解码程序
uchar Decode(uchar sc)
{
        static uchar shift = 0; //Shift键是否按下标志:1--按下,0--未按
        static uchar up = 0;    //键已放开标志:       1--放开,0--按下
        uchar i, flag = 0;

        if(sc == 0xf0)    //如果收到的是扫描码的第2个字节---0xf0:按键断开标志
        {
                up = 1;            //按键已经松开
                return 0;
        }
        else if(up == 1)  //如果收到的是扫描码的第3个字节,即为通码
        {
                up = 0;
                if((sc == 0x12) || (sc == 0x59))
                        shift = 0;
                return 0;
        }

        //如果收到的是扫描码的第1个字节
        if((sc == 0x12) || (sc == 0x59))         //如果是左右shift键,左shift:0x12,右shift:0x59
        {
                shift = 1;                //设置Shift按下标志
                flag = 0;
        }
        else if(sc == 0x58)                                        // ']'
        {
                shift = ~shift;
                if(shift != 0)                                                // shift键按下
                {
                        P1OUT &= ~BIT6;                                        // 灯灭
                }
                else if(shift == 0)                                        // shift键没有按下
                {
                        P1OUT |= BIT6;                                        // 灯亮
                }
        }
        else
        {
                if(shift)                                        //shift按下,对按下Shift的键进行解码
                {
                        /*  for(i = 0;(shifted[i][0] != sc) && shifted[i][0];i++);
                         if (shifted[i][0] == sc)
                         {
                         PutChar(shifted[i][1]);
                         flag = 1;
                         }*/
                        for (i = 0;; i++)
                        {
                                if(shifted[i][0] == sc)
                                {
                                        PutChar(shifted[i][1]);
                                        flag = 1;
                                        break;
                                }
                        }
                }
                else  //直接对按键进行解码
                {
                        for (i = 0; (unshifted[i][0] != sc) && unshifted[i][0]; i++)
                                ;
                        if(unshifted[i][0] == sc)
                        {
                                PutChar(unshifted[i][1]);
                                flag = 1;
                        }
                }
        }
        if(flag)                          // 按键处理完毕
                return 1;
        else
                return 0;
}
这个是解码的函数,就是接收到一个字节就解码一次,分别判断 通码 断码,可以读取组合按键,PS:我用的是小的数字键盘

相关帖子

沙发
comeon201208| | 2014-8-11 22:00 | 只看该作者
晚上过来分享下的了,顺便支持下的。

使用特权

评论回复
板凳
dirtwillfly| | 2014-8-11 22:51 | 只看该作者
读不出来是什么意思?解码失败?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝