找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1851|回复: 9
收起左侧

单片机按键扫描代码,求大佬帮我看看

[复制链接]
ID:944932 发表于 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},
};

回复

使用道具 举报

ID:213173 发表于 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;
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:739545 发表于 2021-6-29 09:30 | 显示全部楼层
KeyPad/16*16愿意应该是取高位略低位的意思,但直接这样写就写的比较直白,效率降低,直接用移位比较好
回复

使用道具 举报

ID:944932 发表于 2021-6-29 10:12 来自手机 | 显示全部楼层
wulin 发表于 2021-6-29 07:30
这是一个不成熟的4*4矩阵键盘扫描程序,写法也不规范,看看就行,不必深究。给你稍改一下,去除赘句,便于 ...

这个看起来就好懂啊,谢谢大佬
回复

使用道具 举报

ID:944932 发表于 2021-6-29 10:12 来自手机 | 显示全部楼层
lovezjf234 发表于 2021-6-29 09:30
KeyPad/16*16愿意应该是取高位略低位的意思,但直接这样写就写的比较直白,效率降低,直接用移位比较好

嗯嗯,谢谢大佬
回复

使用道具 举报

ID:807591 发表于 2021-6-29 10:43 | 显示全部楼层
虽然。。但是这种涉及 while之类傻等的 还是不好,等效于高速公路堵车,这些思维套路不练也罢
回复

使用道具 举报

ID:123289 发表于 2021-6-29 11:08 | 显示全部楼层
如果键卡住了(长按),程为序就死等。什么活也不用干了。
回复

使用道具 举报

ID:944932 发表于 2021-6-29 11:10 | 显示全部楼层
szb314 发表于 2021-6-29 10:43
虽然。。但是这种涉及 while之类傻等的 还是不好,等效于高速公路堵车,这些思维套路不练也罢

你好,那有什么可以替换的呢,请大佬指点一点
回复

使用道具 举报

ID:807591 发表于 2021-6-29 13:48 | 显示全部楼层
茉莉星瞳 发表于 2021-6-29 11:10
你好,那有什么可以替换的呢,请大佬指点一点

早点看看类似状态机那种套路,,比如4个IO做数据位,4个地址位,地址位依次 置1输出,数据位检测,如此循环,远比卡住while这些要好,cpu可以解放出来做其他事
回复

使用道具 举报

ID:161164 发表于 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;
}

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表