# Incluir librerias programa en mplab pic16f84



## Maria (Jun 7, 2008)

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! 


```
; 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
```


----------



## Ardogan (Jun 7, 2008)

¿Podrías postear los errores que te tira al tratar de compilarlo? (los que te salen en la ventana output del mplab), para no revisar línea por línea y hacernos más facil ayudarte.
Saludos


----------



## Maria (Jun 7, 2008)

Hola!Gracias por contestar! Al final cambie alguna cosilla y ya no me da errores pero me da warnings en toooodas las lineas de codigo, te pongo las primeras , las demas es el mismo warning.

Warning[205] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 1 : Found directive in column 1. (LIST)
Warning[205] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 2 : Found directive in column 1. (RADIX)
Warning[205] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 3 : Found directive in column 1. (__CONFIG)
Warning[205] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 19 : Found directive in column 1. (ORG)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 20 : Found opcode in column 1. (goto)
Warning[205] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 21 : Found directive in column 1. (ORG)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 23 : Found opcode in column 1. (movwf)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 44 : Found opcode in column 1. (retlw)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 45 : Found opcode in column 1. (retlw)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 46 : Found opcode in column 1. (retlw)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 47 : Found opcode in column 1. (retlw)
Warning[203] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 48 : Found opcode in column 1. (retlw)


Esas son respecto al programa principal, luego tambien me da para las dos libreria que cree en la carpeta que ya dije:  

Warning[205] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\TECLADO.INC 1 : Found directive in column 1. (LIST)
Warning[205] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\TECLADO.INC 6 : Found directive in column 1. (CBLOCK)
Warning[205] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\TECLADO.INC 12 : Found directive in column 1. (ENDC)
Warning[203] C:\PROGRAM FILES\MICROCHIP\MPASM SUITE\TECLADO.INC 21 : Found opcode in column 1. (movlw)


----------



## Ardogan (Jun 7, 2008)

> Warning[205] D:\PRUEBAS_PIC\TECLADOLCD1.ASM 1 : Found directive in column 1. (LIST)


Este es porque está LIST solo sin ningún parámetro, no estoy seguro, por ahí los warnings que siguen son consecuencia de éste.

Por lo que veo lo usaste como inicio de archivo y fin de archivo... bueno, como comienzo de archivo no hace falta nada (si podría ir list p=16f84a seguido del #include "p16f84a.inc"), como final de archivo va un "end".

Fijate si quitando esos list sueltos sigue el problema, y acordate de poner un end al final de los archivos .asm solamente (no los .inc)

Otra cosa: veo que estás usando rutinas en archivos separados, fijate en la ayuda (help->topics->Language Tools-> MPASM assembler) el uso de las directivas "global" y "extern" (extern tiene que estar en el archivo que usa librerías de otros archivos, y global en el archivo donde se definen funciones o variables para que las usen otros archivos).

Y otra cosa más: veo que incluíste código fuente en teclado.inc; la idea de los archivos inc es definir etiquetas (por ejemplo si el pin RA1 lo uso para un boton es útil hacer un #define boton PORTAbits.RA1) constantes, variables globales, macros; pero no código fuente. Todo lo que sea código fuente va a archivos .asm

Bueno, en resumen, quitá esos LIST's sueltos, leé sobre el uso de global y extern, y el código fuente que está en el .inc movelo a un .asm (o creá un nuevo archivo .asm).

Saludos


----------



## Airoa Airon (Jun 7, 2008)

Solo dale un tab antes de cada palabra que te señala y asunto arreglado.


----------



## Maria (Jun 7, 2008)

Jejeje anda que lo de los tabuladores! apañada estoy!jeje, bueno ya he quitado los lists esos, y he metido lo que habia hecho como .inc en el programa principal. ahora solo me da dos warnings con el banco, pongo el trocito de codigo y los warnings para que lo veais.


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 


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 

Estan en negrita las lineas en las que da warning, y estos son los warning:

Message[302] D:\PRUEBAS_PIC\TECLADOLCD2.ASM 77 : Register in operand not in bank 0.  Ensure that bank bits are correct.
Message[302] D:\PRUEBAS_PIC\TECLADOLCD2.ASM 166 : Register in operand not in bank 0.  Ensure that bank bits are correct.

Soy muy nueva con esto, y este programa lo estoy copiando, pero creo que me dice que ese registro no esta en el operando 0, pero aun asi yo he seleccionado el banco 1 anteriormente., asi que no se bien a que se refiere...Muchisimas gracias por la ayuda!


----------



## Ardogan (Jun 7, 2008)

Bueno, creo que quizás es por los bancos del PIC. Antes de usar un registro hay que seleccionar el banco correspondiente, hay varios registros que están duplicados, pero otros no. Si mirás la hoja de datos en la parte del mapa de registros (register file map) vas a ver que el registro option no está duplicado.
Por eso incluí antes de esas instrucciones lo siguiente:

banksel OPTION

banksel es una macro que introduce las instrucciones necesarias para seleccionar el banco que corresponde al registro con que se invoca (en este caso el registro option, pero sirve para cualquier registro, con esto uno se ahorra de tener que andar mirando en que banco está el registro que uno quiere modificar en la hoja de datos).

Probá y si sale algún otro error acá estamos.


----------



## mabauti (Jun 7, 2008)

los warnings son prevenciones que NO evitaran que tu programa se compile y muy probablemente corra.


----------



## Airoa Airon (Jun 7, 2008)

Estos warnings pasan creo normalmente cuando pones el nombre  especifico de los registros, yo suelo usar la forma de equ y asi no me da lata el mplab, desde que me salieron 1 vez no los volvi a usar.


----------



## Maria (Jun 7, 2008)

Bueno, probe con lo de banksel pero sigue saliendo lo mismo, pero bueno no pasa nada lo dejo asi. En realidad queria dejarlo sin warnings porque es parte de mi proyecto fin de carrera e iba a quedar como una señora cuando lo viera mi profesor sin ningun error    pero asi ya esta genial. A bueno, lo del equ ya lo habia probado tambien y no entiendo porque me da un error de duplicado, cuando no lo he puesto en ningun otro sitio    . Pero bueno asi se queda!
Muchiiiisimas gracias a todos, me han echo un favor enorme! Muchos besos!


----------



## micropic (Sep 5, 2009)

para que no tengan problemas con las librerias de aca pueden descargar las e usado y funcionan perfecto sin ninguna error hay muchas librerias para poder descargar

http://www.dackenperu.com/librerias-assembler.php


----------



## Ranger (Sep 13, 2009)

Maria, lo que yo hago y no me da problemas para usar las librerias es crear las librerias en la carpeta donde guardo el rpyecto en mplab, y tambien debes habilitar la casilla donde no hace diferencias entre mayusculas, me parese que ese es tu error


----------

