Codigo:
list p=16F628A
#INCLUDE <P16F628A.INC>
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
rota equ 0fh ;variable para desplazamiento de display
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
dig1 equ 10h ;acumulador miles
dig2 equ 11h ;acumulador centenas
dig3 equ 12h ;acumulador decenas
dig4 equ 13h ;acumulador unidades
loops equ 1dh ;variables usadas en retardos
loops2 equ 1eh
pulso equ 1fh
z equ 02h ;flag de cero
ram equ 05h ;bit de seleccion de pagina de memoria
c equ 00h ;flag de acarreo
w equ 00h
org 00h ;Indica al ensamblador la dirección de memoria de
;la sig. instrucción
goto Inicio
org 04h
btfss intcon,1 ;es interrupción INT?
goto sale ;si no lo es sale
Movlw d"250"
call retardo
incf pulso
btfss portb,0 ;espera a que se suelte el pulsador
goto $-1
sale bcf intcon,1
retfie
org 10h
inicio Movlw .7
movwf cmcon
bsf status, 5 ;selecciona el banco de memoria alto
movlw 00h ;configura el puerto a
movwf trisa ;como salida.
movlw b"00000001" ;configura el Pin RB0 como entrada
movwf trisb ;el resto como salida.
bcf status, 5 ;selecciona el banco de memoria bajo
movlw b"10010000" ;configura las interrupcion
movwf intcon ;RB0/INT.
clrf dig1 ;inicializa acumuladores
clrf dig2
clrf dig3
clrf dig4
clrf pulso
movlw 00 ;envia ceros a los transistores para apagar
movwf ptoa ;todos los displays digito a mostrar
;pasa el dato a el Puerto A
movf pulso,w
addwf pcl,f
goto inicio
goto empe
goto ciclo
empe call subir ;llama la rutina de incremento
movlw 08h ;iniciar un 1 en el registro de rotacion
movwf rota
movlw dig1 ;con el registro selector (fsr) se apunta
movwf fsr ;al primer dato que se va a mostrar
disp movlw 00h ;colocar en cero el dato del display
movwf ptob ;para apagarlos
movf rota, w ;pasa rotacion del 1 a la variable work
movwf ptoa ;enciende el transistor (display)
movf indo, w ;lee el dato del registro apuntado por fsr
call tabla ;genera el digito de 7 segmentos
movwf ptob ;envia el digito al puerto b
movlw 03h ;retardo de 3ms para visualizacion
call retardo
btfsc rota, 0 ;controla si terminaron las cuatro rotaciones
goto empe ;si termino, vuelve desde el comienzo
bcf status, c ;carry en cero para no afectar las rotaciones
rrf rota ;desplaza el 1 que enciende los displays
incf fsr ;incrementa el puntero. Apunta el proximo
goto disp
retardo ;subrutina de retardo
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw d"110" ;de ms a demorar
movwf loops2
top nop
nop
nop
nop
nop
nop
decfsz loops2 ;controla si termina 1mS
goto top
decfsz loops ;controla si termina el retardo completo
goto top2
retlw 0
s1000 ;rutina de incremento x 1000
clrf dig2 ;pone a cero las centenas
incf dig1 ;incrementa el contador de miles
movf dig1, w ;carga en work el conteo de los miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
clrf dig1 ;inicializa los miles
return
s100 ;rutina de incremento x 100
clrf dig3 ;pone a cero las decenas
incf dig2 ;incrementa el contador de centenas
movf dig2, w ;carga en work el conteo de las centenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s1000 ;incrementa los miles
return
s10 ;rutina de incremento x 10
clrf dig4 ;pone a cero las unidades
incf dig3 ;incrementa el contador de decenas
movf dig3, w ;carga en work el conteo de las decenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s100 ;incrementa las centenas
return
subir ;rutina de incremento
incf dig4 ;incrementa el contador de unidades
movf dig4, w ;carga en work el conteo de las unidades
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
movlw d"250" ;retardo de 100ms
call retardo
return
tabla ;genera los numeros sobre el display
addwf pc ;agrega al cont. programa el valor de work
retlw b"01111110" ;genera el 0
retlw b"00001100" ;genera el 1
retlw b"10110110" ;genera el 2
retlw b"10011110" ;genera el 3
retlw b"11001100" ;genera el 4
retlw b"11011010" ;genera el 5
retlw b"11111000" ;genera el 6
retlw b"00001110" ;genera el 7
retlw b"11111110" ;genera el 8
retlw b"11001110" ;genera el 9
ciclo nop
nop
nop
nop
goto ciclo
end
Bueno...a esto ya te lo he corregido x privado Nelson :lol:. Espero que hayas logrado hacerlo. Saludos
:lol: :lol: che no te me pongas asi! :lol: :lol: