No to teraz właściwe czytanie klawiatury.
int read_key()
{
int kod=0;
Na linii pierwszego wiersza ustawiamy logiczna jedynkę i czekamy 5 mikrosekund, żeby ten sygnał na pewno fizycznie się pojawił i był stabilny:
digitalWrite (IN1, 1); Delay(5);Teraz sprawdzamy, czy na którejś linii kolumn pojawiła się jedynka logiczna. Jeśli tak, to znaczy że naciśnięto klawisz zwierający pierwszy wiersz z testowaną kolumną, w zmiennej kod zapisujemy kod ASCII naciśniętego klawisza.
if (digitalRead(OU1)==1) {kod=0x44;}
if (digitalRead(OU2)==1) {kod=0x23;}
if (digitalRead(OU3)==1) {kod=0x30;}
if (digitalRead(OU4)==1) {kod=0x2A;}
digitalWrite (IN1, 0);
Ustawiamy na testowanej linii zero logiczne i powtarzamy sprawdzanie dla kolejnych linii wierszy klawiatury.
digitalWrite (IN2, 1);
Delay(5);
if (digitalRead(OU1)==1) {kod=0x43;}
if (digitalRead(OU2)==1) {kod=0x39;}
if (digitalRead(OU3)==1) {kod=0x38;}
if (digitalRead(OU4)==1) {kod=0x37;}
digitalWrite (IN2, 0);
digitalWrite (IN3, 1);
Delay(5);
if (digitalRead(OU1)==1) {kod=0x42;}
if (digitalRead(OU2)==1) {kod=0x36;}
if (digitalRead(OU3)==1) {kod=0x35;}
if (digitalRead(OU4)==1) {kod=0x34;}
digitalWrite (IN3, 0);
digitalWrite (IN4, 1);
Delay(5);
if (digitalRead(OU1)==1) {kod=0x41;}
if (digitalRead(OU2)==1) {kod=0x33;}
if (digitalRead(OU3)==1) {kod=0x32;}
if (digitalRead(OU4)==1) {kod=0x31;}
digitalWrite (IN4, 0);
No i prawie gotowe. W zmiennej kod mamy kod ASCII naciśniętego klawisza.
Teraz juz tylko sprawdzenie czy przypadkiem tego klawisza juz poprzednio nie odczytaliśmy:
if (kod != last)Jeśli to pierwsze wykrycie naciśnięcia tego klawisza, zapamiętujemy ten fakt w zmiennej last i zwracamy kod ASCII:
{
last = kod;
return kod ;
}
else
W przeciwnym wypadku (nie naciśnięto żadnego klawisza lub naciśnięty jest jeszcze poprzednio zapisany), zwracamy wartość 0:
{
return 0;
}
}
No i procedura opóźnienia, niewrażliwa na przerwania (nie używamy ich w tym programie, ale mogą zostac użyte w jakimś innym), opisana już przy okazji opisu czujnika HC-SR04
void Delay(int microsec)
{
struct timespec tim;
tim.tv_sec = 0;
tim.tv_nsec = microsec * 1000;
while(nanosleep(&tim,&tim)==-1)
continue;
}
English