Hallo Forenbewohner, Was hab ich vor? ------------------ Ich möchte eine 4x4 Standart Matrix Tastatur abfragen und eine 4 stellige Tastenfolge abspeichern? Die Idee! ----------- Ich benutze speziell den Mikrocontroller 18f2420. Am PORTB ist die Matrix Tastatur jeweils über einen Widerstand angeschlossen. Pinbelegung: #define krow1 PORTB,0 ;keyboard 1 4 7 * #define krow2 PORTB,1 ;keyboard 2 5 8 0 #define krow3 PORTB,2 ;keyboard 3 6 9 # #define krow4 PORTB,3 ;keyboard A B C D #define kline1 PORTB,4 ;keyboard 1 2 3 A #define kline2 PORTB,5 ;keyboard 4 5 6 B #define kline3 PORTB,6 ;keyboard 7 8 9 C #define kline4 PORTB,7 ;keyboard # 0 * D Meine Abfrage gestaltet sich derzeit wie folgt. 1. Es wird eine Spalte "krow" nach der anderen auf null gesetzt. 2. Danach wird geschaut in welcher Zeile "kline" welcher Taster ein Null Signal liefert. 3. Wenn ein Taster 0 liefert wird sein Wert ins W-Register geschrieben. clrw ;w-register löschen bcf krow1 ;rb0=0 bsf krow4 ;rb4=1 bsf krow3 ;rb3=1 bsf krow2 ;rb2=1 call key1 ;rufe key1 auf key1 btfss kline1 ;rb4=0 ? dann schreibe 1 ins w-register & zurück retlw '1' ;rb4=1 ? dann prüfe rb5 btfss kline1 ;rb5=0 ? dann schreibe 4 ins w-register & zurück retlw '4' ;rb5=1 ? dann prüfe rb6 btfss kline1 ;rb6=0 ? dann schreibe 7 ins w-register & zurück retlw '7' ;rb6=1 ? dann prüfe rb7 btfss kline1 ;rb7=0 ? dann schreibe * ins w-register & zurück retlw '*' ;rb7=1 ? dann nächste spalte return Soweit so gut, jedoch wird damit nur abgefragt welche Taster gerade gedrückt wurde! Ich möchte aber gern 4 mal drücken und es sollen die 4 nacheinander gedrückten Tasten gemerkt werden. --- Ich hab mir schon den Kopf zerbrochen und gegoogelt was das Zeug hält aber ich komm net drauf. Habt ihr vielleicht noch ne Idee. Im Bezug auf den umgang mit Mikrocontroller kenne ich mich aus, so das ihr nicht mit einem absoluten Leihen auf diesem Gebiet zutun habt. Schon mal Vielen Dank für eure Ideen & Vorschläge im Voraus Gruß Rene
Du musst dir die gedrückten Tasten merken, d. h. die Werte in Variablen speichern (z. B. k1, k2, k3, k4) Also call key1 ;rufe key1 auf movlw k1 Bevor du allerdings die zweite Taste erfasst, musst du prüfen, ob die erste Taste wieder losgelassen wurde. Also dein Programm ein wenig umstrukturieren: call key_release ; warten biss keine Taste gedrückt call key_press ; warten bis Taste gedrückt und wert in W liefern call movlw k1 call key_release call key_press call movlw k2 call key_release call key_press call movlw k3 call key_release call key_press call movlw k4 Allerdings schlage ich dir vr, das Tastaturhandling eher über einen Timer-Interrupt zu machen.
> Was hab ich vor?
Das frage ich mich auch. Deine Beschreibung erklärt es jedenfalls nicht.
>> Was hab ich vor? >Das frage ich mich auch. Deine Beschreibung erklärt es jedenfalls nicht. Wohl noch Restalkohol im Kopf, was?
Die Idee der Flankenauswertung einer einzelnen Taste. Das klingt viel versprechend, warum bin ich da net drauf gekommen. Die einfachsten Dinge x.x --- Timer Interrupt: Sozusagen immer schön in regelmäßigen Abständen die Tastatur abfragen. direkt danach Taste weiter verarbeiten. wieder Abfrage. oder Interrupt: bei Tastenbetätigung Anzahl von Interrupts aufnehmen welche Taste Abspeichern Warten Ende Anzahl gibt wieder wieviele Tasten betätigt worden sind. hm, das müsste auch gehn. Mensch jetzt fällt mir sowas ein, warum net vorher. Ich danke Dir Gruß Rene´
tastendrücker wrote: >>> Was hab ich vor? > >>Das frage ich mich auch. Deine Beschreibung erklärt es jedenfalls nicht. > > Wohl noch Restalkohol im Kopf, was? Das nicht. Hatte nur böse Schwierigkeiten mir vorzustellen, was das 'Problem' mit einer Matrixtastatur zu tun haben soll. Die Sorte Bretter vorm Kopf ist in meinem nicht vorgesehen...
Habs ähnlich mit ner 4x3 Tastatur gemacht. Für nen ATmega 8 in Bascom -Alle 4 Eingänge der Tastatur auf High(Ausgänge vom uC) -Die drei Ausgänge der Tastatur auf die Eingänge des uC und alle zusammen per Dioden auf einen Int.(flanke Rising + pulldown) -Wird der Int ausgelöst werden nach der Reihe alle Eingänge der Tastatur nacheinander Aktiviert um zu schauen von welcher Taste der int Ausging -Die Taste wird als Zahlenwert gespeichert zb. Taste_0=11, Taste_#=12 -der Zahlenwert wird dann in eine andere Variable gespeichert bei mir C1, diese wird dann beim nächsten Tastendruck übersprungen und in C2 gespeichert - am Ende werden die eingegebenen Zahlen mir definierten Zahlen aus dem Eeprom verglichen wenn sie stimmen ok wenn nicht :( -Code kann auch im Betrieb geändert werden. Vielleicht hilfts dir weiter zu kommen, hab grade wenig Zeit und die Hardware ist noch nicht fertig. Wirds mal sobalds komplett ist bei Roboternetz.de veröffentlicht. MfG Matthias
Und immer schön an die Entprellung denken! Ich hab' irgendwo noch 'n Programm, in dem ich mit einem 16F84 eine 4x5(?) Tastatur abhandel. Wenn's dich interessiert, kann ich ja mal suchen.
Jo, entprellen auf jedenfall sonst nützt das ganze Programm ja nix wenn mann mit einem Tastendruck 4 gleiche Werte erhält. Keine Angst entprellen mach ich im Programm ^^. Mit dem 16F84 hab ich auch angefangen wie bestimmt fast jeder ^^. Wenn du dir wirklich die Mühe machen willst das Programm zusuchen wäre das Spitze. Entweder du postest es hier oder du kannst es mir auch per Mail schicken wenn du möchtest. Rene.Belau@xemail.de So ähnlich werd ich das machen, da kann ich auch mal schnell mehr Stellen hinzufügen ohne groß was im Programm ändern zu müssen. Mathias, dein Projekt würde ich mir natürlich gerne mal anschauen wenns fertig ist. Gruß Rene´
@René Ich werd heute abend mal suchen... (Und möglichst keine E-mail-Adressen im Klartext hier Posten! Oder bist Du Spamoholik?))
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.