标题: 单片机按键扫描代码,求大佬帮我看看 [打印本页]

作者: 茉莉星瞳    时间: 2021-6-29 02:09
标题: 单片机按键扫描代码,求大佬帮我看看
KeyPad就是P2,以下是一部分代码,注释是我根据自己的理解写上去的,有不对的还请大佬们指教,现在有个不懂得地方就是scancode+=KeyPad/16*16;这一句中的计算原理是什么,除16又乘16,我用计算机验证了半天都对不上。

uchar GetScanCode()
{
        uchar scancode=0;
        KeyPad=0x0f;//00001111让行的数值,即低位全为1
        if(KeyPad%16!=0x0f)        //检测是否有按键按下
        {
                delay(10);   //消抖
                KeyPad=0x0f;   //
                if(KeyPad%16!=0x0f)//再次检测是否有按键按下
                {
                        KeyPad=0x0f;//
                        scancode=KeyPad%16;        //读取行数值 ,即取低位
                        KeyPad=0xf0;
                        scancode+=KeyPad/16*16;//scancode =  scancode  +  KeyPad/16*16(高位)        行数值加列数值 组成扫描代码
               
                        KeyPad=0x0f;
               
                        while(KeyPad%16!=0x0f);//等待按键松开并输出
                        return scancode;

                }
        }
        return 0;
}


uchar code KeyValue[][2]={
                                                        {0xee,1},
                                                        {0xde,2},
                                                        {0xbe,3},
                                                        {0x7e,4},

                                                        {0xed,5},
                                                        {0xdd,6},
                                                        {0xbd,7},
                                                        {0x7d,8},

                                                        {0xeb,9},
                                                        {0xdb,0},
                                                        {0xbb,10},
                                                        {0x7b,11},

                                                        {0xe7,12},
                                                        {0xd7,13},
                                                        {0xb7,14},
                                                        {0x77,15},
};


作者: wulin    时间: 2021-6-29 07:30
这是一个不成熟的4*4矩阵键盘扫描程序,写法也不规范,看看就行,不必深究。给你稍改一下,去除赘句,便于看懂。
uchar GetScanCode()
{
        uchar scancode=0;
        KeyPad=0x0f;//00001111让行的数值,即低位全为1,赋值低4位
//        if(KeyPad%16!=0x0f)        //检测是否有按键按下
        if(KeyPad!=0x0f)        //检测是否有按键按下
        {
                delay(10);   //消抖
//                KeyPad=0x0f;   //
//                if(KeyPad%16!=0x0f)//再次检测是否有按键按下
                if(KeyPad!=0x0f)//再次检测是否有按键按下
                {
//                        KeyPad=0x0f;//
//                        scancode=KeyPad%16;        //读取行数值 ,即取低位
                        scancode=KeyPad&0x0f;      //取低4位值
                        KeyPad=0xf0;                                        //赋值高4位
        //                scancode+=KeyPad/16*16;//scancode =  scancode  +  KeyPad/16*16(高位) 行数值加列数值 组成扫描代码       
                        scancode|=(KeyPad&0xf0);  //低4位+高4位
//                        KeyPad=0x0f;       
//                        while(KeyPad%16!=0x0f);//等待按键松开并输出
                        while(KeyPad!=0xf0);//等待按键松开并输出
                        return scancode;
                }
        }
        return 0;
}
作者: lovezjf234    时间: 2021-6-29 09:30
KeyPad/16*16愿意应该是取高位略低位的意思,但直接这样写就写的比较直白,效率降低,直接用移位比较好
作者: 茉莉星瞳    时间: 2021-6-29 10:12
wulin 发表于 2021-6-29 07:30
这是一个不成熟的4*4矩阵键盘扫描程序,写法也不规范,看看就行,不必深究。给你稍改一下,去除赘句,便于 ...

这个看起来就好懂啊,谢谢大佬
作者: 茉莉星瞳    时间: 2021-6-29 10:12
lovezjf234 发表于 2021-6-29 09:30
KeyPad/16*16愿意应该是取高位略低位的意思,但直接这样写就写的比较直白,效率降低,直接用移位比较好

嗯嗯,谢谢大佬
作者: szb314    时间: 2021-6-29 10:43
虽然。。但是这种涉及 while之类傻等的 还是不好,等效于高速公路堵车,这些思维套路不练也罢
作者: yzwzfyz    时间: 2021-6-29 11:08
如果键卡住了(长按),程为序就死等。什么活也不用干了。
作者: 茉莉星瞳    时间: 2021-6-29 11:10
szb314 发表于 2021-6-29 10:43
虽然。。但是这种涉及 while之类傻等的 还是不好,等效于高速公路堵车,这些思维套路不练也罢

你好,那有什么可以替换的呢,请大佬指点一点
作者: szb314    时间: 2021-6-29 13:48
茉莉星瞳 发表于 2021-6-29 11:10
你好,那有什么可以替换的呢,请大佬指点一点

早点看看类似状态机那种套路,,比如4个IO做数据位,4个地址位,地址位依次 置1输出,数据位检测,如此循环,远比卡住while这些要好,cpu可以解放出来做其他事
作者: lkc8210    时间: 2021-6-29 15:09
本帖最后由 lkc8210 于 2021-6-29 15:12 编辑
茉莉星瞳 发表于 2021-6-29 11:10
你好,那有什么可以替换的呢,请大佬指点一点

可以用某数的累加代替
以下是上班摸鱼推理出来的
可能有Bug
uint ScanCount = 0;

uchar GetScanCode()
{
        uchar scancode=0;
        KeyPad=0x0f;//00001111让行的数值,即低位全为1,赋值低4位
//        if(KeyPad%16!=0x0f)        //检测是否有按键按下
        if(KeyPad!=0x0f)        //检测是否有按键按下
        {
                if(ScanCount++ >= 10) //根据大While loop的速度调节一下        //消抖
                {
                        ScanCount = 10;//防溢出
//                KeyPad=0x0f;   //
//                if(KeyPad%16!=0x0f)//再次检测是否有按键按下
                        if(KeyPad!=0x0f)//再次检测是否有按键按下
                        {
//                        KeyPad=0x0f;//
//                        scancode=KeyPad%16;        //读取行数值 ,即取低位
                                scancode=KeyPad&0x0f;      //取低4位值
                                KeyPad=0xf0;                                        //赋值高4位
//                scancode+=KeyPad/16*16;//scancode =  scancode  +  KeyPad/16*16(高位) 行数值加列数值 组成扫描代码
                                scancode|=(KeyPad&0xf0);  //低4位+高4位
//                        KeyPad=0x0f;
//                        while(KeyPad%16!=0x0f);//等待按键松开并输出

                        }
                }

        }
        if(ScanCount >= 10 && !(KeyPad!=0xf0))//等待按键松开并输出
        {
                ScanCount = 0;
                return scancode;
        }

        return 0;
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1