Hola!
Soy nueviiisima en programar en pic y estoy haciendo un proyecto un programa que muestre en un lcd las teclas que se van pulsando en un teclado hexadecimal. Tengo el programa principal y las librerias del lcd y el teclado, el problema es que no se como usarlas. Lei por internet que las librerias estan en C/Microchip/MPASM Suite, y las he creado alli , con extension .inc. Luego en el programa principal las llamo pero me dan muchisimos errores, y no se muy bien como va esto...
Para que lo veais mejor os dejo las librerias y el programa principal, si alguien me puede echar un cable lo agradeceria muchisimo!
Soy nueviiisima en programar en pic y estoy haciendo un proyecto un programa que muestre en un lcd las teclas que se van pulsando en un teclado hexadecimal. Tengo el programa principal y las librerias del lcd y el teclado, el problema es que no se como usarlas. Lei por internet que las librerias estan en C/Microchip/MPASM Suite, y las he creado alli , con extension .inc. Luego en el programa principal las llamo pero me dan muchisimos errores, y no se muy bien como va esto...
Para que lo veais mejor os dejo las librerias y el programa principal, si alguien me puede echar un cable lo agradeceria muchisimo!
Código:
; TECLADO
LIST
;TECLADO.INC
CBLOCK KEY_VAR ;Inicio de las variables
TECLA ;Retorno del c¢digo de tecla
KEY_1 ;N§ de filas a explorar
KEY_2 ;Temporal de c¢digo
KEY_DELAY_1 ;Variable de temporizaci¢n
KEY_DELAY_2 ;Variable de temporizaci¢n
ENDC
;RUTINA KEY_SCAN: Rutina de exploraci¢n del teclado. La variable
;"Tecla" retorna con el c¢digo de la tecla pulsada o el c¢digo 0x80
;si no se pulsa ninguna.
KEY_SCAN bsf STATUS,RP0 ;Selecciona p gina 1
movlw b'00001111'
movwf PORTB ;RB7-RB4 salidas, RB3-RB0 entradas
bsf OPTION_REG,NOT_RBPU ;Activa cargas pull-up
bcf STATUS,RP0 ;Selecciona p gina 0
movlw 4
movwf KEY_1 ;N§ de columnas a explorar
movlw b'01111111'
movwf TECLA ;Columna a activar
KEY_SCAN_1 movf TECLA,W
movwf PORTB ;Activa fila
nop
movf PORTB,W
movwf KEY_2
subwf TECLA,W ;Lee las columnas
btfss STATUS,Z ;Hay alguna pulsada ?
goto KEY_SCAN_2 ;Si hay alguna pulsada
bsf STATUS,C ;No hay ninguna en esa fila
rrf TECLA,F ;Selecciona siguiente fila
decfsz KEY_1,F ;Salta si se han terminado las filas
goto KEY_SCAN_1
movlw 0x80
goto VOLVER ;Retorna c¢digo 0x80 (no hay pulsaci¢n)
KEY_SCAN_2 movlw .100 ;Bucle de temporizaci¢n de unos 20 ms
movwf KEY_DELAY_1 ;para evitar el rebote de los pulsadores
KEY_SCAN_3 clrf KEY_DELAY_2
clrwdt
KEY_SCAN_4 decfsz KEY_DELAY_2,F
goto KEY_SCAN_4
decfsz KEY_DELAY_1,F
goto KEY_SCAN_3
movf TECLA,W ;Tras la temporizaci¢n se lee nuevamente
movwf PORTB ;si la tecla es la misma. As¡ se
nop ;evitan los rebotes.
movf PORTB,W
subwf KEY_2,W
btfss STATUS,Z ;Es la misma ?
goto KEY_SCAN_1 ;No, seguir con la exploraci¢n
movf KEY_2,W ;S¡, guardar en variable de salida TECLA el valor
; recogido
VOLVER movwf TECLA
return ;Fin de exploraci¢n
;RUTINA KEY_HEX: Convierte el c¢digo de tecla que haya en la variable
;"Tecla" a Hex. (0-F). El resultado se devuelve en la variable "Tecla".
;Usa como rutina auxiliar Key_tabla
KEY_TABLA movf KEY_1,W
addwf PCL,F ;Calcula desplazamiento
retlw 0x7D ;0
retlw 0xEE ;1
retlw 0xED ;2
retlw 0xEB ;3
retlw 0E ;4
retlw 0D ;5
retlw 0B ;6
retlw 0xBE ;7
retlw 0xBD ;8
retlw 0xBB ;9
retlw 0x7E ;A
retlw 0x7B ;B
retlw 0x77 ;C
retlw 0xB7 ;D
retlw 07 ;E
retlw 0xE7 ;F
KEY_HEX movf TECLA,W
movwf KEY_2 ;Almacena el c¢digo temporalmente
clrf KEY_1 ;Contador HEX a 0
KEY_HEX_2 call KEY_TABLA ;Busca c¢digo en la tabla
subwf KEY_2,W ;Compara con el de la tecla
btfsc STATUS,Z ;Coincide ?
goto KEY_HEX_1 ;S¡
incf KEY_1,F ;No, incrementa contador HEX
goto KEY_HEX_2
KEY_HEX_1 movf KEY_1,W
movwf TECLA ;Carga contador HEX en la variable de salida
return
LIST
;LCD
LIST
;LCD_CXX.ASM
;El conjunto de rutinas que se presentan a continuaci¢n permiten realizar
;las tareas b sicas de control del m¢dulo de visualizaci¢n LCD. Se emplean
;con los PIC 16cxx. En el programa principal se deber reservar memoria
;para el bloque de variables que utiliza el LCD del modo:
; LCD_VAR EQU dir_inicio_del_bloque
;BLOQUE DE ETIQUETAS
#define ENABLE bsf PORTA,2 ;Activa E
#define DISABLE bcf PORTA,2 ;Desactiva
#define LEER bsf PORTA,1 ;Pone LCD en Modo RD
#define ESCRIBIR bcf PORTA,1 ;Pone LCD en Modo WR
#define OFF_COMANDO bcf PORTA,0 ;Desactiva RS (modo comando)
#define ON_COMANDO bsf PORTA,0 ;Activa RS (modo datos)
CBLOCK LCD_VAR
LCD_TEMP_2 ;Inicio de las variables. Ser la primera direcci¢n libre
; disponible
LCD_TEMP_1
ENDC
;RUTINA UP_LCD: Con esta rutina se configura el PIC para que trabaje con el LCD.
UP_LCD bsf STATUS,RP0 ;Banco 1
clrf PORTB ;RB <0-7> salidas digitales
clrf PORTA ;RA <0-4> salidas digitales
bcf STATUS,RP0 ;Banco 0
OFF_COMANDO ;RS=0
DISABLE ;E=0
return
;RUTINA LCD_BUSY: Con esta rutina se chequea el estado del
;flag BUSY del m¢dulo LCD, que indica, cuando est activado, que el
;m¢dulo a£n no ha terminado el comando anterior. La rutina espera a
;que se complete cualquier comando anterior antes de retornar al
;programa principal, para poder enviar un nuevo comando.
LCD_BUSY LEER ;Pone el LCD en Modo RD
bsf STATUS,RP0
movlw H'FF'
movwf PORTB ;Puerta B como entrada
bcf STATUS,RP0 ;Selecciona el banco 0
ENABLE ;Activa el LCD
nop
L_BUSY btfsc PORTB,7 ;Chequea bit de Busy
goto L_BUSY
DISABLE ;Desactiva LCD
bsf STATUS,RP0
clrf PORTB ;Puerta B salida
bcf STATUS,RP0
ESCRIBIR ;Pone LCD en modo WR
return
;RUTINA LCD_E: Se trata de una peque¤a rutina que se encarga de generar
;un impulso de 1æ s (para una frecuencia de funcionamiento de 4 Mhz)
;por la patita de salida de la Puerta A RA2, que se halla conectada
;a la se¤al E (Enable) del m¢dulo LCD. Con esta rutina se pretende activar
;al m¢dulo LCD.
LCD_E ENABLE ;Activa E
nop
DISABLE ;Desactiva E
return
;RUTINA LCD_DATO: Es una rutina que pasa el contenido cargado en el
;registro W, el cual contiene un car cter ASCII, a la PUERTA B, para
;visualizarlo por el LCD o escribirlo en la CGRAM.
LCD_DATO OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;Valor ASCII a sacar por PORTB
call LCD_BUSY ;Espera a que se libere el LCD
ON_COMANDO ;Activa RS (modo dato)
call LCD_E ;Genera pulso de E
return
;RUTINA LCD_REG: Rutina parecida a la anterior, pero el contenido de W
;ahora es el c¢digo de un comando para el LCD, que es necesario pasar
;tambi‚n a la PUERTA B para su ejecuci¢n.
LCD_REG OFF_COMANDO ;Desactiva RS (modo comando)
movwf PORTB ;C¢digo de comando
call LCD_BUSY ;LCD libre?.
call LCD_E ;S¡. Genera pulso de E.
return
;RUTINA LCD_INI: Esta rutina se encarga de realizar la secuencia de
;inicializaci¢n del m¢dulo LCD de acuerdo con los tiempos dados por
;el fabricante (15 ms). Se especifican los valores de DL, N y F,
;as¡ como la configuraci¢n de un interfaz de 8 l¡neas con el bus
;de datos del PIC, y 2 l¡neas de 16 caracteres de 5 x 7 pixels.
LCD_INI movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
movlw b'00111000'
call LCD_REG ;C¢digo de instrucci¢n
call LCD_DELAY ;Temporiza
return
;RUTINA BORRA_Y_HOME: Borra el display y retorna el cursor a la posici¢n 0.
BORRA_Y_HOME movlw b'00000001' ;Borra LCD y Home.
call LCD_REG
return
;RUTINA DISPLAY_ON_CUR_OFF: Control del display y cursor.
;Activa el display y desactiva es cursor
DISPLAY_ON_CUR_OFF movlw b'00001100' ;LCD on, cursor off.
call LCD_REG
return
;RUTINA LCD_DELAY: Se trata de un rutina que implementa un retardo
;o temporizaci¢n de 5 ms. Utiliza dos variables llamadas LCD_TEMP_1
;y LCD_TEMP_2, que se van decrementando hasta alcanzar dicho tiempo.
LCD_DELAY clrwdt
movlw 10
movwf LCD_TEMP_1
clrf LCD_TEMP_2
LCD_DELAY_1 decfsz LCD_TEMP_2,F
goto LCD_DELAY_1
decfsz LCD_TEMP_1,F
goto LCD_DELAY_1
return
LIST
;programa principal
LIST P=16F84 ; Se emplea el PIC 16F84
RADIX HEX ; Sistema de numeraci¢n hexadecimal
__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;ETIQUETAS DEL PROGRAMA
INCLUDE "P16F84.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
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 08
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
INCLUDE "LCD_CXX.INC"
INCLUDE "TECLADO.INC"
END
Última edición por un moderador: