Es un contador con dos displays (Puertos B & C) y un push-button en el pin RD0 (Puerto D),
del 00 - 99 que arranca al presionar un push-button y termina al presionarse nuevamente, se queda congelado sin hacer nada mostrando el digito en el que se quedó durante un rato y después regresa a mostrar 00, en espera de que sea presionado el push-button nuevamente.
Este es mi programa. Ojalá puedan ayudarme.
-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°
del 00 - 99 que arranca al presionar un push-button y termina al presionarse nuevamente, se queda congelado sin hacer nada mostrando el digito en el que se quedó durante un rato y después regresa a mostrar 00, en espera de que sea presionado el push-button nuevamente.
Este es mi programa. Ojalá puedan ayudarme.
-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°-°
Código:
LIST P=16F877A
#include <P16F877A.inc>
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _XT_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF;
;variables
cont_inc1 equ 0x20; Auxiliar de unidades para subrutina que regresa valor de digito en 7 seg
cont_dec1 equ 0x21; Aux unidades, se decrementa
cont_inc2 equ 0x22; Aux decenas para subrutina que regresa valor de digito en 7 seg
cont_dec2 equ 0x23; Aux decenas, se decrementa
cont_ret equ 0x24; Aux por si el boton fue presionado durante la subrutina de retardo
conta_1 equ 0x25; Auxiliares para las subrutinas de retardo
conta_2 equ 0x26;
conta_3 equ 0x27;
conta_4 equ 0x28;
;constantes
car_0 equ b'00111111'; Codigo de caracteres en 7 segmentos
car_1 equ b'00000110';
car_2 equ b'01011011';
car_3 equ b'01001111';
car_4 equ b'01100110';
car_5 equ b'01101101';
car_6 equ b'01111101';
car_7 equ b'00000111';
car_8 equ b'01111111';
car_9 equ b'01101111';
M equ .10; Para las subrutinas de retardo
N equ .125;
L equ .250;
O equ .10;
RD0 equ .0; Pin RD0 del puerto D
;===================================
org 0000h;
vec_reset clrf PCLATH;
goto prog_prin;
;===================================
org 0004h;
vec_int nop;
retfie;
;==================================
prog_ini bsf STATUS,RP0; Ve al banco 1
clrf TRISB ^0x80; Display de decenas
clrf TRISC ^0X80; Display de unidades
movlw b'11111111';
movwf TRISD ^0X80; RD0 para el push-button
movlw b'111111';
movwf TRISA ^0x80; Pto sin uso
movlw b'111';
movwf TRISE ^0x80; Pto sin uso
bcf STATUS,RP0; Ve al banco 0
return;
;=================================
prog_prin call prog_ini; Inicializa puertos
hola movlw car_0; Carga el caracter 0 en 7 segmentos
movwf PORTB; Mandalo al puerto B
movwf PORTC; y puerto C
feliz btfsc PORTD,RD0; Checa el pin del push-button
goto feliz; No fue presionado en boton
call contador; Fue presionado el boton
goto hola; Empieza otra vez
;================================
contador nop;
denuevo movlw .10;
movwf cont_dec2; Mueve un 10 al aux decenas que se decrementa
clrf cont_inc2; Deja en ceros el aux decenas que se incrementa
decenas movf cont_inc2,0; Manda el contenido de cont_inc2 a W
call tablon;
movwf PORTB; El valor encontrado en "tablon" mandalo al Puerto B
unidades movlw .10;
movwf cont_dec1; Mueve un 10 al aux unidades que se decrementa
clrf cont_inc1; Deja en ceros el aux unidades que se incrementa
aunno movf cont_inc1,0; Manda el contenido de cont_inc1 a W
call tablon;
movwf PORTC; El valor encontrado en "tablon" mandalo al Puerto C
call retardo1s;
decfsz cont_ret; Decrementa en 1 el aux del retardo
goto nofue; El boton NO fue presionado durante la subrutina de retardo
goto termina; El boton fue presionado durante la subrutina de retardo
nofue btfsc PORTD,RD0; Vuelve a checar el estado del boton
goto sigue; No fue presionado, sigue contando
goto termina; Fue presionado
sigue incf cont_inc1; Incrementa en 1 el aux unidades (siguiente valor en 7 seg de "tablon")
decfsz cont_dec1; Decrementa en 1 el aux de unidades
goto aunno; Aun no es cero, sigue con las unidades
incf cont_inc2; Fue cero, incrementa en 1 el aux decenas (siguiente valor en 7 seg de "tablon")
decfsz cont_dec2; Decrementa en 1 el aux de decenas
goto decenas; Aun no es cero, sigue la cuenta
goto denuevo; Fue cero, inicia la cuenta desde el inicio
termina call retardo10s;
return;
;==================================
retardo1s movlw M;
movwf conta_3; Carga valor predeterminado en aux para subrutina de retardo
loop3 movlw N;
movwf conta_2;
loop2 movlw L;
movwf conta_1;
loop1 btfsc PORTD,RD0; Checa el estado del boton
goto loopau; No fue presionado, sigue haciendo la subrutina
goto vealla; Fue presionado, no sigas haciendo el retardo
loopau decfsz conta_1,f;
goto loop1;
decfsz conta_2,f;
goto loop2;
decfsz conta_3,f;
goto loop3;
movlw .2;
movwf cont_ret; Termino el retardo, carga 2 en el aux del retardo
goto finish;
vealla movlw .1;
movwf cont_ret; Fue presionado el boton, carga 1 en el aux del retardo
finish nop;
return;
;==============================
retardo10s movlw O;
movwf conta_4;
loop7 movlw M;
movwf conta_3;
loop6 movlw N;
movwf conta_2;
loop5 movlw L;
movwf conta_1;
loop4 decfsz conta_1,f;
goto loop4;
decfsz conta_2,f;
goto loop5;
decfsz conta_3,f;
goto loop6;
decfsz conta_4,f;
goto loop7;
return;
;=============================
tablon addwf PCL,f;
retlw car_0;
retlw car_1;
retlw car_2;
retlw car_3;
retlw car_4;
retlw car_5;
retlw car_6;
retlw car_7;
retlw car_8;
retlw car_9;
;==============================
end
Última edición por un moderador: