неясности с пленочной клавиатурой

spyphy
Offline
Зарегистрирован: 11.08.2015

Подключаю вот такую клаву к 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 мс существенна, остальные я добавил с целью найти причину бага.

spyphy
Offline
Зарегистрирован: 11.08.2015

Всё ок. С утра нашел ошибку. Дело было не в клаве и не в резисторах. При выходе через return забывал восстанавливать уровень на пине.