Bogusław Kempny

Klawiatura numeryczna

×
Autor English
Początek HC-SR04 LCD Kamera fork() sms strfry() GPIO impulsy Klawiatura Brama GPIO PWM SG90 RFID Grafolog RCP Shutdown Temperatura ....











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