Yo tengo esto, un contador de RPM.
;************************************ Revolucion.asm *************************************
;
; ===================================================================
; Programa para visualizar las rpm de un motor
;
; Miguel Noe Garcia Perez 29 de enero del 2009
; ===================================================================
;
;
;
; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
NumeroFlancos
ENDC
ORG 0x2100
DE "Progra: Revoluciones para Neri Vespa 22/04/2009 Miguel Noe... "
MULTIPLICADOR EQU .60
; ZONA DE CÓDIGOS ********************************************************************
ORG 0
Inicio
call LCD_Inicializa
bsf STATUS,RP0 ; Acceso al Banco 1.
movlw b'00111000' ; TMR0 como contador por flanco descendente de
movwf OPTION_REG ; RA4/T0CKI. Prescaler asignado al Watchdog.
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
clrf TMR0 ; Inicializa contador.
call LCD_Borra ; Se pone al principio de la línea 1.
movlw 0x00
call LCD_PosicionLinea1
movlw MensajeInicio
call LCD_Mensaje
movlw 0x00
call LCD_PosicionLinea2
movlw MensajeMiguelito
call LCD_Mensaje
call Retardo_2s
call LCD_Borra ; Se pone al principio de la línea 1.
movlw 0x00
call LCD_PosicionLinea1
movlw MensajePrograma
call LCD_Mensaje
movlw 0x00
call LCD_PosicionLinea2
movlw MensajePrograma2
call LCD_Mensaje
call Retardo_2s
call LCD_Borra ; Se pone al principio de la línea 1.
movlw 0x00
call LCD_PosicionLinea1
movlw MensajeCuadro1
call LCD_Mensaje
movlw 0x00
call LCD_PosicionLinea2
movlw MensajeCuadro2
call LCD_Mensaje
Go_go
call Retardo_1s ; Tiempo durante el que contarán los flancos.
movf TMR0,W ; Lee el Timer 0 y lo guarda.
movwf NumeroFlancos
movf NumeroFlancos,W
call VisualizaNumero
;*************************************** calculo *******************************************
movlw 0x05
call LCD_PosicionLinea2
movlw ' ' ; Visualiza 1 espacio
call LCD_Caracter
clrf Arit_Binario_H
movf GuardaNumero,W
movwf Arit_Binario_L
call Arit_Bin_BCD_16Bit ; Pasa de binario natural en 16 bits a BCD de 5 digitos.
clrf Arit_Binario_H ; Visualiza el multiplicador en decimal.
movlw MULTIPLICADOR
movwf Arit_Binario_L
call Arit_Bin_BCD_16Bit ; Pasa de binario natural en 16 bits a BCD de 5 digitos.
movlw '=' ; Visualiza signo de igualdad.
call LCD_Caracter
movlw ' ' ; Visualiza 1 espacio
call LCD_Caracter
movf GuardaNumero,W
movwf Arit_Multiplicando
movlw MULTIPLICADOR
movwf Arit_Multiplicador
call Arit_Multiplica_8Bit ; Realiza la multiplicación.
movf Arit_Producto_H,W ; Y ahora visualiza el resultado.
movwf Arit_Binario_H
movf Arit_Producto_L,W
movwf Arit_Binario_L
call Arit_Bin_BCD_16Bit ; Pasa de binario natural en 16 bits a BCD de 5 digitos.
call Arit_VisualizaBCD ; Visualiza el resultado.
clrf TMR0
movlw ' ' ; Visualiza 1 espacio
call LCD_Caracter
movlw ' ' ; Visualiza 1 espacio
call LCD_Caracter
;********************************************************************************************
goto Go_go
; Subrutina "VisualizaNumero" -----------------------------------------------------------
;
; Cuando haya que visualizar un número mayor de 99 las decenas siempre se visualizan aunque
; sean cero. Cuando sea menor de 99 las decenas no se visualizan si son cero.
;
CBLOCK 0x0C
GuardaNumero
ENDC
VisualizaNumero
movwf GuardaNumero ; Reserva el número.
call BIN_a_BCD ; Pasa el número a BCD.
movf BCD_Centenas,W ; Primero las centenas.
btfss STATUS,Z ; Si son cero no visualiza las centenas.
goto VisualizaCentenas
movf GuardaNumero,W ; Vuelve a recuperar este valor.
call BIN_a_BCD ; Lo pasa a BCD.
;call LCD_Byte ; Visualiza las decenas y unidades.
goto FinVisualizaNumero
VisualizaCentenas
call LCD_Nibble ; Visualiza las centenas.
movf GuardaNumero,W ; Vuelve a recuperar este valor.
call BIN_a_BCD ; Lo pasa a BCD.
;call LCD_ByteCompleto ; Visualiza las decenas aunque sea cero.
FinVisualizaNumero
return
; Subrutina "Mensajes" ------------------------------------------------------------------
Mensajes
addwf PCL,F
MensajeInicio
;*******1234567890123456************
DT "IBERICA 2000/09",0x00
MensajeMiguelito
DT "Presenta:",0x00
MensajePrograma
DT "Revoluciones Por",0x00
MensajePrograma2
DT "Minuto.V 1.1 ",0x00
MensajeCuadro1
DT "Vueltas de Motor",0x00
MensajeCuadro2
DT "R.P.M:",0x00
MensajeBorra
DT " ",0x00
INCLUDE <ARITMETICA.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
END
; ====================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS".
; E. Palacios, F. Remiro y L. López. www.pic16f84a.com
; Editorial Ra-Ma. www.ra-ma.es
; ====================================================================