3.4 51單片機-矩陣鍵盤

      網友投稿 811 2025-04-01

      3.4 51單片機-矩陣鍵盤

      3.4?矩陣鍵盤

      3.4.1 矩陣鍵盤原理圖

      要使用矩陣鍵盤,需要將JP4接到JP8(P1)上面,JP165跳線帽需要斷開(否則會導致矩陣鍵盤最右一排無法正常使用)。

      圖3-4-1

      圖3-4-2(這張圖看起來更加方便)

      圖3-4-3

      3.4.2 矩陣鍵盤介紹

      在鍵盤中按鍵數量較多時,為了減少I/O口的占用,通常將按鍵排列成矩陣形式。在矩陣式鍵盤中,每條水平線和垂直線在交叉處不直接連通,而是通過一個按鍵加以連接。這樣,一個端口(如P1口)就可以構成4*4=16個按鍵,比之直接將端口線用于鍵盤多出了一倍,而且線數越多,區別越明顯,比如再多加一條線就可以構成20鍵的鍵盤,而直接用端口線則只能多出一鍵(9鍵),在需要的鍵數比較多時,采用矩陣法來做鍵盤是合理的。

      矩陣按鍵設置在行、列線交點上;行、列線分別連接到按鍵開關的兩端,行線通過上拉電阻接到+5V電源上。無按鍵按下時,行線處于高電平的狀態,而當有按鍵按下時,行線電平與此行線相連的列線電平決定。

      3.4.3 示例代碼:?行列掃描

      下面示例代碼,使用矩陣鍵盤行列掃描,反轉法檢測按鍵按下的狀態。

      示例代碼:

      #include?

      #define?KEY?P1?? //定義按鍵

      sbit?key1=KEY^0;

      sbit?key2=KEY^1;

      sbit?key3=KEY^2;

      sbit?key4=KEY^3;

      sbit?key5=KEY^4;

      sbit?key6=KEY^5;

      sbit?key7=KEY^6;

      sbit?key8=KEY^7;

      /*

      矩陣鍵盤掃描函數

      矩陣鍵盤尺寸:4*4

      接在P1口上。

      */

      u8?Array_Scan(void)

      {

      u8?key_a=0,key_b=0,key_c=0,key_d=0;??//用來存放矩陣按鍵按下的標志

      KEY=0xF0;?//矩陣鍵盤賦值,4個IO為高電平4個IO為低電平

      if(KEY!=0xF0)?//判斷是否有按鍵按下

      {

      DelayMs(50);??//消抖

      if(KEY!=0xF0)?//再次判斷

      {

      //檢測是哪一排的按鍵的按下了

      if(key5==0)key_a=1;?//s1,s5,s9,s13?其中一個按鍵按下

      if(key6==0)key_b=1;?//s2?s6?s10?s14?其中一個按鍵按下

      if(key7==0)key_c=1;?//s3?s7?s11?s15?其中一個按鍵按下

      if(key8==0)key_d=1;?//s4?s8?s12?s16?其中一個按鍵按下

      KEY=0x0F;?//反轉法重新賦值

      if(KEY!=0x0F)?//檢測按鍵是否按下

      {

      if(key1==0&&key_a==1)return?1;

      if(key1==0&&key_b==1)return?2;

      if(key1==0&&key_c==1)return?3;

      if(key1==0&&key_d==1)return?4;

      if(key2==0&&key_a==1)return?5;

      if(key2==0&&key_b==1)return?6;

      if(key2==0&&key_c==1)return?7;

      if(key2==0&&key_d==1)return?8;

      if(key3==0&&key_a==1)return?9;

      if(key3==0&&key_b==1)return?10;

      if(key3==0&&key_c==1)return?11;

      if(key3==0&&key_d==1)return?12;

      if(key4==0&&key_a==1)return?13;

      if(key4==0&&key_b==1)return?14;

      if(key4==0&&key_c==1)return?15;

      if(key4==0&&key_d==1)return?16;

      }

      }

      }

      return?0;

      }

      3.4.4 示例代碼:?增加按鍵松開檢測

      下面代碼里增加了一個靜態變量,記錄按鍵按下的狀態,全部按鍵松開再清除標志位,如果有按鍵沒有松開,就無法進行二次檢測,這樣可以達到精準消抖效果。

      示例代碼:

      #include?

      #define?KEY?P1??//定義按鍵

      sbit?key1=KEY^0;

      sbit?key2=KEY^1;

      sbit?key3=KEY^2;

      sbit?key4=KEY^3;

      sbit?key5=KEY^4;

      sbit?key6=KEY^5;

      sbit?key7=KEY^6;

      sbit?key8=KEY^7;

      /*

      矩陣鍵盤掃描函數

      矩陣鍵盤尺寸:4*4

      接在P1口上。

      */

      u8?Array_Scan(void)

      {

      static?u8?flag=0;

      u8?key_a=0,key_b=0,key_c=0,key_d=0;??//用來存放矩陣按鍵按下的標志

      KEY=0xF0;?//矩陣鍵盤賦值,4個IO為高電平4個IO為低電平

      if((KEY!=0xF0)&&(flag==0))?//判斷是否有按鍵按下

      {

      DelayMs(50);??//消抖

      if((KEY!=0xF0)&&(flag==0))?//再次判斷

      {

      flag=1;?//記錄按鍵按下

      //檢測是哪一排的按鍵的按下了

      if(key5==0)key_a=1;?//s1,s5,s9,s13?其中一個按鍵按下

      if(key6==0)key_b=1;?//s2?s6?s10?s14?其中一個按鍵按下

      if(key7==0)key_c=1;?//s3?s7?s11?s15?其中一個按鍵按下

      if(key8==0)key_d=1;?//s4?s8?s12?s16?其中一個按鍵按下

      KEY=0x0F;?//反轉法重新賦值

      if(KEY!=0x0F)?//檢測按鍵是否按下

      {

      if(key1==0&&key_a==1)return?1;

      if(key1==0&&key_b==1)return?2;

      if(key1==0&&key_c==1)return?3;

      if(key1==0&&key_d==1)return?4;

      if(key2==0&&key_a==1)return?5;

      if(key2==0&&key_b==1)return?6;

      if(key2==0&&key_c==1)return?7;

      if(key2==0&&key_d==1)return?8;

      if(key3==0&&key_a==1)return?9;

      if(key3==0&&key_b==1)return?10;

      if(key3==0&&key_c==1)return?11;

      if(key3==0&&key_d==1)return?12;

      if(key4==0&&key_a==1)return?13;

      if(key4==0&&key_b==1)return?14;

      if(key4==0&&key_c==1)return?15;

      if(key4==0&&key_d==1)return?16;

      }

      }

      }

      else?if(KEY==0xF0)?//按鍵全部松開

      {

      flag=0;

      }

      return?0;

      }

      單片機

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Git 的命令行接口 #yyds干貨盤點#
      下一篇:excel如何實現一列數據上下翻轉(excel一列數據整體下移)
      相關文章
      亚洲中文字幕第一页在线| 国产精品亚洲二区在线| 亚洲日韩中文字幕在线播放| 亚洲国产成人精品91久久久| 色噜噜噜噜亚洲第一| 亚洲熟妇无码AV不卡在线播放| 亚洲AV色吊丝无码| 亚洲AV无码一区二区三区人 | 亚洲AV无码乱码在线观看牲色| 亚洲av中文无码字幕色不卡| 色窝窝亚洲av网| 国内成人精品亚洲日本语音 | 亚洲综合婷婷久久| 色婷婷亚洲十月十月色天| 亚洲黄色免费电影| 亚洲成AV人片久久| 中文文字幕文字幕亚洲色| 亚洲日韩av无码中文| 亚洲成av人在线观看网站 | 亚洲精品无码av片| 日韩精品电影一区亚洲| 亚洲成A人片在线观看无码3D| 亚洲精品无码99在线观看| 久久精品国产精品亚洲| 国产亚洲精品久久久久秋霞| 亚洲处破女AV日韩精品| 亚洲尹人九九大色香蕉网站| 亚洲小说区图片区| 亚洲色少妇熟女11p| 日韩欧美亚洲中文乱码| 亚洲国产精品无码久久久久久曰| 小说区亚洲自拍另类| 久久久久无码专区亚洲av | 亚洲AV无码专区在线观看成人| 国产亚洲成在线播放va| 亚洲色婷婷综合久久| 色噜噜综合亚洲av中文无码| 亚洲va在线va天堂成人| 精品亚洲视频在线| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 国产亚洲一卡2卡3卡4卡新区|