;===============================================================================================================================================

; 					CODIGO FUENTE PARA LA TARJETA EDU-PIC 16F628 USANDO EL MÓDULO DE EXPANSIÓN MATRIZ DE LEDS
;					AUTOR: MOISES RAFAEL GUTIERREZ DAMIAN DESARROLLADO PARA PUNTO FLOTANTE, S.A.

;===============================================================================================================================================

;		EL PROGRAMA REALIZA UN CICLO REPETITIVO MOSTRANDO LOS NÚMEROS DEL 0 AL 9 Y LAS LETRAS DE LA A A LA Z DETERMINANDO EL PERIODO 
;						DE LA CUENTA MEDIANTE LA INTERRUPCIÓN DE DESBORDAMIENTO DEL TIMER 0

;===============================================================================================================================================

;	NOTAS SOBRE EL CÓDIGO FUENTE: ***************************************************************************************************************
 
;	RA1 SE USA PARA DAR RESET AL CONTADOR DE COLUMNAS
; 	RA2 SE USA PARA INCREMENTAR EL CONTADOR DE COLUMNAS
; 	EL PUERTO B ES USADO PARA ENCENDER LAS LINEAS DE LA MATRIZ DE 7 X 5
 
;	CONFIGURACION: ******************************************************************************************************************************* 

	processor 16f628
	include	  <p16f628.inc>
	__config _XT_OSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _BODEN_OFF & _LVP_OFF 


		#DEFINE BANCO0	BCF	STATUS,RP0
		#DEFINE	BANCO1	BSF	STATUS,RP0
		
	CBLOCK	0x22		; LAS VARIABLES SE GUARDAN A PARTIR DE ESTA DIRECCIÓN
	L					; USADO EN EL BARRIDO DE COLUMNAS
	REG50mS				; VARIABLE USADA COMO REGISTRO AUXILIAR PARA TRABAJAR EL TMR0
	SALVA_W				; UTILIZADAS DURANTE LA INTERRUPCIÓN PARA EVITAR SALTOS INDETERMINADOS
	SALVA_STATUS		;
	CUENTA				; VARIABLE PARA CAMBIO DE CARACTER
	COL1				; COLUMNAS
	COL2
	COL3
	COL4
	COL5
	ENDC				
		
J		EQU	H'20'	  
K		EQU	H'21'

;**************************************************************************
;																		  *
CARGA			EQU	D'20'	; CARGA X 50 mS = PERIODO DE CUENTA DESEADO    *
;																		  *
;**************************************************************************

TMR0_50mS		EQU	D'61'	; INICIALIZACIÓN CALCULADA PARA DAR UN CICLO DE 50 mS (NO DEBE MOVERSE)		
	
;	CODIGOS: ***********************************************************************************************************************************

	ORG 	0				; INICIO EN LA DIRECCIÓN 0
	GOTO	INICIO

	ORG		4
	GOTO	INTERRUP		; VECTOR DE INTERRUPCION

INICIO
	MOVLW	H'07'
	MOVWF	CMCON
	BANCO1					; ACCESO A BANCO 1
	CLRF	VRCON
	CLRF	TRISA			; PUERTO A SALIDAS
	CLRF	TRISB			; PUERTO B SALIDAS
	MOVLW	B'00000111'		; PRESCALER RATE SELECT BITS CONFIGURADOS PARA UN DIVISOR DE FREC 1:256 Y DESBORDAMIENTO POR RELOJ INTERNO
	MOVWF	OPTION_REG		; EN EL REGISTRO OPTION.
		
	BANCO0
	CLRF	PORTA
	CLRF	PORTB
	MOVLW	TMR0_50mS		; CARGA INICIAL DEL TIMER0
	MOVWF	TMR0			;
	MOVLW	CARGA			; CARGA DE LA VARIABLE REGISTRO
	MOVWF	REG50mS			;
	BSF		INTCON,GIE		; HABILITAMOS LAS INTERRUPCIONES
	BSF		INTCON,T0IE		; HABILITAMOS LA INTERRUPCIÓN POR DESBORDAMIENTO DEL TMR0

	;********************************************************************************
	;*   LAS DOS LINEAS ANTERIORES PUEDEN SER SUSTUIDAS POR LAS SIGUIENTES LINEAS:  *
	;*																			 	*
	;*	 MOVLW	B'10100000'															*
	;*	 MOVWF	INTCON																*
	;********************************************************************************

