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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

【Arduino】168種傳感器模塊系列實驗(140)---跑馬燈矩陣鍵盤模塊

[復制鏈接]
跳轉到指定樓層
樓主
37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒于本人手頭積累了一些傳感器和模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里準備逐一動手試試做實驗,不管成功與否,都會記錄下來---小小的進步或是搞不定的問題,希望能夠拋磚引玉。

【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
(4*4矩陣鍵盤+4位獨立按鍵+8位跑馬燈組合模塊)




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

使用道具 舉報

沙發
ID:513258 發表于 2020-2-27 20:57 | 只看該作者
4X4矩陣鍵盤
是單片機外部設備中所使用的排布類似于矩陣的鍵盤組。矩陣式結構的鍵盤顯然比直接法要復雜一些,識別也要復雜一些,列線通過電阻接正電源,并將行線所接的單片機的I/O口作為輸出端,而列線所接的I/O口則作為輸入。由于電路設計時需要更多的外部輸入,單獨的控制一個按鍵需要浪費很多的IO資源,所以就有了矩陣鍵盤,常用的矩陣鍵盤有4X4和8X8,其中用的最多的是4X4。


回復

使用道具 舉報

板凳
ID:513258 發表于 2020-2-27 21:00 | 只看該作者
工作原理
矩陣鍵盤又稱為行列式鍵盤,它是用4條I/O線作為行線,4條I/O線作為列線組成的鍵盤。在行線和列線的每一個交叉點上,設置一個按鍵。這樣鍵盤中按鍵的個數是4X4個。這種行列式鍵盤結構能夠有效地提高單片機系統中I/O口的利用率。由于單片機IO端口具有線與的功能,因此當任意一個按鍵按下時,行和列都有一根線被線與,通過運算就可以得出按鍵的坐標從而判斷按鍵鍵值。






回復

使用道具 舉報

地板
ID:513258 發表于 2020-2-27 21:08 | 只看該作者
行列掃描法原理
1、使行線為編程的輸入線,列線是輸出線,拉低所有的列線,判斷行線的變化,如果有按鍵按下,按鍵按下的對應行線被拉低,否則所有的行線都為高電平。
2、在第一步判斷有鍵按下后, 延時10ms消除機械抖動,再次讀取行值,如果此行線還處于低電平狀態則進入下 一步,否則返回第一步重新判斷。
3、開始掃描按鍵位置,采用逐 行掃描,每間隔1ms的時間,分別拉低第一列,第二列,第三列,第四 列,無論拉低哪一列其他三列都為高電平,讀取行值找到按鍵的位置,分別把行值和列值儲存在寄存器里。
4、從寄存器中找到行值和列 值并把其合并,得到按鍵值,對此按鍵值進行編碼,按照從第一行第一個一直到第四行第四個逐行進行編碼,編碼值從“0000” 至“1111” , 再進行譯碼,最后顯示按鍵號碼。




回復

使用道具 舉報

5#
ID:513258 發表于 2020-2-28 08:30 | 只看該作者
4X4矩陣4管腳直插按鍵鍵盤
(1)體積小;
(2)節省空間;
(3)使用方便;
(4)共計16按鍵;
(5)單片機外擴鍵盤的上佳選擇。



回復

使用道具 舉報

