Каталог
|
Подключение матричной клавиатуры к Arduino2011-12-31 Всі статті →Для одного проекта понадобилось вводить информацию в Arduino с помощью цифровой клавиатуры, почитав интернет понял что это достаточно просто. Для подключения клавиатуры используется два порта: порт ввода и порт вывода. Схема подключения клавиатуры приведена на рисунке. Как можно видеть для уменьшения количества выводов кнопки объединяют в строки и столбцы и затем, подавая единицу последовательно на каждую строку мы опрашиваем столбцы на предмет присутствия на них высокого уровня. Зная на какую строку мы подали напряжение и на каком столбце оно появилось мы можем вычислить какая именно кнопка нажата. Можно делать наоборот – напряжение подавать на столбцы, а опрашивать строки - разницы нет. Есть небольшой нюанс, на каждый вход надо подключить подтягивающий резистор, чтобы на нем присутствовал уровень логического ноля, если этого не сделать на ноге микропроцессора будет так называемое третье состояние и он может определять состояние входа как угодно, стабильной работы при этом добиться не удастся. На рисунке показана принципиальная схема подключения Arduino Nano к 16 кнопочной матричной клавиатуре.
А вот пример простой программы, которая печатает нажатую кнопку в окно терминала. void setup() { Serial.begin(9600); Serial.println("Starting..."); //определяем пины для строк и столбцов pinMode(2, INPUT); pinMode(3, INPUT); pinMode(4, INPUT); pinMode(5, INPUT); pinMode(6, OUTPUT); pinMode(7, OUTPUT); pinMode(8, OUTPUT); pinMode(9, OUTPUT); } int rows[]={9,8,7,6}; //указываем пины строк int cols[]={5,4,3,2}; //и столбцов //массив с соответствиями кодов нажатых кнопок char simbols[][2]={ {0,'1'}, {1,'2'}, {2,'3'}, {3,'A'}, {4,'4'}, {5,'5'}, {6,'6'}, {7,'B'}, {8,'7'}, {9,'8'}, {10,'9'}, {11,'C'}, {12,'*'}, {13,'0'}, {14,'#'}, {15,'D'} }; void loop() { for(int i=0;i<4;i++){ //цикл для перехода по всем строкам digitalWrite(rows[i], HIGH); //подаем на текущую строку высокий уровень for(int j=0;j<4;j++){ //цикл для переходов по всем столбцам if(digitalRead(cols[j])==HIGH){ //если уровень высокий, то кнопка нажата Serial.print(FindKey(4*i+j)); //выводим в терминал код нажатой кнопки } } digitalWrite(rows[i], LOW); //выключаем высокий уровень для пройденной строки } } //функция возвращающая код нажатой кнопки char FindKey(unsigned int keyCode){ for(int i=0;i<16;i++){ if(simbols[i][0]==keyCode){ return simbols[i][1]; } } return '-'; //если код на найден возвращаем ‘-‘ }
Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Satanas
24.02.2024 21:31:38
Вместо подтягивающих резисторов можно использовать встроенную подтяжку контроллера. pinMode(INPUT_PULLUP)
Vano
28.09.2023 01:02:39
В Вашем случае, когда D2 установлен в состояние HIGH a D3-D5 в состояние LOW, одновременное нажатие двух кнопок (например D2*D7 и D3*D7) приведёт к короткому замыканию и вероятному выгоранию порта!
V
16.06.2021 09:55:00
неправильний підхід до вирішення задачі
Giorgi
12.03.2018 01:45:20
помогите пожалуста этот код можна сделать так чтоб on работал через Bluetootn модуль HC-06тоесть передавал через Bluetootn модуль нажатую клавишу на мой компьютерогромное спасибо за помощь всем!giokalandarishvili@gmail.com
|