document.write('
Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1.     __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
  2.     LIST       P=16F84A
  3.     INCLUDE  <P16F84A.INC>
  4.  
  5.     CBLOCK  0x0C
  6.     ContadorTeclasPulsadas
  7.     GuardaValor
  8.     Operando1
  9.     Operando2
  10.     Operando3
  11.     Resultado
  12.     ENDC
  13.  
  14.  
  15. VisualizaHex    MACRO   Operando,Caracter
  16.     movf    GuardaValor,W       ; Recupera el valor y lo visualiza.
  17.     movwf   Operando        ; Lo guarda para sumar después.
  18.     call    LCD_Nibble      ; Visualiza el valor en la pantalla
  19.     movlw   Caracter
  20.     call    LCD_Caracter        ; Visualiza el signo \'+\' ó \'-\' según corresponda.
  21.     incf    ContadorTeclasPulsadas,F
  22.     ENDM
  23.  
  24. VisualizaDec    MACRO   Operando,Caracter
  25.     movf    Operando,W      ; (Operando) -> (W)
  26.     call    BIN_a_BCD       ; Lo pasa a BCD.
  27.     call    LCD_ByteCompleto    ; Visualiza en pantalla.
  28.     movlw   Caracter        ; A continuación signo \'+\' o \'=\' según corresponda.
  29.     call    LCD_Caracter
  30.     ENDM
  31.  
  32.     ORG 0
  33.     goto    Inicio
  34.     ORG 4
  35.     goto    ServicioInterrupcion
  36. Inicio
  37.     call    LCD_Inicializa
  38.     call    Teclado_Inicializa
  39.     clrf    ContadorTeclasPulsadas  ; Resetea este contador.
  40.     movlw   b\'10001000\'     ; Habilita la interrupción RBI y la general.
  41.     movwf   INTCON
  42. Principal
  43.     sleep               ; Espera en modo bajo consumo que pulse.
  44.     goto    Principal
  45.  
  46. ServicioInterrupcion
  47.     call    Teclado_LeeHex      ; Obtiene el valor hexadecimal de la tecla pulsada.
  48.     movwf   GuardaValor     ; Guarda el valor.
  49.     movf    ContadorTeclasPulsadas,W; Según el número de tecla pulsada realiza una
  50.     addwf   PCL,F           ; función distinta.
  51.     goto    PrimeraTeclaPulsada
  52.     goto    SegundaTeclaPulsada
  53.     goto    TerceraTeclaPulsada
  54. PrimeraTeclaPulsada
  55.     call    LCD_Borra       ; Borra la pantalla anterior.
  56.     movlw   MensajeHex      ; En pantalla el mensaje "Hex:"
  57.     call    LCD_Mensaje
  58.     VisualizaHex Operando1,\'+\'
  59.     goto    FinInterrupcion
  60. SegundaTeclaPulsada
  61.     VisualizaHex Operando2,\'+\'
  62.     goto    FinInterrupcion
  63. TerceraTeclaPulsada
  64.     VisualizaHex Operando3,\'=\'
  65.  
  66.     movf    Operando1,W     ; Procede a la suma de los tres valores.
  67.     addwf   Operando2,W
  68.     addwf   Operando3,W
  69.     movwf   Resultado
  70.     call    LCD_Byte        ; Visualiza el resultado.
  71.     call    LCD_Linea2      ; Ahora visualiza la segunda línea.
  72.     movlw   MensajeDec      ; En pantalla el mensaje "Dec:"
  73.     call    LCD_Mensaje
  74.     VisualizaDec Operando1,\'+\'
  75.     VisualizaDec Operando2,\'+\'
  76.     VisualizaDec Operando3,\'=\'
  77.     VisualizaDec Resultado,\' \'
  78.     clrf    ContadorTeclasPulsadas  ; Resetea este contador.
  79. FinInterrupcion
  80.     call    Teclado_EsperaDejePulsar; Espera  a que levante el dedo.
  81.     bcf INTCON,RBIF
  82.     retfie 
  83.  
  84. Mensajes
  85.     addwf   PCL,F
  86. MensajeHex
  87.     DT  "Hex: ", 0x0
  88. MensajeDec
  89.     DT  "Dec: ", 0x0
  90.  
  91.     INCLUDE  <TECLADO.INC>
  92.     INCLUDE  <LCD_4BIT.INC>
  93.     INCLUDE  <LCD_MENS.INC>
  94.     INCLUDE  <RETARDOS.INC>
  95.     INCLUDE  <BIN_BCD.INC>
  96.     END
');