6#
ID:513258 發表于 2020-2-28 09:16 | 只看該作者
矩陣鍵盤所需庫文件<Keypad>
在Arduino IDE 1.8.10 或者以上版本中, 項目->加載庫->管理庫中搜索Keypad,然后安裝即可。
也可以下載庫(需要下載庫文件 https://github.com/Chris--A/Keypad),然后手動添加到IDE中。




回復

使用道具 舉報

7#
ID:513258 發表于 2020-2-28 09:24 | 只看該作者
4*4矩陣鍵盤+4位獨立按鍵+8位跑馬燈組合模塊



回復

使用道具 舉報

8#
ID:513258 發表于 2020-2-28 09:28 | 只看該作者
4*4矩陣鍵盤+4位獨立按鍵+8位跑馬燈組合模塊



回復

使用道具 舉報

9#
ID:513258 發表于 2020-2-28 10:01 | 只看該作者



回復

使用道具 舉報

10#
ID:513258 發表于 2020-2-28 12:54 | 只看該作者
測試矩陣鍵盤部分接線示意圖



回復

使用道具 舉報

11#
ID:513258 發表于 2020-2-28 13:02 | 只看該作者
模塊上4*4矩陣鍵盤有一個8腳的端口,理論上可以直接插到Arduino的0-7腳上,但0,1腳用于串口通信,所以只能選擇2~13腳,這里選用了2-9腳。

Keypad Pin L1 –> Arduino Pin 2  (行)
Keypad Pin L2 –> Arduino Pin 3
Keypad Pin L3 –> Arduino Pin 4
Keypad Pin L4 –> Arduino Pin 5
Keypad Pin R1 –> Arduino Pin 6  (列)
Keypad Pin R2 –> Arduino Pin 7
Keypad Pin R3 –> Arduino Pin 8
Keypad Pin R4 –> Arduino Pin 9

回復

使用道具 舉報

12#
ID:513258 發表于 2020-2-28 14:01 | 只看該作者

程序之一:測試矩陣鍵盤部分

  1. /*
  2. 【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3. 實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
  4. 程序之一:測試矩陣鍵盤部分
  5. */

  6. #include <Keypad.h>

  7. const byte ROWS = 4;
  8. const byte COLS = 4;

  9. char hexaKeys[ROWS][COLS] = {
  10.   {'1','2','3','A'},
  11.   {'4','5','6','B'},
  12.   {'7','8','9','C'},
  13.   {'*','0','#','D'}
  14. };

  15. byte rowPins[ROWS] = {2, 3, 4, 5};
  16. byte colPins[COLS] = {6, 7, 8, 9};

  17. Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

  18. void setup(){
  19.   Serial.begin(9600);
  20. }

  21. void loop(){
  22.   char customKey = customKeypad.getKey();

  23.   if (customKey){
  24.     Serial.println(customKey);
  25.   }
  26. }
復制代碼



回復

使用道具 舉報

13#
ID:513258 發表于 2020-2-28 14:05 | 只看該作者
串口輸出16位矩陣鍵值




回復

使用道具 舉報

14#
ID:513258 發表于 2020-2-28 15:19 | 只看該作者

程序之二:矩陣鍵盤部分測試每個按鍵的按下與松開

  1. /*
  2.   【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
  4.   程序之二:矩陣鍵盤部分測試每個按鍵的按下與松開
  5. */

  6. #include "Adafruit_Keypad.h"

  7. const byte ROWS = 4; // 行
  8. const byte COLS = 4; // 列
  9. //定義鍵盤按鈕上的符號
  10. char hexaKeys[ROWS][COLS] = {
  11.   {'1', '2', '3', 'A'},
  12.   {'4', '5', '6', 'B'},
  13.   {'7', '8', '9', 'C'},
  14.   {'*', '0', '#', 'D'}
  15. };

  16. byte rowPins[ROWS] = {2, 3, 4, 5}; //連接到鍵盤的行插腳
  17. byte colPins[COLS] = {6, 7, 8, 9}; //連接到鍵盤的列插腳

  18. //初始化類NewKeypad的實例
  19. Adafruit_Keypad customKeypad = Adafruit_Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

  20. void setup() {
  21.   Serial.begin(9600);
  22.   customKeypad.begin();

  23. }

  24. void loop() {
  25.   //把你的主代碼放在這里,重復運行
  26.   customKeypad.tick();

  27.   while (customKeypad.available()) {
  28.     keypadEvent e = customKeypad.read();
  29.     Serial.print((char)e.bit.KEY);
  30.     if (e.bit.EVENT == KEY_JUST_PRESSED) Serial.println(" pressed");
  31.     else if (e.bit.EVENT == KEY_JUST_RELEASED) Serial.println(" released");
  32.   }

  33.   delay(10);
  34. }
復制代碼



回復

使用道具 舉報

15#
ID:513258 發表于 2020-2-28 15:22 | 只看該作者

回復

使用道具 舉報

16#
ID:513258 發表于 2020-2-28 16:17 | 只看該作者
本帖最后由 eagler8 于 2020-2-28 16:19 編輯

程序之三:矩陣鍵盤部分測試按鍵'*'和 '#'控制LED燈(板載13腳)

  1. /*
  2.   【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
  4.   程序之三:矩陣鍵盤部分測試按鍵'*'和 '#'控制LED燈(板載13腳)
  5. */

  6. #include <Keypad.h>

  7. const byte ROWS = 4; //四行
  8. const byte COLS = 3; //三列
  9. //定義鍵盤按鈕上的符號
  10. char keys[ROWS][COLS] = {
  11.   {'1', '2', '3'},
  12.   {'4', '5', '6'},
  13.   {'7', '8', '9'},
  14.   {'*', '0', '#'}
  15. };

  16. byte rowPins[ROWS] = {2, 3, 4, 5}; //連接到鍵盤的行插腳
  17. byte colPins[COLS] = {6, 7, 8};  //連接到鍵盤的列插腳

  18. Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
  19. byte ledPin = 13;

  20. boolean blink = false;
  21. boolean ledPin_state;

  22. void setup() {
  23.   Serial.begin(9600);
  24.   pinMode(ledPin, OUTPUT);              // 將數字管腳設置為輸出
  25.   digitalWrite(ledPin, HIGH);           // 打開LED
  26.   ledPin_state = digitalRead(ledPin);   // 存儲初始LED狀態。當LED亮起時為高
  27.   keypad.addEventListener(keypadEvent); // 為此鍵盤添加事件偵聽器
  28. }

  29. void loop() {
  30.   char key = keypad.getKey();

  31.   if (key) {
  32.     Serial.println(key);
  33.   }
  34.   if (blink) {
  35.     digitalWrite(ledPin, !digitalRead(ledPin));   // 將LED引腳從Hi2Lo或Lo2Hi更改
  36.     delay(100);
  37.   }
  38. }

  39. // 處理一些特殊事件
  40. void keypadEvent(KeypadEvent key) {
  41.   switch (keypad.getState()) {
  42.     case PRESSED:
  43.       if (key == '#') {
  44.         digitalWrite(ledPin, !digitalRead(ledPin));
  45.         ledPin_state = digitalRead(ledPin);        // 記住LED狀態,亮或不亮
  46.       }
  47.       break;

  48.     case RELEASED:
  49.       if (key == '*') {
  50.         digitalWrite(ledPin, ledPin_state);   // 從開始閃爍前恢復LED狀態
  51.         blink = false;
  52.       }
  53.       break;

  54.     case HOLD:
  55.       if (key == '*') {
  56.         blink = true;    // 按住*鍵時,LED閃爍
  57.       }
  58.       break;
  59.   }
  60. }
復制代碼



回復

使用道具 舉報

17#
ID:513258 發表于 2020-2-28 16:25 | 只看該作者
'#'鍵控制LED燈自鎖開關,'*'鍵按下時LED閃爍,松開熄滅



回復

使用道具 舉報

18#
ID:513258 發表于 2020-2-28 16:38 | 只看該作者
測試跑馬燈部分接線示意圖



回復

使用道具 舉報

19#
ID:513258 發表于 2020-2-28 16:41 | 只看該作者

回復

使用道具 舉報

20#
ID:513258 發表于 2020-2-29 09:43 | 只看該作者
程序之四:測試跑馬燈部分,循環逐個點亮,逐個熄滅

  1. /*
  2.   【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
  4.   程序之四:測試跑馬燈部分,循環逐個點亮,逐個熄滅
  5. */

  6. int BASE = 6 ;
  7. int NUM = 8;

  8. void setup()
  9. {
  10.   for (int i = BASE; i < BASE + NUM; i ++)
  11.   {
  12.     pinMode(i, OUTPUT);
  13.   }
  14. }

  15. void loop()
  16. {
  17.   for (int i = BASE; i < BASE + NUM; i ++)
  18.   {
  19.     digitalWrite(i, LOW);
  20.     delay(200);
  21.   }
  22.   for (int i = BASE; i < BASE + NUM; i ++)
  23.   {
  24.     digitalWrite(i, HIGH);
  25.     delay(200);
  26.   }
  27. }
復制代碼



回復

使用道具 舉報

21#
ID:513258 發表于 2020-2-29 09:51 | 只看該作者

回復

使用道具 舉報

22#
ID:513258 發表于 2020-2-29 10:07 | 只看該作者
  1. /*
  2.   【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
  4.   程序之五:測試跑馬燈部分,循環單個熄滅
  5. */

  6. byte ledPin[] = {6, 7, 8, 9, 10, 11, 12, 13};
  7. int ledDelay(300);
  8. int direction = 1;
  9. int currentLED = 0;
  10. unsigned long changeTime;
  11. void setup() {
  12.   for (int x = 0; x <= 7; x++)
  13.     pinMode(ledPin[x], OUTPUT); //數組從0開始分配存儲單元,這里要非常注意循環變量的初值和終值,0-7剛好循環至8
  14.   changeTime = millis();
  15. }

  16. void loop() {
  17.   if ((millis() - changeTime) > ledDelay)
  18.   { changeLED(); //運行時間如果超過一個數量的延時時間,則由函數changeLED()控制LED點亮的變化
  19.     changeTime = millis();
  20.   }
  21. }



  22. void changeLED() {
  23.   for (int x = 0; x <= 7; x++)
  24.   { digitalWrite(ledPin[x], LOW); //8只LED燈低平信號,熄滅
  25.   }
  26.   digitalWrite(ledPin[currentLED], HIGH); //設當前LED高平信號,點亮
  27.   currentLED += direction; //當前值增加為direction表示的值
  28.   if (currentLED == 7) {
  29.     direction = -1; //當前燈為第8只燈,currentLED當前值改為-1,改變亮燈方向
  30.   }
  31.   if (currentLED == 0) {
  32.     direction = 1; //當前燈為第1只燈,currentLED當前值為+1,從第1只燈開始計數
  33.   }

  34. }
復制代碼


回復

使用道具 舉報

23#
ID:513258 發表于 2020-2-29 10:17 | 只看該作者
測試獨立按鍵部分+跑馬燈部分




回復

使用道具 舉報

24#
ID:513258 發表于 2020-2-29 10:42 | 只看該作者
程序之六:測試獨立按鍵部分+跑馬燈部分,按鍵控制跑馬燈

  1. /*
  2.   【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形+仿真)
  3.   實驗一百四十:YL-004老款20按鍵獨立鍵盤 跑馬燈矩陣鍵盤模塊
  4.   程序之六:測試獨立按鍵部分+跑馬燈部分,按鍵控制跑馬燈
  5. */

  6. int buttonPin = 2 ;   // 定義按鍵引腳
  7. int BASE = 6;        // 定義第一個LED引腳
  8. int NUM = 8;         // LED 的總數
  9. int val;

  10. void setup()
  11. {
  12.   Serial.begin(9600);
  13.   pinMode(buttonPin, INPUT);
  14.   for (int i = BASE; i < BASE + NUM; i ++)
  15.   {
  16.     pinMode(i, OUTPUT);   // 設定LED引腳為輸出引腳
  17.   }
  18. }

  19. void loop()
  20. {
  21.   liangdeng();            // 循環亮燈子程序
  22.   delay(200);             // 每次循環間隔時間
  23.   miedeng();              // LED全滅子程序
  24. }

  25. void liangdeng()
  26. {
  27.   for (int i = BASE; i < BASE + NUM; i ++)
  28.   {
  29.     digitalWrite(i, LOW);  //設定LED引腳逐個輸出高電平逐個點亮
  30.     val = digitalRead(buttonPin);   // 儲存按鍵變換量
  31.     if (val == HIGH)          //判斷是否按下按鍵,弱已按下按鍵跳出當前循環
  32.     {
  33.       val = HIGH;
  34.       break;
  35.     }
  36.     delay(200);        //延時
  37.   }
  38. }

  39. void miedeng()
  40. {
  41.   for (int i = BASE; i < BASE + NUM; i ++)
  42.   {
  43.     digitalWrite(i, HIGH);    //設定LED引腳逐個輸出低電平逐個點亮
  44.   }
  45. }
復制代碼



回復

使用道具 舉報

25#
ID:513258 發表于 2020-2-29 15:02 | 只看該作者
編玩邊學開源圖形編程




回復

使用道具 舉報

26#
ID:513258 發表于 2020-2-29 15:17 | 只看該作者
實驗開源仿真編程(linkboy3.6)



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久成人亚洲 | 在线不卡视频 | 精品免费国产视频 | 久久91精品国产一区二区三区 | 伊人激情综合网 | 午夜精品视频 | 日韩av在线一区二区 | 国产精品久久久久久久久久免费看 | com.色.www在线观看 | 久久久高清 | 日韩在线大片 | 91欧美激情一区二区三区成人 | www四虎com| 亚洲免费人成在线视频观看 | 久久久999精品 | 国产精品久久久久久久久久三级 | 国产玖玖 | 国产黄色一级电影 | 毛片一区二区三区 | 欧美精品一区免费 | 九九热免费看 | 欧美在线观看一区 | 中文av电影 | 81精品国产乱码久久久久久 | 视频一区二区在线观看 | 一区二区三区四区在线视频 | 午夜精品久久久久久久久久久久久 | 午夜寂寞影院在线观看 | 三级av网址 | 欧美v在线观看 | 中文在线观看视频 | www.47久久青青| 特级黄一级播放 | 欧美一区二区在线观看 | 91精品国产99 | 成人av一区二区三区 | 日日夜夜天天 | 女人牲交视频一级毛片 | 久久久一区二区 | 国产精品99一区二区 | 九九久久精品视频 |