[ASM] Programando un PIC (Contador 999 con display 7 segmentos)

Iniciado por kal23, Enero 23, 2014, 06:41:07 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Consiste en un contador desde 000 hasta 999 y después de terminar el conteo, comienza automáticamente desde 000.

Código: asm

;**********************************************************************
;    Contador binario                                       
;**********************************************************************
;    Requiere archivos: P16F690.INC
;                       RETARDOS.INC                               
;**********************************************************************

;**********************************************************************

list p=16f690 ;Especifica microcontrolador
#include <P16F690.inc>

;Fusibles de configuración
     __config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)

;ZONA DE DECLARACIÓN DE VARIABLES
;********************************
    cblock 0x20
    Cuenta        ;Registro para llevar el conteo
    Unidad        ;Variable que lleva el conteo de unidades
    Decena        ;Variable que lleva el conteo de Decenas
    Centena       ;Variable que lleva el conteo de Centenas
    Digito
    endc

;Define nombres descriptivos para constantes y puertos
#define DISPLAY PORTC


;INICIALIZACION
;********************************
ORG 0x00 ;vector de reset

;Registros de configuración
bsf     STATUS,RP0  ;Selecciona página #1
    clrf    TRISC       ;PORTC será salida
    clrf    TRISA       ;PORTA será salida
bcf     STATUS,RP0 ;Regresa a página #0
;Inicialización de variables
    clrf    Cuenta      ;Cuenta comienza en cero
    clrf    Unidad      ;comienza en cero
    clrf    Decena      ;comienza en cero
    clrf    Centena     ;comienza en cero

;INSTRUCCIONES
;------------------------------------------------
Inicio
    incf    Cuenta,f        ;Incrementa el contador
                            ;(Para el resto de instrucciones no estamos
                            ;usando este registro aún)
ComparaUnidad
    movf    Unidad,w        ;Carga el registro Unidad en W
    sublw   .9             ;Compara con 9 (9 - Unidad)
    btfsc   STATUS,Z        ;¿Unidad = 9?
    goto    IncrementaDecena ;Sí, incrementa decena
    goto    IncrementaUnidad ;No, incrementa unidad
IncrementaUnidad
    incf    Unidad          ;Incrementa Unidad
    goto    ComparaCentena   ;Salta a ComparaCentena
IncrementaDecena
    incf    Decena          ;Incrementa Decena
    clrf    Unidad          ;Vuelve unidad a Cero
    goto    ComparaCentena   ;Salta a ComparaCentena

ComparaCentena
    movf    Decena,w        ;Carga el registro Unidad en W
    sublw   .10            ;Compara con 9 (9 - Decena)
    btfsc   STATUS,Z        ;¿Decena = 9?
    goto    IncrementaCentena ;Sí, incrementa decena
    goto    MuestraValores ;No, hace un salto a la etiqueta "MuestraValores"

IncrementaCentena
    incf    Centena        ;Incrementa Centena
    ;con esta parte del progrma vuelvo a 0 la variable centena cuando llega a 9
    ;para iniciar nuevamente el ciclo de conteo
    movf    Centena,w        ;Carga el registro Centena en W
    sublw   .1,5            ;Compara con 10 (10 - Centena)
    btfsc   STATUS,Z        ;¿Centena = 10?
    clrf    Centena ;Sí, Deja en 0 la variable Centena
    clrf    Decena ;No, Deja en 0 la variable Decena




MuestraValores
    call    EnviaUnidad     ;Activa el display de unidades
    movf    Unidad,W        ;Carga en W el valor guardado en Unidad
    call    MuestraDigito   ;lo envía al display
    call    Retardo_10ms

    call    EnviaDecena     ;Activa el display de decenas
    movf    Decena,W        ;Carga en W el valor guardado en Decena
    call    MuestraDigito   ;lo envía al display
    call    Retardo_10ms

    call    EnviaCentena     ;Activa el display de Centenas
    movf    Centena,W        ;Carga en W el valor guardado en Centena
    call    MuestraDigito   ;lo envía al display
    call    Retardo_10ms

goto    Inicio

;SUBRUTINAS
;------------------------------------------------
;MuestraDigito selecciona el dígito a mostrar en display.
;Subrutinas Envia0 - Envia9 dibujan el dígito correspondiente
;en un display de 7 segmentos. EnviaE dibuja el caracter "E".
;La subrutina activa los segmentos de un display de cátodo común
;según la siguiente configuración:
;DISPLAY CATODO COMUN:       g   f   e   d   c   b   a
;PUERTO "DISPLAY" (PORTC):   RC6 RC5 RC4 RC3 RC2 RC1 RC0

MuestraDigito
    movwf   Digito      ;Carga el valor de W en Dígito
    movlw   .0          ;Compara con 0
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 0?
    goto    Envia0      ;Sí: Envia Dígito
    movlw   .1          ;No: Compara con 1
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 1?
    goto    Envia1      ;Sí: Envia Dígito
    movlw   .2          ;No: Compara con 2
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 2?
    goto    Envia2      ;Sí: Envia Dígito
    movlw   .3          ;No: Compara con 3
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 3?
    goto    Envia3      ;Sí: Envia Dígito
    movlw   .4          ;No: Compara con 4
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 4?
    goto    Envia4      ;Sí: Envia Dígito
    movlw   .5          ;No: Compara con 5
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 5?
    goto    Envia5      ;Sí: Envia Dígito
    movlw   .6          ;No: Compara con 6
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 6?
    goto    Envia6      ;Sí: Envia Dígito
    movlw   .7          ;No: Compara con 7
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 7?
    goto    Envia7      ;Sí: Envia Dígito
    movlw   .8          ;No: Compara con 8
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 8?
    goto    Envia8      ;Sí: Envia Dígito
    movlw   .9          ;No: Compara con 9
    xorwf   Digito,W
    btfsc   STATUS,Z    ;Cuenta = 9?
    goto    Envia9      ;Sí: Envia Dígito


Envia0
    movlw   b'00111111'
    movwf   DISPLAY
    return
Envia1
    movlw   b'00000110'
    movwf   DISPLAY
    return
Envia2
    movlw   b'01011011'
    movwf   DISPLAY
    return
Envia3
    movlw   b'01001111'
    movwf   DISPLAY
    return
Envia4
    movlw   b'01100110'
    movwf   DISPLAY
    return
Envia5
    movlw   b'01101101'
    movwf   DISPLAY
    return
Envia6
    movlw   b'01111100'
    movwf   DISPLAY
    return
Envia7
    movlw   b'00000111'
    movwf   DISPLAY
    return
Envia8
    movlw   b'01111111'
    movwf   DISPLAY
    return
Envia9
    movlw   b'01100111'
    movwf   DISPLAY
    return


EnviaUnidad
    movlw   b'00000110'
    movwf   PORTA
    return
EnviaDecena
    movlw   b'00000101'
    movwf   PORTA
    return
EnviaCentena
    movlw   b'00000011'
    movwf   PORTA
    return

    INCLUDE  <RETARDOS.INC> ;Libreria de retardos
    END ;Fiin del programa.



Esquemático en Proteus:



Link de descarga del proyecto: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Que buenos aportes has dejado!
Muchisimas gracias bro!!

Saludos!
ANTRAX


No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Que buenos aportes has dejado!
Muchisimas gracias bro!!

Saludos!
ANTRAX

ANTRAX?? ;D soy tu admirador!!! un genio en malwares y seguridad informática. jajaja

Saludos.

Hola sabes que me aparece al momento de compilar error 129,linea 2 expected (END) y no lo puedo solucionar...ayuda porfa