BCD-Code Tastenabfrage, Dezimalzahl Ausgabe

die Darstellung und die Zahlenwerte sind so erst einmal wie sei sein sollten, nur mit der Eingabe ist es einwenig schwierig, da die Hexadezimalzahl eingegeben wird und der Zufall die richtige Stelle wählt...
die Eigabe der Dualzahl mittels der zugehörigen Taste in 0 und 1 wäre super.

#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // mit HW61 Modul, Pin A4-SDA,A5-SCL,-,+5V

char H[3];
char L[3];
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {2, 3, 4, 5};
byte colPins[KEYPAD_COLS] = {6, 7, 8, 9};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
  {'0', '1', '2', '3'},
  {'4', '5', '6', '7'},
  {'8', '9', 'A', 'B'},
  {'C', 'D', 'E', 'F'}
};

Keypad keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);


void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();}
  
void loop() {
  lcd.setCursor(0, 0); lcd.print("FEDC BA98 7654 3210");
  static byte pos = 0;
  static uint16_t Total = 0;
  char key = keypad.getKey();
  if (key) {
    lcd.setCursor(5 * pos + 3, 1);
    lcd.print(key);
    
    lcd.setCursor(5 * pos, 1);
    if (key > '9')key -= 7;
    key -= '0';
    for (byte i = 4; i > 0; i--)lcd.print((key & 1 << (i - 1)) ?'1':'0'); // hier kann man H/L schreiben
    Total = Total & ~(0b1111 << 4 * (3 - pos));
    Total = Total | (key << 4 * (3 - pos));
    sprintf (H, "%02X", Total >> 8);
    sprintf (L, "%02X", Total & 0xFF);
    lcd.setCursor(7, 2);
    lcd.print(H);
    lcd.setCursor(17, 2);
    lcd.print(L);

    lcd.setCursor(12, 3);
    lcd.print("     ");
    lcd.setCursor(12, 3);
    lcd.print(Total);

    if (++pos == 4)pos = 0;
  }
}

wovon kommt erste Reihe? ist sie konstant?
ok. konstant. soll das heißen es werden nur zwei Tasten gedrückt und nur die bits die dem Wert der gedrückten Tasten sollen als "1" drunter angezeigt ?

das ist nicht so.

die erste Reihe ist konstant und gibt den Stellenwert der Dualzahl wieder, entsprechend der Tasenbeschriftung

da die kleine Person nicht weiß wo der Cursor ist, wundert er sich wo die Eingabe erfolgt - Zufall-

Ich hätte nicht geglaubt das ich durch Eure Hilfe so weit komme und danke vielmals für die Mühe die Ihr hier leistet.

was passiert wenn Doppelzahl "FF" ist?

Findest du?

Das ist doch die völlig normale Darstellung einer vorzeichenlosen 16 bit Zahl:
Unten dezimal
Darüber hex
Darüber binär (NICHT BCD)
Darüber die Bit-Nr in Hex

Auf deiner 4x4 Tastatur hast du die 16 Bit-Nummern 0 ... F
und jede Betätigung einer Taste soll das entsprechende Bit toggeln, also zwischen 0 und 1 (oder L und H) umschalten

Das einzig ungewöhnliche ist, dass du die Binär-Darstellung fälschlich als BCD bezeichnest.

Und die Verwendung deiner 4×4 Tastatur, was aber pfiffig ist, um die Wertigkeit einer Bit-Nr spielerisch zu zeigen.
Beispiel:
Anzeige dez/hex: 0 / 0000
Taste 3 (toggelt Bit 2^3) -->
Anzeige 8 / 0008
Taste A -->
Anzeige 1032 / 0408
Taste 3 -->
Anzeige 1024 / 0400
Taste B -->
Anzeige 3072 / 0C00

Oder hab ich das falsch verstanden?

Schade, dass normale 4x4 Tastaturen eher mit # und * statt E und F beschriftet sind.

1 Like

die Anzeige ist bereits korrekt, nur die Eingabe müßte nicht als Hexadezimalzahl sondern in der Dualzahl erfolgen. FF FF ist schon jetzt 65535 und die Dualzahl ist 1111 1111 1111 1111, wie es sein sollte. Jetzt fehlt nur noch die Eingabe in die Dualzahl als o und 1. also wenn ich die 5 drücke sollte die Zahl in 1111 1111 1110 1111 wechseln und wenn ich die Taste C drücke in 1110 1111 1110 1111. So kann ich die Bits der Dualzahl entsprechend der Tastaturbeschriftung gezielt ein und ausschalten.

1 Like

man kann ein Papierblatt bedrucken und darüber eine durchsichtige Folie legen/kleben. man kann so auch Icons verwenden.

ja, genau, die Anzeige ist jetzt bereits wie sie sein soll, nur die Eingabe sollte Bitgenau in der Dualzahl durch die BCD-Tastatur erfolgen. Dazu habe ich die Beschriftung derTastatur einfach umgestellt auf 0123 - 4567 - 89AB - CDEF

ja, tatsächlich, BCD hat damit überhaupt nix zu tun. ich schau mal.

