; CONTADOR 4 DIGITOS Ascendente y Descendente
; Generado por LU8DJR 2015
;***************************************************************
;		ZONA DE DATOS DEL MICROCONTROLADOR Y FUSIBLES
;***************************************************************
	__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
	LIST	p=16F84A
	INCLUDE	<P16F84A.INC>
 ; -------- SECCION DECLARA REGISTROS --------
unid	equ	0x10	;variables usadas para unidades
dece	equ	0x11	;variables usadas para decenas
cent	equ	0x12	;variables usadas para centenas
umil	equ	0x13	;variables usadas para unidad de mil
tunid	equ	0x14	;variables temporal para unidades
tdece	equ	0x15	;variables temporal para decenas
tcent	equ	0x16	;variables temporal para centenas
tumil	equ	0x17	;variables temporal para unidad de mil
menuI	equ	0x18	;variable para ingreso menu
mblink	equ	0x19	;variable destello de menu
d1		equ	0x1A
d2		equ	0x1B
d3		equ	0x1C
loops	equ	0x1D	;variables usadas en retardos
loops2	equ	0x1E	;variables usadas en retardos
cont	equ	0x1F

;***************************************************************
;			ZONA DE CÓDIGOS 
;***************************************************************
	ORG		0x00
;***************************************************************
;		ZONA DE CONFIGURACION DE PUERTOS
;***************************************************************
inicio					;programa principal
    BSF     STATUS,RP0	;selecciona el banco de memoria 1
    MOVLW   b'10000'	;configura el puerto a
    MOVWF   PORTA		;bit 4 entrada, demas bits salidas.
    MOVLW   b'10000000'	;configura el puerto b
    MOVWF   PORTB		;como salidas
    BCF	    INTCON,GIE	;desactiva interrupciones
    BCF     STATUS,RP0	;selecciona el banco de memoria 0
    CLRF    unid			
    CLRF    dece
    CLRF    cent
    CLRF    umil
    MOVLW   .0			;Carga el valor 0 en W
    MOVWF   PORTA		;envia W a los transistores para apagar los puertos RA0,RA1,RA2 y RA3
    MOVWF   PORTA		;envia W a los transistores para apagar los puertos RA0,RA1,RA2 y RA3
    CALL    rdeeprom	;llama a lectura de EEPROM
	CALL    eepromvrf	;llama a verificar los valores de eeprom
;   CALL    wreerom		;llama a escritura de EEPROM
;***************************************************************
;		PROGRAMA PRINCIPAL
;***************************************************************
principal
;   CALL	rdeeprom	;llama a lectura de EEPROM
    CALL	display		;llama a la rutina de display
    BTFSS   PORTA,4		;chequea el pulsador incremento RA4 si el bit 4 esta en cero la intruccion siguiente se ignora
    CALL    puli		;llama la rutina pulsador de incremento (I)
    BTFSS   PORTB,7		;chequea el pulsador decremento RB7
    CALL    puld		;llama la rutina pulsador de decremento (D)
    GOTO    principal
retar2
    MOVLW   0x02
    MOVWF   d1
    MOVLW   0x2a
    MOVWF   d2
    MOVLW   0x02
    MOVWF   d3
Delay_0
    DECFSZ  d1, f
    GOTO    $+2
    DECFSZ  d2, f
    GOTO    $+2
    DECFSZ  d3, f
    GOTO    Delay_0
    CLRF    mblink
    RETURN
retardo					;subrutina de retardo 
    MOVLW   .4			;Retardo para visualizacion
    MOVWF   loops		;la variable de trabajo contiene la cant.
bloop1
    MOVLW   d'120'		;de ms a demorar
    MOVWF   loops2
bloop2  
    NOP
    DECFSZ  loops2,1	;controla si termina 1mS
    GOTO    bloop2
    DECFSZ  loops,1		;controla si termina el retardo completo
    GOTO    bloop1
    RETURN
puli					;Rutina de pulsador de incremento
    NOP					;NOP para evitar nibles
    CALL    display		;inicia buble para mostrar los digitos
    BTFSS   PORTA,4		;si el boton RA4 sigue apretado....
    GOTO    puliB
    CALL    subir
    RETURN
puliB
    BTFSC   PORTB,7
    GOTO    puli		;entonces vuelve a poli hasta que cambie de estado
    GOTO    menu
puld					;Rutina de pulsador de incremento
    NOP					;NOP para evitar nibles
    CALL    display		;inicia buble para mostrar los digitos
    BTFSS   PORTB,7		;si el boton RB7 sigue apretado....
    GOTO    puldB
    CALL    bajar
    RETURN
