Holaaa gente, tengo un problema con el pic 16f628a, tengo que hacer un contador que cuente de 0 a 99, utilizando un pulsador en la patita RBO, y que cuando se prenda el display de unidades
RA0 se ponga en 1 y cuando se prenda el display decenas RA0 se ponga en 0, tambien otra condicion es que los datos se guarden en la eprom, lei en varios lados que tengo que usar multiplexion para escender ambos display
aca les dejo el codigo que es lo que pude hacer por si alguno me pueda dar una mano!! muchas gracias a todos, SALUDOS
list p=16F628A
include <p16F628A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_OFF & _XT_OSC
;---------------Variables-----------------
ContUnidad EQU 0X20
ContDecena EQU 0x21
Cont1 EQU 0x22
Cont2 EQU 0x23
ContDisplay EQU 0x24
;----------------Puertos------------------
org 0x00 ;Comienzo del programa.
goto INICIO ;Dirige al inicio del programa.
org 0x05 ;Es donde comienza el programa.
INICIO:
bsf STATUS,RP0 ;Paso al banco 1.
bsf OPTION_REG,7
movlw 0x07
movwf CMCON
movlw b'00000001' ;En w guardo el binario 00000001
movwf TRISB ;Muevo el valor de w al registro tris b
clrf TRISA ;Limpio el reg, TrisA
bcf STATUS,RP0 ;Vuelvo al banco 0.
clrf ContUnidad
clrf ContDecena
;----------------Programa------------------
;--------------Multiplexion de displays-----------
CONT_DISPLAY:
movlw d'20'
movwf ContDisplay
DISPLAY:
movlw ContUnidad,W ;Mueve lo que hay en contador de unidades a W
call TABLA_VALORES ;Llamo la tabla de valores.
BSF PORTA,0 ;RA0 EN 1
movwf PORTB ;Muestro lo que esta en w, en el display.
call RETARDO_5ms
movlw ContDecena,W ;Mueve lo que hay en contador de centenas a W
call TABLA_VALORES ;Llamo la tabla de valores.
BCF PORTA,RA0 ; RA0 EN 0 *
movwf PORTB ;Muestro lo que esta en w, en el display.
call RETARDO_5ms
decfsz ContDisplay,W
goto DISPLAY
goto PULSADOR
PULSADOR:
btfsc PORTB,RB0 ; Testeamos si esta a 0 logico.-
goto PULSADOR ; No, seguimos testeando.-
call RETARDO_5ms ; Eliminamos Efecto rebote
btfsc PORTB,RB0 ; Testeamos nuevamente.-
goto PULSADOR ; Falsa Alarma, seguimos testeando.-
goto CONTAR
CONTAR:
incf ContUnidad ;Incremento el contador
movlw d'10' ;Le asigno 10 a w
subwf ContUnidad,W ;Hago una resta entre el contador y lo que hay en W.
btfsc STATUS,Z ;Si z da 0 es porque el resultado no es cero, entonces si da z=0 salta
goto DISPLAY
goto LIMPIAR_UNIDAD
CONTAR_DECENA:
incf ContDecena ;Incremento el contador de decena.
movlw d'10' ;Le asigno 10 a w
subwf ContDecena,W
btfsc STATUS,Z ; z=0 salta, z=1 limpia el contador.
goto DISPLAY
clrf ContDecena ;Limpia contador decena.
LIMPIAR_UNIDAD:
clrf ContUnidad ;Limpia el contador de unidad.
goto CONTAR_DECENA ;Va a la subrutina del contador de decena.
RETARDO_5ms:
movlw 0xFF ; 255
movwf Cont1 ; Iniciamos contador1.-
ARRIBA:
movlw 0x05 ; 25
movwf Cont2 ; Iniciamos contador2
ABAJO:
decfsz Cont2,W ; Decrementa Contador2 y si es 0 sale.-
goto ABAJO ; Si no es 0 repetimos ciclo.-
decfsz Cont1,W ; Decrementa Contador1.-
goto ARRIBA ; Si no es cero repetimos ciclo.-
return ; Regresa de la subrutina.-
TABLA_VALORES:
addwf PCL,W
retlw b'1111110' ;0
retlw b'0110000' ;1
retlw b'1101101' ;2
retlw b'1111001' ;3
retlw b'0110011' ;4
retlw b'1011011' ;5
retlw b'1011111' ;6
retlw b'1110000' ;7
retlw b'1111111' ;8
retlw b'1110111' ;9
END