欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2138|回復: 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 單片機教程網

快速回復 返回頂部 返回列表