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 ; } elseW 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; }