puldB
    BTFSC   PORTA,4
    GOTO    puld		;entonces vuelve a poli hasta que cambie de estado
    GOTO    menu
menu
    INCF    menuI,f
    MOVLW   .255
    XORWF   menuI,W
    BTFSS   STATUS,Z
    RETURN
    MOVF    unid,w
    MOVWF   tunid
    MOVF    dece,w
    MOVWF   tdece
    MOVF    cent,w
    MOVWF   tcent
    MOVF    umil,w
    MOVWF   tumil
clr
    MOVLW   .13
    MOVWF   unid
    MOVLW   .12
    MOVWF   dece
    MOVLW   .11
    MOVWF   cent
    MOVLW   .10
    MOVWF   umil
    CALL    display
    INCF    mblink,f
    MOVLW   .50
    XORWF   mblink,W
    BTFSS   STATUS,Z
    GOTO    clr
    CALL    retar2
    BTFSS   PORTA,4
    GOTO    siclr
    BTFSS   PORTB,7
    GOTO    noclr
    GOTO    clr
siclr
    BTFSC   PORTA,4
    GOTO    siclr
    CLRF    unid
    CLRF    dece
    CLRF    cent
    CLRF    umil
    BTFSS   PORTA,4
    GOTO    siclr
    GOTO    principal
noclr
    BTFSC   PORTB,7
    GOTO    noclr
    clrf    mblink
setmenu
    MOVLW   .13
    MOVWF   unid
    MOVLW   .16
    MOVWF   dece
    MOVLW   .15
    MOVWF   cent
    MOVLW   .14
    MOVWF   umil
    CALL    display
    INCF    mblink,f
    MOVLW   .50
    XORWF   mblink,W
    BTFSS   STATUS,Z
    GOTO    setmenu
    CALL    retar2
    BTFSS   PORTA,4
    GOTO    siset
    BTFSS   PORTB,7
    GOTO    noset
    GOTO    setmenu
siset
    BTFSC   PORTA,4
    GOTO    siset
    CLRF    unid
    CLRF    dece
    CLRF    cent
    CLRF    umil
    BTFSS   PORTA,4
    GOTO    siset
    GOTO    principal
noset
    BTFSC   PORTB,7
    GOTO    noset
    MOVLW   tunid
    MOVWF   unid
    MOVLW   tdece
    MOVWF   dece
    MOVLW   tcent
    MOVWF   cent
    MOVLW   tumil
    MOVWF   umil
    GOTO    principal
;------------- UNIDADES -------------------
subir					;rutina de incremento valor 
    INCF    unid,f		;incrementa el contador de unidades
    MOVLW   0ah
    XORWF   unid,W
    BTFSS   STATUS,Z
    GOTO    principal
    CLRF    unid
;-------------- DECENAS -------------------
    INCF    dece,f
    MOVLW   0ah
    XORWF   dece,W
    BTFSS   STATUS,Z
    GOTO    principal
    CLRF    dece
;-------------- CENTENAS -------------------
    INCF    cent,f
    MOVLW   0ah
    XORWF   cent,W
    BTFSS   STATUS,Z
    GOTO    principal
    CLRF    cent
;----------- UNIDADES DE MIL -----------------
    INCF    umil,f
    MOVLW   0ah
    XORWF   umil,W
    BTFSS   STATUS,Z
    GOTO    principal
    CLRF    umil
    GOTO    principal
;------------- UNIDADES -------------------
bajar					;rutina de decremento		
    DECF    unid,F
    MOVLW   .255
    XORWF   unid,w
    BTFSS   STATUS,Z
    GOTO    principal
    MOVLW   .9
    MOVWF   unid
;-------------- DECENAS -------------------
    DECF    dece,F
    MOVLW   .255
    XORWF   dece,w
    BTFSS   STATUS,Z
    GOTO    principal
    MOVLW   .9
    MOVWF   dece
;-------------- CENTENAS -------------------
    DECF    cent,F
    MOVLW   .255
    XORWF   cent,w
    BTFSS   STATUS,Z
    GOTO    principal
    MOVLW   .9
    MOVWF   cent
;----------- UNIDADES DE MIL -----------------
    DECF    umil,F
    MOVLW   .255
    XORWF   umil,w
    BTFSS   STATUS,Z
    GOTO    principal
    MOVLW   .9
    MOVWF   umil
    RETURN
display
;--------- DIGITO 1 ---------------------------				
    MOVF    unid,w
    CALL    tabla
    BSF	    PORTA,0		;Prende transistor de unidades RA0
    MOVWF   PORTB		;Envia digito al puerto B
    CALL    retardo			
    BCF	    PORTA,0		;Apaga transistor de unidades RA0
