;*******************************************************************************
;*
;*      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       
