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

標(biāo)題: 十分好用的4*4矩陣鍵盤(pán)掃描程序 [打印本頁(yè)]

作者: hutians    時(shí)間: 2015-2-10 20:39
標(biāo)題: 十分好用的4*4矩陣鍵盤(pán)掃描程序
        十分好用的4*4矩陣鍵盤(pán)掃描程序,更重要的是程序十分的簡(jiǎn)短,幾行代碼就解決了4*4 掃描取鍵值,防抖動(dòng) ,此程序運(yùn)用了一個(gè)很巧妙的算法!上程序供大家研究,此程序經(jīng)過(guò)改進(jìn),可以實(shí)現(xiàn)長(zhǎng)按鍵識(shí)別 組合按鍵識(shí)別。如果有哪里不夠好 也請(qǐng)大家指出。程序算法先自己研究,初學(xué)者如果看不明白,貼子頂起來(lái),我給大家解釋?zhuān)“盐谋靖袷椒钌?直接復(fù)制到你的程序里。


  1. volatile unsigned char CF[4]; //按鍵觸發(fā)標(biāo)志(表示4列,每一列同一行的
  2. //值是一樣的但列標(biāo)不一樣來(lái)區(qū)分不同列的鍵)
  3. volatile unsigned char KeyVal;//鍵值
  4. code unsigned char KeyOut[4] = {0xef,0xdf,0xbf,0x7f}; //4X4按輸出端控制
  5. #define KEY P2 //P2口作為4*4矩陣鍵盤(pán)輸入
  6. /*
  7. **描述:新型4X4按鍵掃描程序 放在1ms-10ms中斷內(nèi)使用(十分穩(wěn)定不需要再寫(xiě)消抖程序)
  8. **備注:按鍵彈起時(shí) keyVal = 0 單鍵按下 keyVal 有16個(gè)值,你自己程序可以針對(duì)不同值
  9. **進(jìn)行不同程序操作 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. }
復(fù)制代碼




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

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

if(++i>=4) i=0;                                                                                //每輪判斷后,索引都+1,經(jīng)過(guò)4輪后又自動(dòng)恢復(fù)至0;

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

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

switch(Key_Code)                                        //將第i輪按鍵讀取值附上i輪索引值,以便產(chǎn)生16個(gè)可能的鍵值供判斷按鍵用
{
        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    時(shí)間: 2020-2-23 21:58
學(xué)習(xí)了謝謝
作者: wengjiamin    時(shí)間: 2021-1-9 09:07
樓主好,程序好精練,中間有好多地方看不懂,但是復(fù)制下來(lái),在程序中試了你的程序,發(fā)現(xiàn)少定義了Cont[i]數(shù)組,加上后,程序也不成功,請(qǐng)教在主函數(shù)中如何調(diào)用 你的函數(shù),多謝了!


在定時(shí)器1ms-10ms中斷中進(jìn)行調(diào)用
作者: wengjiamin    時(shí)間: 2021-1-9 09:11
//反轉(zhuǎn)法掃描4*4鍵盤(pán)程序
void keyscan(void) //鍵盤(pán)掃描函數(shù)
{        unsigned char n,m;
    P1=0xf0;//全行掃描
        n=P1;   //讀列的狀態(tài)
        n&=0xf0;//屏蔽掉行的狀態(tài)
        P1=0x0f;//全列掃描
        m=P1;//讀行的狀態(tài)
        m&=0x0f;//屏蔽掉列的狀態(tài)
        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.raoushi.com/bbs/) Powered by Discuz! X3.1