Source file: /~heha/enas/Convac-Ätzer/Firmware-190517.zip/Keypad.cpp

/* Projekt Convac-Ätzer
   Zugriff auf das Tastenfeld (6 Spalten, 3 Zeilen)
   Henrik Haftmann, 161012
   
   Beim Controller ist angeschlossen, siehe
   http://www.tu-chemnitz.de/~heha/enas/Convac-Ätzer/Eagle.zip/Terminal.wmf?as=SVG
   A0	Spaltendekoder low-aktiv
   A1	Spaltendekoder
   A2	Spaltendekoder
   !CSK	Auswahl = !SEL1
   An den Datenbusleitungen liegen 4 Zeilenleitungen invertiert.
   
Tastenverteilung:
╔═══════╦═══════╤═══════╤═══════╤═══════╤═══════╤═══════╗
║	║0	│1	│2	│3	│4	│5	║
╠═══════╬═══════╪═══════╪═══════╪═══════╪═══════╪═══════╣
║0	║ F1	│ F2	│ F3	│ F4	│ F5	│ F6	║
╟───────╫───────┼───────┼───────┼───────┼───────┼───────╢
║1	║ 5	│ 6	│ 7	│ 8	│ 9	│ SET	║
╟───────╫───────┼───────┼───────┼───────┼───────┼───────╢
║2	║ 0	│ 1	│ 2	│ 3	│ 4	│ ↲	║
╚═══════╩═══════╧═══════╧═══════╧═══════╧═══════╧═══════╝

Es kann nur eine Taste gleichzeitig gedrückt sein.
 */

#include "Convac.h"

static PROGMEM const byte map[3][6]={
 {0xF1,0xF2,0xF3,0xF4,0xF5,0xF6},
 { '5', '6', '7', '8', '9','\n'},
 { '0', '1', '2', '3', '4','\r'}};

byte KEYS::readkey() {
 for (byte i=0; i<6; i++) {	// Spalten durchgehen
  byte b=BUS::ioRead(BUS::BA_KEYPAD+i)&0x07;
  switch (b) {
   case 0: break;		// keine Taste: weitersuchen
   case 1: return pgm_read_byte(map[0]+i);
   case 2: return pgm_read_byte(map[1]+i);
   case 4: return pgm_read_byte(map[2]+i);
   default: return 0;	// mehrere Tasten oder Tastatur nicht angeschlossen
  }
 }
 return 0;	// keine Taste gedrückt
}

byte KEYS::readkey(byte n) {
 byte k=last;
 do{
  byte kb=k;
  k=readkey();
  if (k==kb) break;	// mehrfach einlesen (Tastenprellen)
 }while(--n);
 return k;
}

// Prüft ob neue Taste gedrückt, zur Vermeidung überflüssiger Bildaufbauten
void KEYS::peek() {
 byte k=readkey(4);	// mehrfach einlesen (Tastenprellen)
 if (last!=k) {
  last=k;
  if (k) buffer=k;
 }
}

byte KEYS::last;
byte KEYS::buffer;
Detected encoding: UTF-80