die Bit Nr. in Hex bzw. die Hexadezimalzahl ist im Grunde eine Zahl im BCD-Code, also eine Zahl die durch 0 bis F dargestellt wird - so hab ich es mal vor 50 Jahren gelernt, leider vergessen das BCD nur ein Ausschnitt des Hex-Codes ist...

die Dualzahl ist ja im Grunde auch eine Zahl im BCD-Code, deshalb nennt man die 7-Segment Decoder ja auch "BCD zu 7 Segment Decoder", weil sie den BCD-Code in die lesbare 7-Segmentanzeige wandeln - und das nicht nur in 0-9 es gibt auch Decoder die in 0-F Wandeln.
Bei Schieberegistern hat man ebenfalls einen parralelen Ein- oder Ausgang, der in Publikationen als BCD-Ein (Aus) markiert ist, oder Zähler ICs haben den BCD-Ausgang

also der BCD-Code geht von 0-9 und der Hex-Code von 0-F (0-15) ansonsten sind sie gleichwertig

Wenn das mit der 4 passiert, wird alles einfacher :wink:

1 Like

stimmt...

bitte schön

2 Likes

kopiere Sketch hierher damit Sie den Beitrag als Lösung markieren können.

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4); //  addresse 0x3F schreiben wenn mit 0x27 nicht klappt
#include <Keypad.h>

char H[3];
char L[3];
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {5, 4, 3, 2};
byte colPins[KEYPAD_COLS] = {A3, A2, A1, A0};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
  {'0', '1', '2', '3'},
  {'4', '5', '6', '7'},
  {'8', '9', 'A', 'B'},
  {'C', 'D', 'E', 'F'}
};

Keypad keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);


void setup() {
  lcd.init();
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print("FEDC BA98 7654 3210");
  lcd.setCursor(0, 01); lcd.print("0000 0000 0000 0000");
}

void loop() {
  static uint16_t Total = 0;
  char key = keypad.getKey();
  if (key) {
    if (key > '9')key -= 7;
    key -= '0';

    Total = Total ^ (1 << key);

    lcd.setCursor(0, 1);
    for (byte i = 16; i > 0; i--) {
      lcd.print(Total & 1 << i-1?'1':'0');
      if (i % 4 == 1)lcd.print(' ');
    }

    sprintf (H, "%02X", Total >> 8);
    sprintf (L, "%02X", Total & 0xFF);
    lcd.setCursor(7, 2);
    lcd.print(H);
    lcd.setCursor(17, 2);
    lcd.print(L);

    lcd.setCursor(12, 3);
    lcd.print("     ");
    lcd.setCursor(12, 3);
    lcd.print(Total);
    key=0;
    delay(100);
  }
}
1 Like

vielen vielen Dank, genau so hatte ich es mir vorgestellt

#include "Keypad.h" //Pin 2-9 
#include <LiquidCrystal_I2C.h> 
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 20, 4); // mit HW61 Modul, Pin A4-SDA,A5-SCL,-,+5V

char H[3];
char L[3];
const byte KEYPAD_ROWS = 4;
const byte KEYPAD_COLS = 4;
byte rowPins[KEYPAD_ROWS] = {2, 3, 4, 5};
byte colPins[KEYPAD_COLS] = {6, 7, 8, 9};
char keys[KEYPAD_ROWS][KEYPAD_COLS] = {
  {'0', '1', '2', '3'},
  {'4', '5', '6', '7'},
  {'8', '9', 'A', 'B'},
  {'C', 'D', 'E', 'F'}
};

Keypad keypad(makeKeymap(keys), rowPins, colPins, KEYPAD_ROWS, KEYPAD_COLS);


void setup() {
  lcd.init();
  lcd.backlight();
  lcd.clear();
  lcd.setCursor(0, 0); lcd.print("FEDC BA98 7654 3210");
  lcd.setCursor(0, 1); lcd.print("0000 0000 0000 0000");
}

void loop() {
  static byte pos = 0;
  static uint16_t Total = 0;
  char key = keypad.getKey();
  if (key) {
    if (key > '9')key -= 7;
    key -= '0';

    Total = Total ^ (1 << key);

    lcd.setCursor(0, 1);
    for (byte i = 16; i > 0; i--) {
      lcd.print(Total & 1 << i-1?'1':'0');
      if (i % 4 == 1)lcd.print(' ');
    }


    sprintf (H, "%02X", Total >> 8);
    sprintf (L, "%02X", Total & 0xFF);
    lcd.setCursor(0, 2); lcd.print("HEX=");
    lcd.setCursor(7, 2); 
    lcd.print(H);
    lcd.setCursor(10, 2);
    lcd.print(L);

    lcd.setCursor(0, 3);
    lcd.print("Dezimal=         ");
    lcd.setCursor(10, 3);
    lcd.print(Total);

    if (++pos == 4)pos = 0;
  }
}

jetzt werde ich versuchen diese Zeilen zu analysieren und nach und nach zu verarbeiten um den Sinn dahinter zu verstehen...