ola...antes que nada, soy nueva
en esto...bueno ay les va...Deseo ayuda en una tarea
, la cual consta y dice asi: Se trata de un contador up/down de tres digitos que cuenta desde 000 hasta 999. la entrada de pulsos a contar se aplica por ra4 es sensible al flanco descendente. la entrada ra3 determina si la cuenta es ascendente "1" o descendente "0"...ay les va el codigo .asm (quiero saber si tiene algun error, pork lo checo en el mplab y me manda errores, pero ni idea, y si poor fiis, tambien podrian decirme donde le puedo componer para que vayan mas rapido los numero, sk lo paso en proteus y los numero van k buelan
) gracias y espero me hayan entendido, pork hasta yo me hize bolas,...jajaja!!!
;Pratcica9
;contador Up/down de 3 digitos
;se trata de un contador Up/down de 3 digitos que cuenta desde 000 hasta 999. la entrada de
;pulsos a contar se aplica por RA4 es sensible al flanco descendente. la entrada RA3 determina
;si la cuenta es ascendente "1" o descendete "0"
List p=16F84
INCLUDE "P16F84.INC" ; definiciones de registros internos
DIG0 equ 0x0c ;variable para el digito 0
DIG1 equ 0x0d ;variable para el digito 1
DIG2 equ 0x0e ;variable para el digito 2
Delay_Fijo equ 0x0f ;variable de temporizacion fija
org 0x00 ;vector de reset
goto Inicio
org 0x05 ;salva vector de interrupcion
;Tabla_7_seg: esta rutina convierte el codigo BCD presente en los 4 bits de menos peso
;del reg. W en su equivalente a 7 segmenstos. el codigo 7 segmentos retornos retorna tambien
; en el reg. W
Tabla_7_seg addwf PCL,F ;desplaza al pc tantas posiciones como indique el valor del registro W
retlw b'11000000' ;codigo 7 seg del digito 0
retlw b'11111001' ;codigo del 1
retlw b'10100100' ;2
retlw b'10110000' ;3
retlw b'10011001' ;4
retlw b'10010010' ;5
retlw b'10000010' ;6
retlw b'11111000' ;7
retlw b'10000000' ;8
retlw b'10011000' ;9
;Display: esta rutina activa secuencialemnte cada uno de los digitos D0, D1 Y D2
;conectados a RA0 Y RA1 Y RA2 respectivamente, a la vez que visualiza en cada uno de
;ellos el contenido de las variables DIG1, DIG2 Y DIG3, previa conversion a 7 segmentos
Display bsf PORTA,0 ;ACTIVA DIGITO0
movf DIG0,W ;CARGA VARIANLE DIGO
call Tabla_7_seg ;convierte 7 segmentos
movwf PORTB ;visualiza DIG0 sobre el digito 0
call Delay ;Temporiza 1ms
bcf PORTA,0 ;desactiva digito 0
movlw b'11111111'
movwf PORTB
bsf PORTA,1 ;activa digito 1
movf DIG1,W ;CARGA VARIABLE DIG1
call Tabla_7_seg ;convierte a 7 segmentos
movwf PORTB ;visualiza dig1 sobre el digito 1
call Delay ;temporiza 1mS
bcf PORTA,1 ;desactiva digito 1
movlw b'11111111'
movwf PORTB ;desactiva segmentos
bsf PORTA,2 ;ACTVIA DIGITO 2
movf DIG2,W ;carga variable DIG2
call Tabla_7_seg ;convierte a 7 segmentos
movwf PORTB ;VISUALIIZA dig2 sobre el digito 2
call Delay ;temporiza 1mS
bcf PORTA,2 ;desactiva digito 2
movlw b'11111111'
movwf PORTB ;desactiva segementos
return ;fin del multiplexado
;Delay: rutina de tmeporizacion por software. Un bucle hae decermentar una variable hasta alcanzar 0. El tiempo que consue su ejecucion es del orden de 1mS, dado que la ejecucion de
;tres instrucciones que consumen 4 uS, se repite 255 veces
Delay clrf Delay_Fijo ;se manda repetir el bucle 255 veces
Delay_1 nop ;consume 1uS le quite el nop
decfsz Delay_Fijo,F ;consume 1uS
goto Delay_1 ;consume 2uS
return
;*************************************************************
;*******************************************************
;Incrementa en una unidad las variables DIG0, DIG1, y DIG2 con el correspondiente ajuste BCD
Incrementa incf DIG0,F ;Incrementa DIG0 en una unidad
movlw 0x0a
subwf DIG0,W
btfss STATUS,Z ;ES MAYOR DE 9??
return ;no
;movlw .10 esta de mas
clrf DIG0 ;SI, AJUSTA A 0 VARIABLE DIG0
incf DIG1,F ;INCREMENTA DIG1
movlw 0x0a
subwf DIG1,W
btfss STATUS,Z ;ES MAYOR DE 9
return ;no
; movlw .10 "esta de mas----"
clrf DIG1 ;SI, AJUSTA A 0 VARIABLE DIG1
incf DIG2,F ;incrementa DIG2
movlw 0x0a
subwf DIG2,W
btfss STATUS,Z ;ES MAYOR QUE 9??
return ;no
;movlw .10 esta de masss
clrf DIG2 ;SI, AGISTA A 0 VARIABLE DIG2
return
;*********************************
;***********************************
;Decrementa en una unidad las variables dig1, dig1, y dig2 con el correspondiente ajuste BCD
;
Decrementa decf DIG0,F ;decrementa dig0 en una unidad
movlw 0xff
subwf DIG0,W
btfss STATUS,Z ;ES MENOR DE 0?
return ;no
movlw .9
movwf DIG0 ;si ajuste de DIG0
decf DIG1,F ;DECREMENTA DIG1
movlw 0xff
subwf DIG1,W
btfss STATUS,Z ;ES MEOR DE 0?
return ;no
movlw .9
movwf DIG1 ;SI, AJUSTA DIG1
decf DIG2,F ; se agrego
movlw 0xff ;se agrego
subwf DIG2,W ; se agrego de masss
btfss STATUS,Z ;ES MENOR DE 0?
return ;no
movlw .9
movwf DIG2 ;SI, AJUSTA DIG2
return
Inicio movlw b'11111111'
movwf PORTB ;PONE LOS LATCH DE SALIDA
clrf PORTA ;desconecta los digitos
bsf STATUS,RP0 ;SELECCIONA BANCO 1
clrf TRISB ;PUERTA B SE COFIGURA COMO SALIDA
movlw b'00011000'
movwf TRISA ;RA0-RA2 SE CONFIGURA COMO SALIDA
movlw b'00000111'
movwf OPTION_REG ;presscaler de 256 para el TMR0
bcf STATUS,RP0 ;SELECCIONA BANCO 0
clrf DIG0
clrf DIG1
clrf DIG2 ;CARGA LAS VARIABLES CON VALOR INICIAL 000
Loop clrwdt ;refrescar el wdt
btfsc PORTA,4 ;FLACO ASCENENTE EN RA4??
goto Descendente ;Si
call Display ;no, mantiene el refresco del display
goto Loop ;Esperar
Descendente clrwdt ;refrescar el wdt
btfss PORTA,4 ;FLANCO DECENDETE EN RA4
goto Pulso ;si ha habido un pulso en RA4
call Display ;no, mantiene el refresco del display
goto Descendente ;esperar
Pulso btfss PORTA,3 ;RA3 ESTA A "1"??
goto Dec_Cont ;no
call Incrementa ;si, incrementa el contador
goto Loop ; esperar al siguiente pulso
Dec_Cont call Decrementa ;decrementar el contador
goto Loop ;esperar el siguiente pulso
end ;fin