REINICIO
	CLRF	CUENTA
	CLRF	COL1
	CLRF	COL2
	CLRF	COL3
	CLRF	COL4
	CLRF	COL5
BUCLE2	
	CLRF	L
	CALL	MR			; RA1 MANDA PULSO DE MASTER RESET AL CONTADOR
	MOVF	CUENTA,W
	CALL	CARACTER
BUCLE1		
	MOVFW	L
	CALL	TABLA
	MOVWF	PORTB
	CALL	CP0			; RA2 MANDA PULSO PARA INCREMENTAR CONTADOR
	CALL 	retro
	CALL	retro
	CALL	retro
	CALL	retro
	INCF	L,F
	MOVFW	L
	SUBLW	5
	BTFSS	STATUS,Z
	GOTO	BUCLE1
	GOTO 	BUCLE2

TABLA
	ADDWF	PCL			; SALTO INDEXADO			
	GOTO	LEE_COL1
	GOTO	LEE_COL2
	GOTO	LEE_COL3
	GOTO	LEE_COL4
	GOTO	LEE_COL5

CARACTER
	ADDWF	PCL
	GOTO	CERO
	GOTO	UNO
	GOTO	DOS
	GOTO	TRES
	GOTO	CUATRO
	GOTO 	CINCO
	GOTO	SEIS
	GOTO	SIETE
	GOTO	OCHO
	GOTO	NUEVE
	GOTO	A
	GOTO	BE
	GOTO	CE
	GOTO	DEE
	GOTO	E
	GOTO	EFE
	GOTO	GE
	GOTO	H
	GOTO	I
	GOTO	JOTA
	GOTO	KA
	GOTO	ELE
	GOTO	EME
	GOTO	ENE
	GOTO	EÑE
	GOTO	O
	GOTO	PE
	GOTO	Q
	GOTO	ERRE
	GOTO	ESE
	GOTO	TE
	GOTO	U
	GOTO	UVE
	GOTO	DOBLEW
	GOTO	EQUIS
	GOTO	IGRIEGA
	GOTO	ZETA
	GOTO	REINICIO

LEE_COL1
	MOVF	COL1,W
	RETURN
LEE_COL2
	MOVF	COL2,W
	RETURN
LEE_COL3
	MOVF	COL3,W
	RETURN
LEE_COL4
	MOVF	COL4,W
	RETURN
LEE_COL5
	MOVF	COL5,W
	RETURN

CERO					; 0
	MOVLW	B'01111100'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'10000010'
	MOVWF	COL3
	MOVLW	B'10000010'
	MOVWF	COL4
	MOVLW	B'01111100'
	MOVWF	COL5
	RETURN
	
UNO						; 1		
	MOVLW	B'00000000'
	MOVWF	COL1
	MOVLW	B'10000100'
	MOVWF	COL2
	MOVLW	B'11111110'
	MOVWF	COL3
	MOVLW	B'10000000'
	MOVWF	COL4
	MOVLW	B'00000000'
	MOVWF	COL5
	RETURN
DOS						; 2
	MOVLW	B'10000100'
	MOVWF	COL1
	MOVLW	B'11000010'
	MOVWF	COL2
	MOVLW	B'10100010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'10001100'
	MOVWF	COL5
	RETURN
TRES					; 3		
	MOVLW	B'01000100'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01101100'
	MOVWF	COL5
	RETURN
