;******************************************************************************* ;* ;* Titel: Unterprogramm zur 12-Tasten-Matrix-Tastatur (SR_3x4_KEYPAD.asm) ;* ;* Datum: 23/12/07 Version: 0.3 (12/01/13) ;* Autor: WEIGU ;* ;* Informationen zur Beschaltung: ;* Prozessor: ATmega32 Quarzfrequenz: 16MHz ;* Eingaenge: 3 Spalten (columns) sind Eingaenge ;* Ausgaenge: 4 Zeilen (rows) sind Ausgaenge am Port ;* ;* Informationen zur Funktionsweise: ;* ;* Eine Zeitschleifenbibliothek (UP W1ms) muss im Hauptprogramm eingebunden ;* sein. Bei den Zuweisungen wird festgelegt, welche Ports und Pins ;* verwendet werden sollen (3 Spalten (Eingang) 4 Zeilen (Ausgang). ;* Es kann bei den Zuweisungen auch festgelegt werden wie viele ;* Millisekunden entprellt werden soll (0-255). ;* Das Unterprogramm KEYINI muss im Hauptprogramm in der Initialisierungs- ;* phase aufgerufen werden (Initialisiert Portpins). ;* ;* Beim Aufruf von KEYPAD wird der Tastenwert mit dem Parameter r24 ;* uebergeben (10 entspricht dem Stern, 11 der Null und 12 der Raute). ;* Bei 0 wurde keine Taste gedrueckt! ;* ;* Unterprogramme: ;* ;* KEYINI Initialisiert die Matrixtastatur (siehe Zuweisungen) ;* Muss im Hauptprogramm in der Initialisierungsphase ;* aufgerufen werden ;* KEYPAD Fragt die Matrixtastaur ab ;* Tastenwert in r24 (10 = *, 11 = 0, 12 = #) ;* Bei r24 = 0 wurde keine Taste gedrueckt! ;* ;* Copyright (c) 2011 Guy WEILER weigu[at]weigu[dot]lu ;* ;* Hiermit wird unentgeltlich, jeder Person, die eine Kopie der Software ;* und der zugehoerigen Dokumentationen (die "Software") erhaelt, die ;* Erlaubnis erteilt, uneingeschraenkt zu benutzen, inklusive und ohne ;* Ausnahme, dem Recht, sie zu verwenden, kopieren, aendern, fusionieren, ;* verlegen, verbreiten, unterlizenzieren und/oder zu verkaufen, und ;* Personen, die diese Software erhalten, diese Rechte zu geben, unter den ;* folgenden Bedingungen: ;* ;* ;Der obige Urheberrechtsvermerk und dieser Erlaubnisvermerk sind in alle ;* ;Kopien oder Teilkopien der Software beizulegen. ;* ; ;* ;DIE SOFTWARE WIRD OHNE JEDE AUSDRUECKLICHE ODER IMPLIZIERTE GARANTIE ;* ;BEREITGESTELLT, EINSCHLIESSLICH DER GARANTIE ZUR BENUTZUNG FUER DEN ;* ;VORGESEHENEN ODER EINEM BESTIMMTEN ZWECK SOWIE JEGLICHER RECHTS- ;* ;VERLETZUNG, JEDOCH NICHT DARAUF BESCHRAENKT. IN KEINEM FALL SIND DIE ;* ;AUTOREN ODER COPYRIGHTINHABER FUER JEGLICHEN SCHADEN ODER SONSTIGE ;* ;ANSPRUECHE HAFTBAR ZU MACHEN, OB INFOLGE DER ERFUELLUNG EINES ;* ;VERTRAGES, EINES DELIKTES ODER ANDERS IM ZUSAMMENHANG MIT DER SOFTWARE ;* ;ODER SONSTIGER VERWENDUNG DER SOFTWARE ENTSTANDEN. ;* ;******************************************************************************* ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Zuweisungen ;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ .EQU KeyPort = PORTA .EQU KeyPin = PINA .EQU KeyDDR = DDRA .EQU KP_C1 = 0 ;Tastatur 1 Spalte (147*) Eingang .EQU KP_C2 = 1 ;Tastatur 2 Spalte (2580) Eingang .EQU KP_C3 = 2 ;Tastatur 3 Spalte (369#) Eingang .EQU KP_R1 = 3 ;Tastatur 1. Zeile (123) Ausgang .EQU KP_R2 = 4 ;Tastatur 2. Zeile (456) Ausgang .EQU KP_R3 = 5 ;Tastatur 3. Zeile (789) Ausgang .EQU KP_R4 = 6 ;Tastatur 4. Zeile (*0#) Ausgang .EQU KeyDBC = 10 ;DebounceCounter * 1ms, gibt an wie viele Millisekunden . ;entprellt werden soll (0-255!); kann auch null sein! ;------------------------------------------------------------------------------- ; Unterprogramm Keypad initialisieren ;------------------------------------------------------------------------------- KEYINI: cbi KeyDDR,KP_C1 ;1 Spalte Eingang cbi KeyDDR,KP_C2 ;2 Spalte Eingang cbi KeyDDR,KP_C3 ;3 Spalte Eingang sbi KeyPORT,KP_C1 ;1 Spalte Pull-Up sbi KeyPORT,KP_C2 ;2 Spalte Pull-Up sbi KeyPORT,KP_C3 ;3 Spalte Pull-Up sbi KeyDDR,KP_R1 ;1 Zeile Ausgang sbi KeyDDR,KP_R2 ;2 Zeile Ausgang sbi KeyDDR,KP_R3 ;3 Zeile Ausgang sbi KeyDDR,KP_R4 ;4 Zeile Ausgang ret ;------------------------------------------------------------------------------- ; Unterprogramm Matrixtastatur 3*4 ; Tastenwert in r24 (10 = *, 11 = 0, 12 = #) ; Bei r24 = 0 wurde keine Taste gedrueckt! ;------------------------------------------------------------------------------- KEYPAD: push r16 ;r16 retten ldi r16,KeyDBC ;r16 = DebounceCounter KEYP1: ldi r24,12 ;Initialisiere Tastenzaehler r24 mit 12 ;Ausgangszustand initialisieren (4. Zeile aktivieren) sbi KeyPort,KP_R1 ;1. Zeile auf High schalten (inaktiv) sbi KeyPort,KP_R2 ;2. Zeile auf High schalten (inaktiv) sbi KeyPort,KP_R3 ;3. Zeile auf High schalten (inaktiv) cbi KeyPort,KP_R4 ;4. Zeile aktivieren (Low) ;drei Spalten abfragen KEYP2: sbis KeyPin,KP_C3 ;3. Spalte abfragen; Weiter bei High rjmp KEYP5 ;(not pressed) sonst KEYP5 dec r24 ;erniedrige Tastenzaehler r24 sbis KeyPin,KP_C2 ;2. Spalte abfragen; Weiter bei High rjmp KEYP5 ;(not pressed) sonst KEYP5 dec r24 ;erniedrige Tastenzaehler r24 sbis KeyPin,KP_C1 ;3. Spalte abfragen; Weiter bei High rjmp KEYP5 ;(not pressed) sonst KEYP5 dec r24 ;erniedrige Tastenzaehler r24 ;3. Zeile aktivieren sbis KeyPin,KP_R3 ;Falls 3. Zeile nicht auf Low dann aktivieren rjmp KEYP3 ;Falls schon auf Low dann weiter mit KEYP3 cbi KeyPort,KP_R3 ;3. Zeile auf Low rjmp KEYP2 ;Spalten testen ;2. Zeile aktivieren KEYP3: sbis KeyPin,KP_R2 ;Falls 2. Zeile nicht auf Low dann aktivieren rjmp KEYP4 ;Falls schon auf Low dann weiter mit KEYP4 cbi KeyPort,KP_R2 ;2. Zeile auf Low rjmp KEYP2 ;Spalten testen ;1. Zeile aktivieren KEYP4: sbis KeyPin,KP_R1 ;Falls 1. Zeile nicht auf Low dann aktivieren rjmp KEYP6 ;Falls schon auf Low dann fertig mit UP cbi KeyPort,KP_R1 ;1. Zeile auf Low rjmp KEYP2 ;Spalten testen ;Pruefen ob schon entprellt wurde KEYP5: tst r16 ;Falls gleich Null, bereits entprellt UP beenden breq KEYP6 ; rcall W1ms ;Falls nicht gleich, 1ms warten (entprellen) dec r16 ;Debouncecounter dekrementieren rjmp KEYP1 ;Tasten noch einmal abfragen KEYP6: pop r16 ;r16 wiederherstellen ret ;fertig mit UP