www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tastatur Abfrage - Tastenfolge merken!


Autor: Rene´ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Was hab ich vor?

Das frage ich mich auch. Deine Beschreibung erklärt es jedenfalls nicht.

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Was hab ich vor?

>Das frage ich mich auch. Deine Beschreibung erklärt es jedenfalls nicht.

Wohl noch Restalkohol im Kopf, was?

Autor: Rene´ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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´

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Stone (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Rene´ (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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´

Autor: tastendrücker (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@René

Ich werd heute abend mal suchen...

(Und möglichst keine E-mail-Adressen im Klartext hier Posten! Oder bist 
Du Spamoholik?))

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.