Всем привет народ! я одного своего проекта в машину, учусь обрабатывать калвиатуру матрицу из двух столбцов и трех строк. Вроде бы рабозбрался, но не могу завести работу обработки долго во нажатия клавиши... код приложил, подскажите где не так делаю?
#define rows 3
#define cols 2
// номера кнопок в соответствии со схемой
const byte keys[rows][cols] =
{
{1,4},
{2,5},
{6,3}
};
// номера пинов
const byte rowPins[rows] = {10, 9, 8}; // строки (желтый10, зеленый9, голубой8)
const byte colPins[cols] = {7, 5}; // столбцы (черный7, красный5)
// маски для клавиш
#define MaskMediaButton 1
#define MaskRadioButton 2
#define MaskVolumeUpButton 4
#define MaskVolumeDownButton 8
#define MaskOkButton 16
#define MaskMuteButton 32
#define MaskScrollDown 64
#define MaskScrollUp 128
#define MaskFastPress 256
#define MaskLongPress 512
unsigned long starttime;
bool workkbd;
unsigned long startlongpresstime;
bool oldpressed;
/////////////////////////////////////////////////////////////////
//*************************************************************
// Светодиоды для визуального контроля
// номера пинов
//*************************************************************
const int ledPin_1 = 0;
const int ledPin_2 = 1;
const int ledPin_3 = 2;
const int ledPin_4 = 4;
const int ledPin_5 = 12;
const int ledPin_6 = 13;
const int ledPin_7 = 14;
const int ledPin_8 = 15;
void setup()
{
Serial.begin(9600);
int i;
// строки - на выход
for (i = 0; i < rows; ++i)
{
pinMode(rowPins[i], OUTPUT);
}
// столбцы - на вход
for (i = 0; i < cols; ++i)
{
pinMode(colPins[i], INPUT);
digitalWrite(colPins[i], HIGH); // включаем подтягивающий резистор
}
starttime = millis();
workkbd = false;
oldpressed = false;
}
// сканирование джойстика
unsigned int scan(void)
{
int i, j;
unsigned int code = 0;
bool pressed = false;
for (i = 0; i < rows; ++i)
{
digitalWrite(rowPins[i], LOW);
// кнопки
for (j = 0; j < cols; ++j)
{
if(digitalRead(colPins[j]) == false)
{
code |= 1 << (keys[i][j] - 1);
pressed = true;
}
}
}//конец циклов
///////////////////////долго нажатие////////////////////////////////////////
if (pressed == true)
{
if (oldpressed == false)
{
startlongpresstime = millis();
}
else
{
if (millis() - startlongpresstime > 1200 && (code & MaskOkButton)) // значение временного промежутка в мс
{
startlongpresstime = millis(); // сброс счетчика. иначе признак будет выполняться каждый цикл опроса
code |= 512;
}
if (millis() - startlongpresstime < 1000 && (code & MaskOkButton) ) // значение временного промежутка в мс
{
startlongpresstime = millis(); // сброс счетчика. иначе признак будет выполняться каждый цикл опроса
code |= 256;
}
}
}
oldpressed = pressed;
/////////////////////////////////////////////////////////////
return code;
}
// цикл программы
void loop()
{
unsigned int code;
code = scan();
if (workkbd == false)
{
if (millis() - starttime > 3000)
workkbd = true;
return;
}
if (code & MaskMediaButton){
Serial.print("Source>");
Serial.println();
digitalWrite(ledPin_1, HIGH);
delay(200);
digitalWrite(ledPin_1, LOW);
}
if (code & MaskRadioButton){
Serial.print("Source<");
Serial.println();
digitalWrite(ledPin_2, HIGH);
delay(200);
digitalWrite(ledPin_2, LOW);
}
if (code & MaskVolumeUpButton){
Serial.print("VolumeUp");
Serial.println();
digitalWrite(ledPin_3, HIGH);
delay(200);
digitalWrite(ledPin_3, LOW);
}
if (code & MaskVolumeDownButton){
Serial.print("volumeDown");
Serial.println();
digitalWrite(ledPin_4, HIGH);
delay(200);
digitalWrite(ledPin_4, LOW);
}
if (code & MaskFastPress){
Serial.print("TRFast");
Serial.println();
}
if (code & MaskLongPress){
Serial.print("TRLong");
Serial.println();
}
if (code & MaskMuteButton){
Serial.print("Mute");
Serial.println();
digitalWrite(ledPin_6, HIGH);
delay(200);
digitalWrite(ledPin_6, LOW);
}
if (code & MaskScrollDown){
Serial.print("RotateDown");
Serial.println();
digitalWrite(ledPin_7, HIGH);
delay(200);
digitalWrite(ledPin_7, LOW);
}
if (code & MaskScrollUp){
Serial.print("RotateUp");
Serial.println();
digitalWrite(ledPin_8, HIGH);
delay(200);
digitalWrite(ledPin_8, LOW);
}
}