; ZONA DE DATOS **********************************************************************
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
CBLOCK 0x0C
ContadorTeclasPulsadas
GuardaValor
Operando1
Operando2
Operando3
Operando4
Operando5
Operando6
Operando7
Resultado
ENDC
; ZONA DE CÓDIGOS ********************************************************************
VisualizaHex MACRO Operando,Caracter
movf GuardaValor,W ; Recupera el valor y lo visualiza.
movwf Operando
call LCD_Nibble ; Visualiza el valor en la pantalla
;movlw Caracter
;call LCD_Caracter ; Visualiza el signo '+' ó '-' según corresponda.
incf ContadorTeclasPulsadas,F
ENDM
VisualizaDec MACRO Operando,Caracter
movf Operando1,w ;get the 1st
movwf Operando3
movf Operando2,w ;get the 1st
movwf Operando4
addwf Operando4,w ;add the 2nd
movwf Operando4 ;store the 2nd
addwf Resultado,w ;add the 3rd & store
movwf Resultado ;back in 3rd
addwf Operando3 ;add back to 1st
swapf Operando3 ;swap nibbles
movf Resultado,w ;return one byte
movwf Resultado
movf Operando1,w ;get the 1st
movwf Operando5
movf Operando1,w ;get the 1st
movwf Operando7
movf Operando2,w ;get the 1st
movwf Operando6
movf Operando5,w
addwf 1,w
movwf Operando5
movf Operando6,w
subwf Operando5,w
call numero
btfss STATUS,Z ;elimina el retorno de los numeros
movwf Operando6
movf Resultado,W
movwf Arit_Multiplicando
movf Operando6,W
movwf Arit_Multiplicador
call Arit_Multiplica_8Bit
movf Arit_Producto_H,W
addwf Operando7,w
call LCD_Nibble ; Visualiza el valor en la pantalla
incf ContadorTeclasPulsadas,F
ENDM
ORG 0
goto Inicio
ORG 4
goto ServicioInterrupcion
numero
movwf Operando5
movf Operando6,w
subwf Operando5,w
movwf Operando6
goto FinInterrupcion
Inicio
call LCD_Inicializa
call Teclado_Inicializa
call NuevaTeclaPulsada
clrf ContadorTeclasPulsadas ; Resetea este contador.
movlw b'10001000' ; Habilita la interrupción RBI y la general.
movwf INTCON
Principal
sleep ; Espera en modo bajo consumo que pulse.
goto Principal
; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
ServicioInterrupcion
call Teclado_LeeHex ; Obtiene el valor hexadecimal de la tecla pulsada.
movwf GuardaValor ; Guarda el valor.
movf ContadorTeclasPulsadas,W; Según el número de tecla pulsada realiza una
addwf PCL,F ; función distinta.
goto PrimeraTeclaPulsada
goto SegundaTeclaPulsada
goto TerceraTeclaPulsada
goto NuevaTeclaPulsada
PrimeraTeclaPulsada
call LCD_Borra ; Borra la pantalla anterior.
movlw MensajeHex ; En pantalla el mensaje "Hex:"
call LCD_Mensaje
VisualizaHex Operando1,''
goto FinInterrupcion
SegundaTeclaPulsada
movlw coma
call LCD_Mensaje
VisualizaHex Operando2,''
goto FinInterrupcion
TerceraTeclaPulsada
movf Resultado,0
;call LCD_Byte ; Visualiza el resultado.
call LCD_Linea2 ; Ahora visualiza la segunda línea.
movlw MensajeDec ; En pantalla el mensaje "Dec:"
call LCD_Mensaje
VisualizaDec Resultado,' '
goto FinInterrupcion
NuevaTeclaPulsada
call LCD_Borra
movlw MensajeHex ; En pantalla el mensaje "Hex:"
call LCD_Mensaje
movf Operando1,W ; Recupera el valor y lo visualiza.
movwf Operando1
call LCD_Nibble ; Visualiza el valor en la pantalla
movlw coma
call LCD_Mensaje
movf Operando2,W ; Recupera el valor y lo visualiza.
movwf Operando2
call LCD_Nibble ; Visualiza el valor en la pantalla
movf Resultado,Operando1
;call LCD_Byte ; Visualiza el resultado.
call LCD_Linea2 ; Ahora visualiza la segunda línea.
movlw MensajeDec ; En pantalla el mensaje "Dec:"
call LCD_Mensaje
VisualizaDec Resultado,' '
goto FinInterrupcion
;-----------Imprimo el resultado de las operaciones
FinInterrupcion
call Teclado_EsperaDejePulsar; Espera a que levante el dedo.
bcf INTCON,RBIF
retfie
; "Mensajes" ----------------------------------------------------------------------------
Mensajes
addwf PCL,F
MensajeHex
DT "intervalo: ", 0x0
coma
DT ",", 0x0
MensajeDec
DT "Num: ", 0x0
MensajeError
DT "Error /0!!",0x00
INCLUDE <TECLADO.INC>
INCLUDE <LCD_4BIT.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD.INC>
INCLUDE <ARITMETICA.INC>
END