標(biāo)題: 3*3矩陣鍵盤如何解決另外兩個端口資源的占用問題 [打印本頁]

作者: 小學(xué)僧    時間: 2019-3-10 18:43
標(biāo)題: 3*3矩陣鍵盤如何解決另外兩個端口資源的占用問題
因?yàn)橐O(shè)計(jì)一個單片機(jī)3*3的矩陣按鍵,但又不想浪費(fèi)另外兩個mcu端口資源,跪求大神能幫忙想個方法。
作者: Y_G_G    時間: 2019-3-10 23:49
3*3不是用掃描的嗎?一個X端口高電平,然后去檢查Y端口的電平,沒有檢測到電平變化就掃描下一行,這不就可以了,另外兩個還是一樣的正常使用呀
作者: 就你****    時間: 2019-3-11 06:29
你是要9個鍵,建議你看一下:這個http://www.torrancerestoration.com/bbs/dpj-152064-1.html
作者: ahshmj    時間: 2019-3-11 07:32
不影響多出的兩個IO正常使用的。
作者: wulin    時間: 2019-3-11 17:11
給你寫一個3*3矩陣鍵盤不占用剩余IO口演示程序,有詳細(xì)注釋。順序取了P3.0~3.5,按此規(guī)律可以取任意一組的任意6個IO口。

  1. #include <reg52.h>
  2. #define uint unsigned int                 //宏定義無符號整型數(shù)據(jù)
  3. #define uchar unsigned char         //宏定義無符號字符型數(shù)據(jù)

  4. uchar key=0;                                        //定義鍵值全局變量

  5. void keyscan()                                        //按鍵掃描程序
  6. {
  7.         static bit sign=0;                        //按鍵自鎖標(biāo)志
  8.         static uint count=0;                //消抖計(jì)數(shù)變量                       
  9.         uchar temp1=0,temp2=0,temp3;//臨時變量
  10.         P3|=0x3f;                                        //賦值P3,保留高2位不變,操作低6位 xx11 1111 x為0或1
  11.         P3&=0xf8;                                        //賦值P3,保留高2位不變,操作低6位 xx11 1000 x為0或1
  12.         temp1=P3&0x38;                                //保存P3低6位狀態(tài)到temp1
  13.         if(temp1!=0x38)                                //檢測有按鍵按下
  14.         {
  15.                 count++;                                //消抖計(jì)數(shù)
  16.                 if((count>=250)&&(sign==0))//count100~1000,根據(jù)主循環(huán)周期調(diào)整約10~20ms
  17.                 {                       
  18.                         sign=1;                                //按鍵自鎖標(biāo)志置1
  19.                         P3|=0x3f;                        //賦值P3,保留高2位不變,操作低6位 xx11 1111 x為0或1
  20.                         P3&=0xc7;                        //賦值P3,保留高2位不變,操作低6位 xx00 0111 x為0或1
  21.                         temp2=P3&0x07;                //保存P3低6位狀態(tài)到temp2
  22.                         temp3=temp2|temp1;        //保存temp2和temp1相或值
  23.                         switch(temp3)
  24.                         {
  25.                                 case 0x36: key=1; break;
  26.                                 case 0x35: key=2; break;
  27.                                 case 0x33: key=3; break;
  28.                                 case 0x2e: key=4; break;
  29.                                 case 0x2d: key=5; break;
  30.                                 case 0x2b: key=6; break;
  31.                                 case 0x1e: key=7; break;
  32.                                 case 0x1d: key=8; break;
  33.                                 case 0x1b: key=9; break;
  34.                         }
  35.                 }
  36.         }
  37.         else                                                //鍵抬起
  38.         {
  39.                 sign=0;                                        //按鍵有效標(biāo)志清0
  40.                 count=0;                                //消抖計(jì)數(shù)清0
  41.         }
  42. }

  43. void main()                                                //主函數(shù)
  44. {

  45.         while(1)
  46.         {
  47.                 keyscan();                                //按鍵掃描程序
  48.                 P1=key;                                        //P1顯示(2進(jìn)制)
  49.         }
  50. }
復(fù)制代碼





作者: 小學(xué)僧    時間: 2019-3-25 12:04
wulin 發(fā)表于 2019-3-11 17:11
給你寫一個3*3矩陣鍵盤不占用剩余IO口演示程序,有詳細(xì)注釋。順序取了P3.0~3.5,按此規(guī)律可以取任意一組的 ...

感謝您的幫助,因?yàn)橹拔乙呀?jīng)解決這個問題了,所以到現(xiàn)在才看到這個回復(fù),看了您的答案,使我有了新的感悟,再次感謝您的幫助。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1