久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: 十分好用的4*4矩陣鍵盤掃描程序 [打印本頁]

作者: hutians    時間: 2015-2-10 20:39
標題: 十分好用的4*4矩陣鍵盤掃描程序
        十分好用的4*4矩陣鍵盤掃描程序,更重要的是程序十分的簡短,幾行代碼就解決了4*4 掃描取鍵值,防抖動 ,此程序運用了一個很巧妙的算法!上程序供大家研究,此程序經過改進,可以實現長按鍵識別 組合按鍵識別。如果有哪里不夠好 也請大家指出。程序算法先自己研究,初學者如果看不明白,貼子頂起來,我給大家解釋!把文本格式奉上 直接復制到你的程序里。


  1. volatile unsigned char CF[4]; //按鍵觸發標志(表示4列,每一列同一行的
  2. //值是一樣的但列標不一樣來區分不同列的鍵)
  3. volatile unsigned char KeyVal;//鍵值
  4. code unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f}; //4X4按輸出端控制
  5. #define KEY P2 //P2口作為4*4矩陣鍵盤輸入
  6. /*
  7. **描述:新型4X4按鍵掃描程序 放在1ms-10ms中斷內使用(十分穩定不需要再寫消抖程序)
  8. **備注:按鍵彈起時 keyVal = 0 單鍵按下 keyVal 有16個值,你自己程序可以針對不同值
  9. **進行不同程序操作 keyVal單鍵值分別為
  10. **0x11,0x12,0x14,0x18,
  11. **0x21,0x22,0x24,0x28,
  12. **0x31,0x32,0x34,0x38,
  13. **0x41,0x42,0x44,0x48,
  14. */
  15. void Key_Head()
  16. {
  17. unsigned char ReadData[4];
  18. static unsigned char i;
  19. if(++i>=4)i=0;
  20. KEY = KeyOut[i]|0x0f; //忽略低4位
  21. ReadData[i] = (KEY|0xf0)^0xff; //忽略高4位 取反
  22. CF[i] = ReadData[i] & (ReadData[i] ^ Cont[i]);
  23. Cont[i] = ReadData[i];
  24. //輸出鍵值
  25. switch(CF[i])//第i列
  26. {
  27. case 0x08: KeyVal = (i<<4+8);break;
  28. case 0x04: KeyVal = (i<<4+4);break;
  29. case 0x02: KeyVal = (i<<4+2);break;
  30. case 0x01: KeyVal = (i<<4+1);break;
  31. default:KeyVal = 0;break;
  32. }
  33. }
復制代碼




作者: zlkj    時間: 2015-6-21 05:48
謝謝!希望學習完整程序。
作者: hbljcxl    時間: 2015-6-30 21:57
樓主好,程序好精練,中間有好多地方看不懂,但是復制下來,在程序中試了你的程序,發現少定義了Cont[i]數組,加上后,程序也不成功,請教在主函數中如何調用 你的函數,多謝了!
作者: 大頭5374    時間: 2016-4-26 15:05
這個程序可以直接拿來輸入數值嗎
作者: 瑾年Higher    時間: 2019-5-17 17:55
還煩請樓主解釋一下
作者: zhangxinwu    時間: 2020-2-20 00:54
用不了啊!咋回事啊!
作者: xuyubin    時間: 2020-2-23 16:12
本帖最后由 xuyubin 于 2020-2-26 09:28 編輯

