неясности с пленочной клавиатурой
- Войдите на сайт для отправки комментариев
Сб, 26/12/2015 - 01:29
Подключаю вот такую клаву к Nano. Напрямую (без резисторов и прочего). Код достаточной простой. И вроде работает, но не совсем так как надо.
Если нажать клавишу на короткое время, так чтобы контроллер успел считать показания только 1 раз, то всё ОК.
Но если нажать и удерживать, то только первая цифра будет правильной, а последующие будут из верхней строки того же столбца. Например, если нажать и держать 8, то результат будет такой:
8222222222...
Почему так???
Собственной код.
#include "Arduino.h" #include <avr/io.h> #include <util/delay.h> #include <Wire.h> #include <LiquidCrystal_I2C.h> const int numrow=4; const int numcol=4; const char key[numrow][numcol] = { {'1','2','3','A'}, {'4','5','6','B'}, {'7','8','9','C'}, {'*','0','#','D'} }; const int rowpins[numrow] = {5,6,7,8}; // OUT const int colpins[numcol] = {9,10,11,12}; // IN char str[17]="................"; int t=0; char getKey() { for(int i=0; i<numrow; i++) { digitalWrite(rowpins[i], LOW); // подаем лог. 0 delay(5); for(int j=0; j<numcol; j++) { delay(1); if (digitalRead(colpins[j]) == LOW) { // если лог. 0 на входе return key[i][j]; } delay(1); } digitalWrite(rowpins[i], HIGH); delay(1); } return 0; } LiquidCrystal_I2C lcd(0x27,16,2); void setup() { for(int i=0; i<numrow; i++) { pinMode(rowpins[i], OUTPUT); digitalWrite(rowpins[i], HIGH); // HIGH } for(int j=0; j<numcol; j++) { pinMode(colpins[j], INPUT); digitalWrite(colpins[j], HIGH); // включ. подтяг. резисторы } lcd.init(); lcd.backlight(); lcd.clear(); lcd.setCursor(0,1); lcd.print("input"); } void loop() { char ch = getKey(); if (ch>0) { str[t++]=ch; if (t>15) t=0; lcd.setCursor(0,0); lcd.print(str); } delay(300); }
Здесь только последняя задержка 300 мс существенна, остальные я добавил с целью найти причину бага.
Всё ок. С утра нашел ошибку. Дело было не в клаве и не в резисторах. При выходе через
return
забывал восстанавливать уровень на пине.