CUATRO					; 4
	MOVLW	B'00010000'
	MOVWF	COL1
	MOVLW	B'00011000'
	MOVWF	COL2
	MOVLW	B'00010100'
	MOVWF	COL3
	MOVLW	B'11111110'
	MOVWF	COL4
	MOVLW	B'00010000'
	MOVWF	COL5
	RETURN
CINCO					; 5
	MOVLW	B'01011110'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01100010'
	MOVWF	COL5
	RETURN
SEIS					; 6
	MOVLW	B'01111100'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01100100'
	MOVWF	COL5
	RETURN
SIETE					; 7
	MOVLW	B'10000010'
	MOVWF	COL1
	MOVLW	B'01000010'
	MOVWF	COL2
	MOVLW	B'00100010'
	MOVWF	COL3
	MOVLW	B'00010010'
	MOVWF	COL4
	MOVLW	B'00001110'
	MOVWF	COL5
	RETURN
OCHO					; 8
	MOVLW	B'01101100'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01101100'
	MOVWF	COL5
	RETURN
NUEVE					; 9
	MOVLW	B'01001100'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01111100'
	MOVWF	COL5
	RETURN
A						; A		
	MOVLW	B'11111100'	
	MOVWF	COL1
	MOVLW	B'00010010'
	MOVWF	COL2
	MOVLW	B'00010010'
	MOVWF	COL3
	MOVLW	B'00010010'
	MOVWF	COL4
	MOVLW	B'11111100'
	MOVWF	COL5
	RETURN
BE						; B
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01101100'
	MOVWF	COL5
	RETURN
CE						; C
	MOVLW	B'01111100'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'10000010'
	MOVWF	COL3
	MOVLW	B'10000010'
	MOVWF	COL4
	MOVLW	B'01000100'
	MOVWF	COL5
	RETURN
DEE						; D
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'10000010'
	MOVWF	COL3
	MOVLW	B'10000010'
	MOVWF	COL4
	MOVLW	B'01111100'
	MOVWF	COL5
	RETURN
E						; E
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'10000010'
	MOVWF	COL5
	RETURN
EFE						; F
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00010010'
	MOVWF	COL2
	MOVLW	B'00010010'
	MOVWF	COL3
	MOVLW	B'00010010'
	MOVWF	COL4
	MOVLW	B'00000010'
	MOVWF	COL5
	RETURN
GE						; G
	MOVLW	B'01111100'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01110100'
	MOVWF	COL5
	RETURN
H						; H	
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00010000'
	MOVWF	COL2
	MOVLW	B'00010000'
	MOVWF	COL3
	MOVLW	B'00010000'
	MOVWF	COL4
	MOVLW	B'11111110'
	MOVWF	COL5
	RETURN
I						; I
	MOVLW	B'00000000'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'11111110'
	MOVWF	COL3
	MOVLW	B'10000010'
	MOVWF	COL4
	MOVLW	B'00000000'
	MOVWF	COL5
	RETURN
JOTA					; J
	MOVLW	B'01110000'
	MOVWF	COL1
	MOVLW	B'10000000'
	MOVWF	COL2
	MOVLW	B'10000000'
	MOVWF	COL3
	MOVLW	B'10000000'
	MOVWF	COL4
	MOVLW	B'01111110'
	MOVWF	COL5
	RETURN
KA						; K
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00010000'
	MOVWF	COL2
	MOVLW	B'00101000'
	MOVWF	COL3
	MOVLW	B'01000100'
	MOVWF	COL4
	MOVLW	B'10000010'
	MOVWF	COL5
	RETURN
ELE						; L
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'10000000'
	MOVWF	COL2
	MOVLW	B'10000000'
	MOVWF	COL3
	MOVLW	B'10000000'
	MOVWF	COL4
	MOVLW	B'10000000'
	MOVWF	COL5
	RETURN
EME						; M
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00000100'
	MOVWF	COL2
	MOVLW	B'00011000'
	MOVWF	COL3
	MOVLW	B'00000100'
	MOVWF	COL4
	MOVLW	B'11111110'
	MOVWF	COL5
	RETURN