/*-------------------------------------------------------------------------
功能:矩陣鍵盤掃描程序,每經過10ms循環,進行一次4種可能的鍵值判斷,由索引I控制,經過4輪
便可判斷出所有可能的鍵值,(由程序執行的間隔來產生消抖作用,減少了程序執行時間)
**備注:無按鍵按下時 Key_Val = 0
                單個鍵按下 Key_Val 有16個值
                **0x01,0x02,0x04,0x08
                **0x11,0x12,0x14,0x18,
                **0x21,0x22,0x24,0x28,
                **0x31,0x32,0x34,0x38,
                可根據判斷出的鍵值代表不同的按鍵按下
---------------------------------------------------------------------------*/
uchar Key_Judge()
{
static uchar Key_Code[4];                                                         //每輪按鍵掃描后鍵值處理后數組
static uchar Key_Code_Store[4];                                                //每輪按鍵掃描后鍵值處理后儲存的數組,以偏在下輪程序中對比確認鍵值
static uchar Key_Val;                                                                //按鍵掃描程序返回的鍵值
static uchar ReadData[4];                                                        //按鍵讀出后,數據處理后的暫存數組
static uchar i;                                                                                //每輪按鍵判斷處理索引
uchar key_Return=99;

if(++i>=4) i=0;                                                                                //每輪判斷后,索引都+1,經過4輪后又自動恢復至0;

Key_Input = KeyOut|0x0f;                                                 //再第I輪,按設計好的數組,對高4位的進行拉低,判斷16個鍵值,需要循環4輪
ReadData = (Key_Input|0xf0)^0xff;                                 //重新讀取KEY_Input口,忽略高4位 異或取反后得出按鍵按下時后被拉低的位

Key_Code = ReadData & (ReadData ^ Key_Code_Store);               
//通過與上一循環周期前(4輪,40ms)前儲存的按鍵讀取值做對比,不同且為非0值,則表示按鍵按下持續超過40
//如相同或都是為0,則得出的值為0,表示沒有按鍵按下,或者按鍵一直被按住情況
Key_Code_Store = ReadData;                                       
//儲存第i輪到按鍵讀取值,以便下一循環周期(4輪,40ms)后對比用

switch(Key_Code)                                        //將第i輪按鍵讀取值附上i輪索引值,以便產生16個可能的鍵值供判斷按鍵用
{
        case 0x08:         Key_Val = (i<<4)+8;break;
        case 0x04:         Key_Val = (i<<4)+4;break;
        case 0x02:         Key_Val = (i<<4)+2;break;
        case 0x01:         Key_Val = (i<<4)+1;break;
        default:Key_Val = 0;break;
}



作者: wsh791    時間: 2020-2-23 21:58
學習了謝謝
作者: wengjiamin    時間: 2021-1-9 09:07
樓主好,程序好精練,中間有好多地方看不懂,但是復制下來,在程序中試了你的程序,發現少定義了Cont[i]數組,加上后,程序也不成功,請教在主函數中如何調用 你的函數,多謝了!


在定時器1ms-10ms中斷中進行調用
作者: wengjiamin    時間: 2021-1-9 09:11
//反轉法掃描4*4鍵盤程序
void keyscan(void) //鍵盤掃描函數
{        unsigned char n,m;
    P1=0xf0;//全行掃描
        n=P1;   //讀列的狀態
        n&=0xf0;//屏蔽掉行的狀態
        P1=0x0f;//全列掃描
        m=P1;//讀行的狀態
        m&=0x0f;//屏蔽掉列的狀態
        n=n|m;
        switch(n)
        {
                 case(0xee):display(3);break; //1110_1110
                case(0xde):display(2);break; //1101_1110
                case(0xbe):display(1);break; //1011_1110
                case(0x7e):display(0);break; //0111_1110

                case(0xed):display(7);break; //1110_1101
                case(0xdd):display(6);break; //1101_1101
                case(0xbd):display(5);break; //1011_1101
                case(0x7d):display(4);break; //0111_1101

                case(0xeb):display(11);break; //1110_1011
                case(0xdb):display(10);break; //1101_1011
                case(0xbb):display(9);break; //1011_1011
                case(0x7b):display(8);break; //0111_1011

                case(0xe7):display(15);break; //1110_0111
                case(0xd7):display(14);break; //1101_0111
                case(0xb7):display(13);break; //1011_0111
                case(0x77):display(12);break; //0111_0111
        }
}




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品免费| 精品亚洲一区二区三区 | 国产一区二区三区视频 | 欧美一级艳片视频免费观看 | 青草网 | 亚洲国产精 | 福利影院在线观看 | 手机看片在线 | 午夜精品国产精品大乳美女 | 日韩亚洲天堂 | 日韩国产欧美 | 日本不卡在线播放 | 国产成人在线免费视频 | 国产乱码精品一区二区三 | 国产在线不卡 | 综合久久久| 99热国产在线 | 91成人在线观看喷潮蘑菇 | 日韩专区在线 | 亚洲一区二区国产精品 | 精品伊人 | 日韩av影片| 日日日干干干 | 五月婷婷综合网 | 日韩视频免费大全中文字幕 | 婷婷丁香六月 | 国产乡下妇女做爰视频 | 亚洲精品久久久久久久久久久 | 久久久久久一区二区 | 精品国产精品三级精品av网址 | 黄色小说视频网站 | 亚洲狠狠干 | www.色综合| 欧美国产精品一区二区 | 在线一区二区三区 | av黄色在线| 成人免费视频观看视频 | 91精品91久久久中77777 | 午夜视频在线播放 | 麻豆国产一区二区三区四区 | 久热伊人|