RobotyPic son proyectos básicos de electrónica con microcontroladores PIC, de aplicación en el mundo de la robótica didáctica, con archivos fuente creados mediante el compilador CCS PIC C COMPILER en lenguajeC.
El LCD03 es un display que permite la comunicación tanto por bus I2C como por RS232. En este caso se va a emplear la conexión I2C con el PIC 16F876A. Para ello hay que sacar el puente trasero que viene conectado por defecto para una conexión RS232.
Dentro de este bus I2C, el acceso al display se establecerá con la dirección 0xC6. Por esta dirección se enviará el texto a mostrar así como los comandos para su control.
Decimal
Comando
Descripción
1
Inicio de Cursor
Fija el cursor en la posición de inicio (esquina superior izquierda)
2
Fijar cursor (1-80)
Fija el cursor en una posición especificada tras el byte siguiente, donde 1 es de la esquina superior izquierda y 80 es la esquina inferior derecha
3
Fijar cursor (línea, columna)
Fija el cursor utilizando dos bytes, donde el primer byte es la línea y el segundo byte es la columna
4
Ocultar cursor
Oculta la posición del cursor en el display
5
Mostrar cursor bajo
Cambia el tipo de cursor a un cursor bajo de subrayado
6
Mostrar cursor parpadeante
Cambia el tipo de cursor a un cursor parpadeante
8
Borrar carácter anterior
Borra el carácter anterior a la posición del cursor
9
Tabulador horizontal (según configuración del tabulador)
Mueve la posición actual del cursor a la posición definida en la configuración del comando 18 (por defecto el espacio del tabulador es 4)
10
Salto de línea (LF) inteligente
Mueve el cursor a la línea inferior en la posición de la misma columna
11
Tabulador vertical
Mueve el cursor a la línea superior en la posición de la misma columna
12
Borrar pantalla
Borra toda la pantalla y coloca el cursor en la posición de inicio
13
Retorno de carro
Mueve el cursor al principio de la siguiente línea
17
Borrar columna
Borra el contenido de la columna actual y mueve el cursor a la siguiente columna
18
Configuración tabulador
Define el tamaño del tabulador, el byte siguiente puede tener un tamaño de 1 a 10
19
Apaga la iluminación
Apaga la iluminación de la pantalla.
20
Enciende la iluminación
Enciende la iluminación de la pantalla.
27
Generador de caracteres personalizados
Permite la creación de 8 caracteres personalizados.
32-255
Caracteres ASCII
Escribe caracteres ASCII en el display
Para escribir un comando con el PIC sobre el display y ejecutar su acción correspondiente se escribe sobre el registro 0 del LCD03 el correspondiente comando:
i2c_start();//Comienzo de la comunicación I2C ...
i2c_write(LCD03_ID);//...con la dirección del LCD03...
i2c_write(0);//...apuntando a la posición 0 del registro del LCD03
i2c_write(comando);//acción a ejecutar según el valor de “comando”
i2c_stop ();//Finalización de la transmisión
Donde “LCD03_ID” contiene la dirección del bus para el LCD (0xC6) y “comando” el valor decimal que especifica la actuación a realizar sobre el display según la tabla anterior.
Si en lugar de ejecutar un comando lo que se desea es escribir un texto, un posible procedimiento es el especificado a continuación.
Primero se guarda en una variable tipo buffer (texto) la cadena de caracteres a escribir en el LCD:
strcpy (texto, "Mensaje a mostar");//En “texto” se guarda el mensaje
Si se quiere mostrar centrado en alguna de las lineas del display, antes identificaremos cuantos caracteres posee el mensaje guardado:
n=strlen(texto);//En “n” el número de caracteres del mensaje
Y establecemos, teniendo en cuenta que se trata de un display de 4x20 caracteres, con las variables columna y linea en que punto del display comenzará a mostrarse el mensaje:
columna=((20-n)/2)+1;//Posición texto centrado...
linea=1;//... en la 1ª linea
Y se posiciona cursor en el LCD:
i2c_start();//Comienzo de la comunicación I2C ...
i2c_write(LCD03_ID);//...con la dirección del LCD03...
i2c_write(0);//...apuntando a la posición 0 del registro del LCD03
i2c_write(3);//comando posicionar cursor...
i2c_write(linea);//...en la linea...
i2c_write(columna);//... y en la columna indicadas
i2c_stop ();//Finalización de la transmisión
Finalmente, posicionado ya el cursor, se escribe secuencialmente toda la cadena de texto:
for ( i=0; i<n; i++) {
i2c_start();//Comienzo de la comunicación I2C ...
i2c_write(LCD03_ID);//...con la dirección del LCD03...
i2c_write(0);//...apuntando a la posición 0 del registro del LCD03
i2c_write(texto[i]);//...escribe caracter posición i de texto[]
////////////////////////////////////////////////////////////////////////////////
// //
// Control de un LCD03 por bus I2C con PIC 16F876A //
// //
// (c) RobotyPic 2010 //
// //
////////////////////////////////////////////////////////////////////////////////
#include <16F876A.h> //PIC a utilizar
#include <string.h>
int LCD03_ID = 0xC6; //Dirección I2C de acceso al LCD03
char texto[20];
int i; //Posiciones para Buffer de texto
int n; //Número de caracteres
short int luz; //Encender-apagar luz del display
int comando; //Comando para LCD
int columna; //Posición en la columna
int linea; //Posición en la linea
/******************** Prototipos de las funciones *****************************/
/******************************************************************************/
/******************** FUNCIÓN ESCRITURA TEXTO EN LCD **************************/
void escritura_lcd(byte LCD03_ID){
for ( i=0; i<n; i++) {
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(LCD03_ID); //...con la dirección del LCD03...
i2c_write(0); //...apuntando a la posición 0 del registro del LCD03
i2c_write(texto[i]); //...escribe caracter posición i de texto[i]
i2c_stop (); //Finalización de la transmisión
delay_ms(10);
}
}
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(LCD03_ID); //...con la dirección del LCD03...
i2c_write(0); //...apuntando a la posición 0 del registro del LCD03
i2c_write(comando); //escribe acción
i2c_stop (); //Finalización de la transmisión
}
luz=luz+1; //Conmutación estado luz
if (luz==1) comando=19; //Comando encender luz
else comando=20; //Comando apagar luz
comando_lcd(LCD03_ID, comando); //Envío de la acción al LCD
delay_ms(300);
}
strcpy (texto, "Este es un mensaje"); //Texto de la primera línea
n=strlen(texto); //Obtiene número de caracteres
columna=((20-n)/2)+1; //Posición texto centrado...
linea=1; //... en la 1ª linea
cursor_lcd (LCD03_ID, linea, columna); //Envío posición del cursor
escritura_lcd (LCD03_ID); //Envío texto de la primera linea
strcpy (texto, "de bienvenida"); //Texto de la segunda linea
n=strlen(texto); //Obtiene número de caracteres
columna=((20-n)/2)+1; //Posición texto centrado...
linea=2; //... en la 2ª linea
cursor_lcd(LCD03_ID,linea,columna); //Envío posición del cursor
escritura_lcd (LCD03_ID); //Envío texto de la 2ª linea
cursor_lcd (LCD03_ID,linea,columna); //Envío comando posicionar cursor
strcpy (texto, "RobotyPic (c)"); //Texto de la 4ª línea
n=strlen(texto); //Obtiene número de caracteres
columna=((20-n)/2)+1; //Posición texto centrado...
linea=4;
cursor_lcd(LCD03_ID,linea,columna); //Envío posición del cursor
escritura_lcd (LCD03_ID); //Envío texto de la 4ªlinea
}
i2c_start(); //Comienzo de la comunicación I2C ...
i2c_write(LCD03_ID); //...con la dirección del LCD03...
i2c_write(0); //...apuntando a la posición 0 del registro del LCD03
i2c_write(3); //acción de posicionar cursor...
i2c_write(linea); //...en la linea...
i2c_write(columna); //... y en la columna indicadas
i2c_stop (); //Finalización de la transmisión
}
/******************************************************************************/
/************************ FUNCIÓN PRINCIPAL ***********************************/
void main() {
while(1){
//Encender-apagar luz del display
if (input(pin_B0)==1) luz_lcd();
//Borra display
if (input(pin_B1)==1) borrar_lcd();
//Salta cursor al inicio linea siguiente
if (input(pin_B2)==1) retorno_carro();
//Escribe texto
if (input(pin_B3)==1) texto_lcd();
//Borra caracter anterior
if (input(pin_B4)==1) borrar_caracter();
//Oculta cursor
if (input(pin_B5)==1) borrar_cursor();
//Muestra cursor
if (input(pin_B6)==1) mostrar_cursor();
}
}
En este video se puede verificar su funcionamiento según el procedimiento explicado.
Todos los archivos del proyecto se pueden descargar de este enlace:
2 comentarios:
Hola que tal, serías tan amable de decirme como configurar la libreria i2c para MPLABX, aún no puedo hacerlo correctamente. Te lo agradeceria mucho.
Hola Brayan.
Lo siento pero no trabajo con MPLABX
Publicar un comentario