ENE						; N
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00001000'
	MOVWF	COL2
	MOVLW	B'00010000'
	MOVWF	COL3
	MOVLW	B'00100000'
	MOVWF	COL4
	MOVLW	B'11111110'
	MOVWF	COL5
	RETURN
EÑE						; Ñ
	MOVLW	B'11111010'
	MOVWF	COL1
	MOVLW	B'00010010'
	MOVWF	COL2
	MOVLW	B'00100010'
	MOVWF	COL3
	MOVLW	B'01000010'
	MOVWF	COL4
	MOVLW	B'11111010'
	MOVWF	COL5
	RETURN
O						; O
	MOVLW	B'01111100'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'10000010'
	MOVWF	COL3
	MOVLW	B'10000010'
	MOVWF	COL4
	MOVLW	B'01111100'
	MOVWF	COL5
	RETURN
PE						; P
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00010010'
	MOVWF	COL2
	MOVLW	B'00010010'
	MOVWF	COL3
	MOVLW	B'00010010'
	MOVWF	COL4
	MOVLW	B'00001100'
	MOVWF	COL5
	RETURN
Q						; Q
	MOVLW	B'01111100'
	MOVWF	COL1
	MOVLW	B'10000010'
	MOVWF	COL2
	MOVLW	B'10100010'
	MOVWF	COL3
	MOVLW	B'01000010'
	MOVWF	COL4
	MOVLW	B'10111100'
	MOVWF	COL5
	RETURN
ERRE					; R
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'00010010'
	MOVWF	COL2
	MOVLW	B'00110010'
	MOVWF	COL3
	MOVLW	B'01010010'
	MOVWF	COL4
	MOVLW	B'10001100'
	MOVWF	COL5
	RETURN
ESE						; S
	MOVLW	B'01001100'
	MOVWF	COL1
	MOVLW	B'10010010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10010010'
	MOVWF	COL4
	MOVLW	B'01100100'
	MOVWF	COL5
	RETURN
TE						; T
	MOVLW	B'00000010'
	MOVWF	COL1
	MOVLW	B'00000010'
	MOVWF	COL2
	MOVLW	B'11111110'
	MOVWF	COL3
	MOVLW	B'00000010'
	MOVWF	COL4
	MOVLW	B'00000010'
	MOVWF	COL5
	RETURN
U						; U
	MOVLW	B'01111110'
	MOVWF	COL1
	MOVLW	B'10000000'
	MOVWF	COL2
	MOVLW	B'10000000'
	MOVWF	COL3
	MOVLW	B'10000000'
	MOVWF	COL4
	MOVLW	B'01111110'
	MOVWF	COL5
	RETURN
UVE						; V
	MOVLW	B'00111110'
	MOVWF	COL1
	MOVLW	B'01000000'
	MOVWF	COL2
	MOVLW	B'10000000'
	MOVWF	COL3
	MOVLW	B'01000000'
	MOVWF	COL4
	MOVLW	B'00111111'
	MOVWF	COL5
	RETURN
DOBLEW					; W
	MOVLW	B'11111110'
	MOVWF	COL1
	MOVLW	B'01000000'
	MOVWF	COL2
	MOVLW	B'00110000'
	MOVWF	COL3
	MOVLW	B'01000000'
	MOVWF	COL4
	MOVLW	B'11111110'
	MOVWF	COL5
	RETURN
EQUIS					; X
	MOVLW	B'11000110'
	MOVWF	COL1
	MOVLW	B'00101000'
	MOVWF	COL2
	MOVLW	B'00010000'
	MOVWF	COL3
	MOVLW	B'00101000'
	MOVWF	COL4
	MOVLW	B'11000110'
	MOVWF	COL5
	RETURN
IGRIEGA					; Y
	MOVLW	B'00000110'
	MOVWF	COL1
	MOVLW	B'00001000'
	MOVWF	COL2
	MOVLW	B'11110000'
	MOVWF	COL3
	MOVLW	B'00001000'
	MOVWF	COL4
	MOVLW	B'00000110'
	MOVWF	COL5
	RETURN
