В дружных рядах *duin-щиков я совсем недавно посему прошу сильно не пинать. 🙂
Приобрел на ебее кит для duino куда входила матричная клавиатура 4х4. (см. фото).
Подключил, написал простенькую программку. Все исправно работало. Пока однажды 16 кодов выдаваемых клавой не оказалось мало. Вот тут и вспомнилось про модификаторы типа Alt,Ctrl, Shift.
Решил допилить свой кусок кода. В результате получилась своеобразная «Мультитач» — клавиатура, которая различает нажатие двух и более клавиш одновременно. Конечно не все возможные комбинации обрабатываются однозначно, но одновременное нажатие клавиш расположенных в разных строках и столбцах обрабатываются. Я не профессионал в программировании поэтому может это и коряво, но работает!
Кстати, Дуинка у меня Мега2560, поэтому ног для подключения не так жалко.
Код:
/* Написано 04.2012 Григорием aka SkyFort в содружестве с бутылочкой пивасика.... :) Любые улучшения и исправления только приветствуются! */ #define _BV(x) (1<<(x)) //Макрос побитового сдвига для удобства // Определяем ноги Дуинки int send_Pin[4] = {38,39,40,41}; //Передача int recv_Pin[4] = {42,43,44,45}; //Прием void keyboard_init() // Инициализируем... и так понятно { int i; for (i = 0; i < 4; i++){ pinMode(send_Pin[i], OUTPUT); pinMode(recv_Pin[i], INPUT); } } int scanmatrix() // Сканируем матрицу { int i; int j; int code = 0; boolean key; for (i = 0; i < 4; i++) { digitalWrite(send_Pin[i], HIGH); j = 0; for (j = 0; j < 4; j++) { if(digitalRead(recv_Pin[j])) { code=code | _BV(j); key = true; } } if(key) { code=code | _BV(i+4); } digitalWrite(send_Pin[i],LOW); key = false; } return code; } int keyboard(int time) // time - противодребезговая задержка { int key = scanmatrix(); delay(time); int key2 = scanmatrix(); // Преобразуем сканкоды кнопок в ASCII if(key2 == key) { switch (key) { case 17: return 0x31; break; case 18: return 0x32; break; case 20: return 0x33; break; case 33: return 0x34; break; case 34: return 0x35; break; case 36: return 0x36; break; case 65: return 0x37; break; case 66: return 0x38; break; case 68: return 0x39; break; case 24: return 0x41; break; case 40: return 0x42; break; case 72: return 0x43; break; case 130: return 0x30; break; case 136: return 0x44; break; case 129: return 0x2a; break; case 132: return 0x23; break; default: return key; // Модифицированные коды отдаем как есть. } } return 0; // Ничего не нажато - вернем 0 } void setup (){ Serial.begin(9600); keyboard_init(); } void loop(){ char code; boolean flash; code = keyboard(150); if(code != 0) {Serial.println(code); } }
Ну вот как-то так!