;****************************************************************************************
;				TECLADO.ASM
;
;Ender Pereira
;
;
;
;Presenta un conjuntos de rutinas que permiten la gestión de un teclado hexadecimal.
;
;Key_Scan: 	realiza un barrido del teclado y detecta si hay alguna tecla pulsada. La
;		variable "Tecla" retorna con el código de la tecla pulsada o el 0x80 en caso 
;		de no haber ninguna pulsada.
;
;Key_HEX:	Convierte el código de tecla en código HEXADECIMAL (del 0 a F). Antes de 
;		llamar a la rutina la variable "Tecla" contiene el código de tecla. Al finalizar,
;		la rutina devuelve el código HEX en la misma variable "Tecla".
;
;Key_7seg:	Convierte el código de tecla en código a 7 segmentos. A la llamada de la rutina, el
;		W debe contener el código BCD y al finalizar la misma, W retorna con el código
;		7 segmentos.
;
;El teclado hex. se supone conectado a la puerta B y su disposición es la siguiente:
;
;
;		 RB0 RB1 RB2 RB3
;
;                 ^   ^   ^   ^  TECLA	CODIGO
;                 |   |   |   |   -----	--------------
;		|---|---|---|---|   0	01111101 = 0x7D
;	RB4 -->	| 1 | 2 | 3 | F |   1	11101110 = 0xEE
;		|---|---|---|---|   2	11101101 = 0xED
;	RB5 -->	| 4 | 5 | 6 | E |   3	11101011 = 0xEB
;		|---|---|---|---|   4	11011110 = 0xDE
;	RB6 -->	| 7 | 8 | 9 | D |   5	11011101 = 0xDD
;		|---|---|---|---|   6	11011011 = 0xDB
;	RB7 -->	| A | 0 | B | C |   7	10111110 = 0xBE
;		|---|---|---|---|   8	10111101 = 0xBD
;		               	    9	10111011 = 0xBB
;				    A	01111110 = 0x7E
;				    B	01111011 = 0x7B
;				    C	01110111 = 0x77
;				    D	10110111 = 0xB7
;				    E	11010111 = 0xD7
;				    F	11100111 = 0xE7
; 
;Se recomienda colocar resistencias de 2k2 en serie entre el teclado y las líneas RB0-RB3 del Pic.

				cblock	
						Key_var   			;Inicio de las variables
						Tecla			;Retorno del código de tecla
						Key_1			;Nº de columnas a explorar
						Key_2   	        ;Temporal de código
						Key_Delay_1		;Variable de temporización
						Key_Delay_2		;Variable de temporización
						Tecla_temp		;guarda temporalmente la tecla para esperar que suelte
				endc						

;**************************************************************************************
;Key_Scan: Rutina de exploración del teclado. La variable "Tecla" retorna con el código
;de la tecla pulsada o el código 0x80 si no se pulsa ninguna.

Key_Scan:			bsf	3,5			;Seleciona página 1
				movlw	b'00001111'
				movwf	8h			;RB7-RB4 salidas, RB3-RB0 entradas
				bcf	81,7		;Activa cargas pull-up
				bcf	3,5			;Selecciona página 0
				movlw	4
				movwf	Key_1				;Nº de filas a activar
				movlw	b'01111111'
				movwf	Tecla				;fila a activar


Key_Scan_1:			movf    Tecla,W
				movwf	8h				;Activa fila				
				nop
				movf	8h,W
				movwf	Key_2
				subwf	Tecla,W				;Lee las columnas
				btfss	3,2         	   	;Hay alguna pulsada ?
				goto	Key_Scan_2			;Si hay ninguna pulsada
				bsf	3,0            		;No hay ninguna en esa columna
				rrf	Tecla,F				;Seleciona siguiente columna
				decfsz	Key_1,F
				goto	Key_Scan_1
				movlw	0x80
				movwf	Tecla				;Retorna código 0x80 (no hay pulsación)
				return					;Fin de exploración
				
