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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 23230|回復: 9
打印 上一主題 下一主題
收起左側

十分好用的4*4矩陣鍵盤掃描程序

  [復制鏈接]
跳轉到指定樓層
樓主
ID:73477 發表于 2015-2-10 20:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
        十分好用的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. }
復制代碼



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏14 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:82098 發表于 2015-6-21 05:48 | 只看該作者
謝謝!希望學習完整程序。
回復

使用道具 舉報

板凳
ID:47843 發表于 2015-6-30 21:57 | 只看該作者
樓主好,程序好精練,中間有好多地方看不懂,但是復制下來,在程序中試了你的程序,發現少定義了Cont[i]數組,加上后,程序也不成功,請教在主函數中如何調用 你的函數,多謝了!
回復

使用道具 舉報

地板
ID:116657 發表于 2016-4-26 15:05 | 只看該作者
這個程序可以直接拿來輸入數值嗎
回復

使用道具 舉報

5#
ID:434759 發表于 2019-5-17 17:55 | 只看該作者
還煩請樓主解釋一下
回復

使用道具 舉報

6#
ID:408350 發表于 2020-2-20 00:54 | 只看該作者
用不了啊!咋回事啊!
回復

使用道具 舉報

7#
ID:696996 發表于 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;
}


回復

使用道具 舉報

8#
ID:686739 發表于 2020-2-23 21:58 來自手機 | 只看該作者
學習了謝謝
回復

使用道具 舉報

9#
ID:860602 發表于 2021-1-9 09:07 | 只看該作者
樓主好,程序好精練,中間有好多地方看不懂,但是復制下來,在程序中試了你的程序,發現少定義了Cont[i]數組,加上后,程序也不成功,請教在主函數中如何調用 你的函數,多謝了!


在定時器1ms-10ms中斷中進行調用
回復

使用道具 舉報

10#
ID:860602 發表于 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
        }
}
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91精品观看 | 亚洲男人天堂2024 | 日本一区二区高清视频 | 国产丝袜一区二区三区免费视频 | 久草中文在线观看 | 日韩中文字幕 | 国产精品久久久久久久久久久久冷 | 成人h视频在线 | 欧美中文在线 | 国产精品美女一区二区三区 | 国产真实精品久久二三区 | 亚洲国产成人av | 精品国产精品一区二区夜夜嗨 | 免费人成在线观看网站 | 免费一级黄色电影 | 精品久久国产 | 一区精品视频在线观看 | 国产精品一区二区三区在线 | 久久男人 | 国产乱码久久久久久 | h片在线看| 欧美2区| 日本视频在线播放 | 91精品国产综合久久久久久漫画 | 啪视频在线 | 欧美在线观看免费观看视频 | 岛国av免费在线观看 | 一级做a爰片性色毛片 | 国产 日韩 欧美 在线 | 欧美精品在线免费观看 | 午夜精品一区二区三区免费视频 | 嫩草视频在线看 | 免费看色 | 欧美日韩专区 | 日本三级日产三级国产三级 | 久久精品亚洲 | 国产色网站 | 免费观看毛片 | 久久久久久久久久性 | 国产精品自产拍在线观看蜜 | 国产三级 |