;--------- DIGITO 2 ---------------------------				
    MOVF    dece,w		;Cargo el valor de decenas
    CALL    tabla
    BSF	    PORTA,1		;Prende transistor de decenas RA1
    MOVWF   PORTB		;Envia digito al puerto B
    CALL    retardo			
    BCF	    PORTA,1		;Apaga transistor de decenas RA1
;--------- DIGITO 3 ---------------------------				
    MOVF    cent,w		;Cargo el valor de centenas
    CALL    tabla
    BSF	    PORTA,2		;Prende transistor de centenas RA2
    MOVWF   PORTB		;Envia digito al puerto B
    CALL    retardo			
    BCF	    PORTA,2		;Apaga transistor de centenas RA2
;--------- DIGITO 4 ---------------------------				
    MOVF    umil,w		;Cargo el valor de unidades de mil
    CALL    tabla
    BSF	    PORTA,3		;Prende transistor de unidades de mil RA3
    MOVWF   PORTB		;Envia digito al puerto B
    CALL    retardo			
    BCF	    PORTA,3		;Apaga transistor de unidades RA3
    RETURN
;***************************************************************
;		RUTINAS DE MANEJO DE EEPROM
;***************************************************************
;-----------------------------------------------------
; Rutina de lectura de valores almacenados en EEPROM
;-----------------------------------------------------
rdeeprom
    MOVLW   0x14
    MOVWF   cont
    MOVLW   .4
    MOVWF   EEADR
rdee_cont
    MOVF    EEADR,W
;   BCF	    STATUS,RP0	; Pasa a banco 0
    movwf   EEADR		; Dirección a leer.
    BSF	    STATUS,RP0	; Banco 1.
    BSF	    EECON1,RD	; Orden de lectura.
eeprom_busy
    btfsc   EECON1,RD	; El PIC indica que ha terminado la lectura
    goto    eeprom_busy	; poniendo en bajo este bit.
    bcf	    STATUS,RP0	; Banco 0.
    SUBWF   cont,W
    MOVWF   FSR
    movf    EEDATA,W	; El byte leído al registro W.
    MOVWF   INDF
    DECFSZ  EEADR,F
    GOTO    rdee_cont
	return
;-----------------------------------------------------
; verifica que los valores obtenidos de la EEPROM
; esten comprendidos entre 0 a 9 si no los pone a cero
;-----------------------------------------------------
eepromvrf
    movlw   .9
    subwf   unid,w
    btfss   STATUS,C
    goto    test_dece	; unid es menor que 9
    btfss   STATUS,Z
    goto    clr_unid	; unid es mayor que 9
    goto    test_dece	; unid es igual a 9
clr_unid
    clrf    unid
test_dece
    movlw   .9
    subwf   dece,w
    btfss   STATUS,C
    goto    test_cent	; dece es menor que 9
    btfss   STATUS,Z
    goto    clr_dece	; dece es mayor que 9
    goto    test_cent	; dece es igual a 9
clr_dece
    clrf    dece
test_cent
    movlw   .9
    subwf   cent,w
    btfss   STATUS,C
    goto    test_cent	; cent es menor que 9
    btfss   STATUS,Z
    goto    clr_cent	; cent es mayor que 9
    goto    test_umil	; cent es igual a 9
clr_cent
    clrf    cent
test_umil
    movlw   .9
    subwf   umil,w
    btfss   STATUS,C
    goto    fin_test	; umil es menor que 9
    btfss   STATUS,Z
    goto    clr_umil	; umil es mayor que 9
    goto    fin_test	; umil es igual a 9
clr_umil
    clrf    umil
fin_test
	return
;;*******************************************************************
tabla					;Caracteres a mostrar sobre el display
    ADDWF   PCL,f	    ;agrega al cont. programa el valor de work
    RETLW   b'00111111'	;genera el 0
    RETLW   b'00011000'	;genera el 1
    RETLW   b'01110110'	;genera el 2
    RETLW   b'01111100'	;genera el 3
    RETLW   b'01011001'	;genera el 4
    RETLW   b'01101101'	;genera el 5
    RETLW   b'01101111'	;genera el 6
    RETLW   b'00111000'	;genera el 7
    RETLW   b'01111111'	;genera el 8
    RETLW   b'01111101'	;genera el 9
    RETLW   b'01000110'	;genera el c
    RETLW   b'00000110'	;genera el l
    RETLW   b'01000010'	;genera el r
    RETLW   b'00000000'	;genera el espacio
    RETLW   b'01101101'	;genera el S
    RETLW   b'01100111'	;genera el E
    RETLW   b'01000111'	;genera el t
	
    END