ZETA					; Z
	MOVLW	B'11000010'
	MOVWF	COL1
	MOVLW	B'10100010'
	MOVWF	COL2
	MOVLW	B'10010010'
	MOVWF	COL3
	MOVLW	B'10001010'
	MOVWF	COL4
	MOVLW	B'10000110'
	MOVWF	COL5
	RETURN
	
MR		BSF		PORTA,1	;MASTER RESET AL CONTADOR
		CALL	UNMILI	;RETRASO DE 1 MILISEGUNDO
		BCF		PORTA,1
		RETURN
CP0		BSF		PORTA,2	;INCREMENTA COLUMNA CONTADOR
		CALL	UNMILI	;RETRASO DE 1 MILISEGUND0
		BCF		PORTA,2
		RETURN
	  
	; RETRASO DE 0.5 SEGUNDOS

retro	MOVLW	D'15'			;RUTINA RETRASO 10 MS
		MOVWF	J	; J = w
jloop	MOVWF	K	; K = w
kloop	DECFSZ	K,f	; K = K-1, skip next if zero
		GOTO 	kloop
		DECFSZ	J,f	; J = J-1, skip next if zero
		GOTO	jloop
		RETURN

UNMILI	MOVLW	D'250'			; RUTINA RETRASO 1 MILISEGUNDO
		MOVWF	K	; J = w
kloop2	DECFSZ	K,f	; K = K-1, skip next if zero
		GOTO 	kloop2
		RETURN

;	RUTINA DE ATENCIÓN A LA INTERRUPCIÓN: ******************************************************************************************************

INTERRUP

;	SALVADO DE REGISTROS: ***********************************************************************************************************************
	
	MOVWF	SALVA_W			; GUARDAMOS EL REGISTRO W ANTES DE LA INTERRUPCIÓN
	SWAPF	STATUS,W		; USADO PARA GUARDAR EL REGISTRO STATUS, OTRA INSTRUCCIÓN AFECTA LOS BITS DE ESTADO
	MOVWF 	SALVA_STATUS	;

;	RUTINA DE TEMPORIZACIÓN LARGA: **************************************************************************************************************
	
	MOVLW	TMR0_50mS		; REINICIAMOS EL TIMER0
	MOVWF	TMR0
	DECFSZ	REG50mS,F		; DECREMENTAMOS EL CONTADOR AUXILIAR
	GOTO	TODAVIA_NO		; TODAVÍA NO SE ALCANZA EL TIEMPO DESEADO

;	RUTINA DEL CONTADOR: ***********************************************************************************************************************
	
							; YA SE CUMPLIÓ EL TIEMPO ESTABLECIDO

	INCF	CUENTA,F		; INCREMENTA EL CONTADOR PARA CARGAR EL SIGUIENTE CARACTER O REINICIAR EL CICLO
	
;	FIN DE LA RUTINA DE INTERRUPCIÓN: ***********************************************************************************************************
	
	MOVLW	CARGA			; W = NUESTRA VARIABLE DE TIEMPO
	MOVWF	REG50mS			; COMIENZA EL NUMERO DE REPETICIONES NECESARIAS PARA EL TIEMPO REQUERIDO

;	RESTAURACIÓN DE REGISTROS: ******************************************************************************************************************

TODAVIA_NO					; RUTINA DE RESTAURACIÓN DE LOS REGISTROS
	SWAPF	SALVA_STATUS,W
	MOVWF	STATUS
	SWAPF	SALVA_W,F
	SWAPF	SALVA_W,W

;	FIN DE LA INTERRUPCIÓN: *********************************************************************************************************************

	BCF		INTCON,T0IF		; BORRA EL FLAG DE INTERRUPCIÓN
	RETFIE					; REGRESA DE LA INTERRUPCIÓN

;************************************************************************************************************************************************

	END						; FIN DEL PROGRAMA