Key_Scan_2:			movlw	.100				;Bucle de temporización de unos 20 mS
				movwf	Key_Delay_1			;para evitar el rebote de los pulsado-
Key_Scan_3:			clrf	Key_Delay_2			;res.
				clrwdt
Key_Scan_4:			decfsz	Key_Delay_2,F
				goto	Key_Scan_4
				decfsz	Key_Delay_1,F
				goto	Key_Scan_3
				
				movf	Tecla,W             		;Trás la temporización se lee nuevamente
				movwf	8h				;si la tecla es la misma. Se evitan
				nop					;los rebotes.
				movf	8h,W
				subwf	Key_2,W
				btfss	3,2			;Es la misma ??
				goto	Key_Scan_1			;No, seguir con la exploración
				movf	Key_2,W		                ;Si guardar en variable de salida "Tecla"
				movwf	Tecla
				return					;Fin de exploración															

				
Key_HEX:			movf	Tecla,W
 				movwf	Key_2				;Almacena el código temporalmente
 				clrf	Key_1				;Contador Hex a 0

Key_HEX_2			call	Key_Tabla       		;Busca código en la tabla
 				subwf	Key_2,W				;Compara con el de la tecla
 				btfsc	3,2			;Coincide ??
 				goto	Key_HEX_1			;Si
 				incf	Key_1,F				;No, incrementa contador BCD
 				goto	Key_HEX_2

Key_HEX_1			movf	Key_1,W
				movwf	Tecla				;Carga contador BCD en la variable de salida
				return
				 						
;****************************************************************************
;Esta rutina espera que la tecla recién pulsada sea soltada. Debe usarse
;justo después de llamar a la rutina KEY_SCAN.

KEY_OFF                         MOVF    Tecla, W
                                MOVWF   Tecla_temp         		;Guarda temporalmente la tecla.
KEY_OFF_NO                      CALL    Key_Scan		        ;Mira si se ha soltado.
                                MOVLW   0x80
                                SUBWF   Tecla, W
                                BTFSS   3,2
                                GOTO    KEY_OFF_NO		       ;Bucle mientras no se suelte
                                MOVF    Tecla_temp, W      	       ;Ya se ha soltado
                                MOVWF   Tecla          		       ;se repone la tecla.
                                BCF     3,2
                                RETURN

;******************************************************************************
Key_tabla			movf	KEY_1,w
				addwf	82,f
				retlw	0x7D		;0
				retlw	0xEE		;1
				retlw	0xED		;2
				retlw	0xEB		;3
				retlw	0xDE		;4
				retlw	0xDD		;5
				retlw	0xDB		;6
				retlw	0xBE		;7
				retlw	0xBD		;8
				retlw	0xBB		;9
				retlw	0x7E		;A
				retlw	0x7B		;B
				retlw	0x77		;C
				retlw	0xB7		;D
				retlw	0xD7		;E
				retlw	0xE7		;F

;*******************************************************************************

Key_7seg			movf	KEY_1,w
				addwf	82,f
				retlw	b'00111111'	;0
				retlw	b'00000110'	;1
				retlw	b'01011011'	;2
				retlw	b'01001111'	;3
				retlw	b'01100110'	;4
				retlw	b'01101101'	;5
				retlw	b'01111101'	;6
				retlw	b'00000111'	;7
				retlw	b'01111111'	;8
				retlw	b'01100111'	;9
				retlw	b'01110111'	;A
				retlw	b'01111100'	;B
				retlw	b'00111001'	;C
				retlw	b'01011110'	;D
				retlw	b'01111001'	;E
				retlw	b'01110001'	;F

;******************************************************************************
Key_ascii			movf	KEY_1,w
				addwf	82,f
				retlw	'0'
				retlw	'7'
				retlw	'8'
				retlw	'9'
				retlw	'4'
				retlw	'5'
				retlw	'6'		
				retlw	'1'		
				retlw	'2'		
				retlw	'3'		
				retlw	'A'
				retlw	'B'		
				retlw	'C'
				retlw	'D'
				retlw	'E'
				retlw	'F'