Aqui les va el programa completo, esto parece que tiene que ser parte de un arreglo con apuntadores o algo asi ...
;PROYECTO TÖPICO 3
;"ESCRITURA DE MENSAJES DE TECLADO SOBRE LCD"
;Se desea realizar un programa que visualice sobre el LCD las teclas
;que se vayan pulsando. Cada pulsaci¢n ir acompa¤ada de un "beep" de
;0,25 segundos sobre el zumbador piezoel‚ctrico conectado a RA3
;DIRECTIVAS DEL PROGRAMA
LIST P=16F84 ; Se emplea el PIC 16F84
RADIX HEX ; Sistema de numeraci¢n hexadecimal
;ETIQUETAS DEL PROGRAMA
INCLUDE "PIC16CXX.INC"
TEMP_1 EQU 0x0C
DELAY_1 EQU 0x0D
DELAY_2 EQU 0x0E
DELAY_3 EQU 0x0F
LCD_VAR EQU 0x10
KEY_VAR EQU 0x12
;POSICIONAMIENTO DE LA RUTINA DE INICIO
ORG 0 ; El programa comienza en la direcci¢n 0 y
goto INICIO ; salta a la direcci¢n 5 para sobrepasar el
ORG 5 ; vector de interrupci¢n
;RUTINA HEX_ASCII: Rutina que pasa el valor HEXADECIMAL que contiene
;W a valor ASCII, para ser mostrado por el LCD
HEX_ASCII addwf PCL,1
retlw "0"
retlw "1"
retlw "2"
retlw "3"
retlw "4"
retlw "5"
retlw "6"
retlw "7"
retlw "8"
retlw "9"
retlw "A"
retlw "B"
retlw "C"
retlw "D"
retlw "E"
retlw "F"
;PROGRAMA PRINCIPAL
INCLUDE "LCD_CXX.ASM"
INCLUDE "TECLADO.ASM"
INICIO call UP_LCD
call LCD_INI
call DISPLAY_ON_CUR_OFF
bsf STATUS,RP0 ; Selecci¢n del banco 1
clrf PORTA ; Puerta A como salida
movlw b"10000111"
movwf OPTION_REG
bcf STATUS,RP0
bsf PORTA,3 ; Desactivaci¢n del zumbador
NO_HAY call KEY_SCAN ; Se hace un chequeo del teclado
movlw 0x80
subwf TECLA,W ; Sobre TECLA quedar la tecla pulsada o 0x80
btfsc STATUS,Z
goto NO_HAY ; No se ha pulsado ninguna tecla
call KEY_OFF ; S¡ se ha pulsado. Se espera a que se suelte
bcf PORTA,3 ; Se genera un "beep"
movlw d"25"
movwf TEMP_1
call DELAY10 ; Se crea una temporizaci¢n de 25 ms
bsf PORTA,3 ; Se desactiva zumbador
call KEY_HEX ; Se pasa a valor hexadecimal
call HEX_ASCII ; Se pasa el valor hexadecimal a c¢digo ASCII
movwf TECLA ; Se guarda temporalmente en TECLA
call UP_LCD
call BORRA_Y_HOME
call DISPLAY_ON_CUR_OFF
movlw 0x81 ; Primer car cter de primera l¡nea
call LCD_REG
movf TECLA,W
call LCD_DATO ; Se saca por el LCD
goto NO_HAY ; Se vuelve a empezar
;RUTINA DE DELAY DE 10 MS: Esta rutina utiliza el TMR0.
;Es una temporizaci¢n de 10 ms que se repite tantas veces
;como indique la variable TEMPO1
DELAY10 bcf INTCON,2 ; Borra flag del TMR0
movlw 0xD8
movwf TMR0 ; Carga el TMR0 con valor 39
DELAY10_1 btfss INTCON,2 ; Espera rebosamiento del TMR0
goto DELAY10_1
decfsz TEMP_1,F
goto DELAY10
return
;RUTINA DE DELAY DE 1 SEGUNDO: Se basa en la rutina de 10ms, repiti‚ndola 100 veces
DELAY1S movlw 0x64
movwf TEMP_1
call DELAY10
return
;RUTINA KEY_OFF: Esta rutina espera que la tecla reci‚n pulsada sea soltada.
;Debe usarse justo despu‚s de llamar a la rutina KEY_SCAN
KEY_OFF movf TECLA,W
movwf TEMP_1 ; Guarda temporalmente la tecla
KEY_OFF_NO call KEY_SCAN ; Mira si se ha soltado
movlw 0x80
subwf TECLA,W
btfss STATUS,Z
goto KEY_OFF_NO ; Bucle mientras no se suelte
movf TEMP_1,W ; Ya se ha soltado
movwf TECLA ; Se repone la tecla
return
;RUTINA DE DELAY VARIABLE: Esta rutina realiza una temporizaci¢n que
;depende del valor del acumulador en el momento en que se le llama
DELAY_V movwf DELAY_1
clrf DELAY_3
clrf DELAY_2
DELAY_LOOP decfsz DELAY_3,F
goto DELAY_LOOP
decfsz DELAY_2,F
goto DELAY_LOOP
decfsz DELAY_1,F
goto DELAY_LOOP
return
END
saludos a todos