неясности с пленочной клавиатурой
- Войдите на сайт для отправки комментариев
Сб, 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забывал восстанавливать уровень на пине.