0 Usuarios y 1 Visitante están viendo este tema.
Codigo:;HEX2BDC: Transforma el código en Hexadecimal que viene en el w,
Codigo:;HEX2BDC: Transforma el código en Hexadecimal que viene en el w,;en dos bcd, el mas alto en los 4 MSBs y el mas bajo en los 4 LSBs del registro whex2bcd movwf contador1 clrf contador2 comf contador1,fh2bcd1 movf contador1,w addlw 0x0a btfsc status,0 goto h2bcd2 movwf contador1 incf contador2,f goto h2bcd1h2bcd2 comf contador1,f movf contador2,w ;Si contador2 no es cero btfsc status,2 goto h2bcd4h2bcd3 movf contador1,w addlw 0x10 ;Se le suma a contador1 tantos 0x10 como indique movwf contador1 decfsz contador2,f goto h2bcd3h2bcd4 movf contador1,w return ;BCD2HEX: Transforma el código en BCD que viene en w a hexadecimal;y lo devuelve en el registro wbcd2hex movwf contador1 swapf contador1,w andlw 0x0f movwf contador2 btfsc status,2 goto bcd2h0 movf contador1,w andlw 0x0f movwf contador1bcd2h1 movf contador1,w addlw 0x0a movwf contador1 decfsz contador2,f goto bcd2h1bcd2h0 movf contador1,w return
Codigo:; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador; visualizado en BCD en la barra de diodos LED. Cuando llegue a 99 (b"1001 1001"); resetea y comienza de nuevo la cuenta.;; ZONA DE DATOS ********************************************************************** LIST P=16F84A INCLUDE <P16F84A.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CBLOCK 0x0C Contador ; El contador a visualizar. ENDCMAXIMO EQU .100 ; Máximo valor de la cuenta.#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.#DEFINE Display PORTB ; El display está conectado al Puerto B.; ZONA DE CÓDIGOS ************************************************************* ORG 0 ; El programa comienza en la dirección 0.Inicio bsf STATUS,RP0 ; Acceso al Banco 1. clrf Display ; Estas líneas configuradas como salidas. bsf Pulsador ; Línea del pulsador configurada como entrada. bcf STATUS,RP0 ; Acceso al Banco 0. call InicializaContador ; Inicializa el Contador y lo visualiza.Principal btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0? goto Fin ; No. Vuelve a leerlo. call Retardo_20ms ; Espera que se estabilicen los niveles de tensión. btfsc Pulsador ; Comprueba si es un rebote. goto Fin ; Era un rebote y sale fuera. call IncrementaVisualiza ; Incrementa el contador y lo visualiza.EsperaDejePulsar btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1? goto EsperaDejePulsar ; No. Espera que deje de pulsar.Fin goto Principal; Subrutina "IncrementaVisualiza" ---------------------------------------------------------IncrementaVisualiza incf Contador,F ; Incrementa el contador y comprueba si ha movlw MAXIMO ; llegado a su valor máximo mediante una subwf Contador,W ; resta. (W)=(Contador)-MAXIMO. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<MAXIMO?InicializaContador clrf Contador ; No, era igual o mayor. Por tanto, resetea.Visualiza movf Contador,W call BIN_a_BCD ; Lo pasa a BCD y movwf Display ; visualiza. return INCLUDE <BIN_BCD.INC> ; Subrutina BIN_a_BCD. INCLUDE <RETARDOS.INC> ; Subrutinas de retardo. END ; Fin del programa.
Escrito originalmente por MeybelCreo que este ejemplo te puede servir:Codigo:; Cada vez que presione el pulsador conectado al pin RA4 incrementa un contador; visualizado en BCD en la barra de diodos LED. Cuando llegue a 99 (b"1001 1001"); resetea y comienza de nuevo la cuenta.;; ZONA DE DATOS ********************************************************************** LIST P=16F84A INCLUDE <P16F84A.INC> __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC CBLOCK 0x0C Contador ; El contador a visualizar. ENDCMAXIMO EQU .100 ; Máximo valor de la cuenta.#DEFINE Pulsador PORTA,4 ; Pulsador conectado a RA4.#DEFINE Display PORTB ; El display está conectado al Puerto B.; ZONA DE CÓDIGOS ************************************************************* ORG 0 ; El programa comienza en la dirección 0.Inicio bsf STATUS,RP0 ; Acceso al Banco 1. clrf Display ; Estas líneas configuradas como salidas. bsf Pulsador ; Línea del pulsador configurada como entrada. bcf STATUS,RP0 ; Acceso al Banco 0. call InicializaContador ; Inicializa el Contador y lo visualiza.Principal btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0? goto Fin ; No. Vuelve a leerlo. call Retardo_20ms ; Espera que se estabilicen los niveles de tensión. btfsc Pulsador ; Comprueba si es un rebote. goto Fin ; Era un rebote y sale fuera. call IncrementaVisualiza ; Incrementa el contador y lo visualiza.EsperaDejePulsar btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1? goto EsperaDejePulsar ; No. Espera que deje de pulsar.Fin goto Principal; Subrutina "IncrementaVisualiza" ---------------------------------------------------------IncrementaVisualiza incf Contador,F ; Incrementa el contador y comprueba si ha movlw MAXIMO ; llegado a su valor máximo mediante una subwf Contador,W ; resta. (W)=(Contador)-MAXIMO. btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<MAXIMO?InicializaContador clrf Contador ; No, era igual o mayor. Por tanto, resetea.Visualiza movf Contador,W call BIN_a_BCD ; Lo pasa a BCD y movwf Display ; visualiza. return INCLUDE <BIN_BCD.INC> ; Subrutina BIN_a_BCD. INCLUDE <RETARDOS.INC> ; Subrutinas de retardo. END ; Fin del programa.