TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: tomasguido en 10 de Julio de 2018, 17:13:33
-
Consulta. El programa hace que un display de 7 segmentos, valla contando de manera ascendente, cada un segundo, y al llegar al numero 9 se pone a dormir, la idea de este programa es amigarme con el uso de las tablas, el problema esta que comienza a contar a partir de 1 y no de cero, si alguien sabe a que se debe esto les agradecería la ayuda. Saludos...
Aquí el programa:
;-----------------------------------------------------------------------------------
#include "p16f84a.inc"
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _CP_OFF
varA EQU 0x0c
varB EQU 0x0d
varC EQU 0x0e
varD EQU 0x0f
cont1 EQU 0x10
cont2 EQU 0x11
ORG 0 ; inicio del programa
CLRF PORTB ; limpio el puerto b
BSF STATUS, RP0 ; configuro el puerto b como salida
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS, RP0
clrf cont1
clrf PORTB
movlw D'9'
movwf cont2
cambia:
incf cont1,1
movf cont1,0
call tabla
movwf PORTB
call retardo1s
decfsz cont2,F
goto cambia
sleep
tabla:
addwf PCL,1
retlw 0x3f
retlw 0x06
retlw 0x5b
retlw 0x4f
retlw 0x66
retlw 0x6d
retlw 0x7d
retlw 0x07
retlw 0x7f
retlw 0x6f
retardo1s:
MOVLW D'4'
MOVWF varC
bucleext2:
MOVLW D'252'
MOVWF varB
bucleext:
MOVLW D'247'
MOVWF varA
bucleint:
NOP
DECFSZ varA,F
GOTO bucleint
DECFSZ varB,F
GOTO bucleext
DECFSZ varC,F
GOTO bucleext2
MOVLW D'13'
MOVWF varD
regfina:
DECFSZ varD,F
GOTO regfina
NOP
NOP
RETURN
END
;-----------------------------------------------------------------------------------------
-
Me respondo a mi mismo por si a alguien le sirve, el programa quedaría:
#include "p16f84a.inc"
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _CP_OFF
varA EQU 0x0c
varB EQU 0x0d
varC EQU 0x0e
varD EQU 0x0f
cont1 EQU 0x10
cont2 EQU 0x11
ORG 0 ; inicio del programa
CLRF PORTB ; limpio el puerto b
BSF STATUS, RP0 ; configuro el puerto b como salida
MOVLW B'00000000'
MOVWF TRISB
BCF STATUS, RP0
clrf cont1 ;limpio contador de la tabla
clrf PORTB ;limpio puerto B
movlw D'9'
movwf cont2 ;cargo contador para entrar a dormir
cambia:
movf cont1,0 ;cargo w con el contador de la tabla
call tabla ;voy a la tabla
movwf PORTB ;muestro en el puerto B
call retardo1s ;espero un segundo
incf cont1,1
decfsz cont2,F ;decremento y verifico si es el final del contador para entrar a dormir
goto cambia ;todavia no llego a cero el contador para entrar a dormir
sleep ;duermo
tabla:
addwf PCL,1
retlw 0x3f
retlw 0x06
retlw 0x5b
retlw 0x4f
retlw 0x66
retlw 0x6d
retlw 0x7d
retlw 0x07
retlw 0x7f
retlw 0x6f
retardo1s:
MOVLW D'4'
MOVWF varC
bucleext2:
MOVLW D'252'
MOVWF varB
bucleext:
MOVLW D'247'
MOVWF varA
bucleint:
NOP
DECFSZ varA,F
GOTO bucleint
DECFSZ varB,F
GOTO bucleext
DECFSZ varC,F
GOTO bucleext2
MOVLW D'13'
MOVWF varD
regfina:
DECFSZ varD,F
GOTO regfina
NOP
NOP
RETURN
END