LCD_I2C
Transcript of LCD_I2C
Control de un módulo LCDa través del bus I2C
Requerimientos hardware
� Placa basada en microcontrolador pic 16F877x (Plataforma Monibot)
� Módulo lcd por I2C modelo LCD03
� Cable de comunicación de 4 hilos (Vcc, Gnd, sda, scl)
La placa entrenadora
� Como placa de control utilizaremos la placa base Monibot:
El módulo LCD03 (I)
� Características:� Se trata de un módulo lcd de 4 líneas de 20 caracteres con
retro iluminación controlable por software.
� Puede ser configurado para trabajar mediante el protocolo serie o i2c.
� Incluye conector con posibilidad de conectar un teclado
matricial de 12 teclas
� Como display lcd i2c utilizaremos el LCD03:
El módulo LCD03 (II)
� Vista delantera
!Importante!
Este puente debe estar abierto para que el lcd trabaje en modo I2C.
� Vista trasera
El cable de conexión
� Se construye un cable con conectores molex de cuatro hilos según el esquema siguiente:
CON8 (placa)
Gnd
Vcc
Sda=RC4
Scl=RC3
CON_i2c (lcd)
Vcc
Sda
Scl
Gnd
El programa de control (I)
� Vamos a utilizar el asistente del CSS para nuestro primer programa
El programa de control (II)
� Seleccionamos
nuestro modelo de pic,
frecuencia del reloj,
tipo de oscilador
y fuses.
El programa de control (III)
� En la pestaña de
comunicaciones seleccionamos
“I2C”
El programa de control (IV)
� El archivo .h que nos genera es el siguiente
El programa de control (V)
� El archivo .c que nos genera es el siguiente
El programa de control (VI)
� El código que nosotros
tenemos que añadir es el
siguiente
El programa de control (VI)
� La salida por pantalla es:
El programa de control (VII)
� La tabla de comandos que reconoce el lcd es la siguiente:
Funciones I2C del compilador
Las funciones para manejar el bus I2C son:� i2c_start();
� Comando de “start” del bus I2C en modo “master”. Lo pondremos siempre al principio de nuestro programa. El microcontrolador actuará como maestro y el LCD_I2C actuará siempre como esclavo.
� i2c_stop();
� Comando de “stop” del bus I2C. Lo usaremos cuando no queramos seguir mandando datos al bus.
Funciones I2C del compilador
� i2c_write();� Es la función más importante para este ejemplo. Se usa para seleccionar el dispositivo (mandando al bus su número de identificación. Dato “0xC6” para nuestro lcd.
� i2c_read();� Usamos esta función cuando queremos leer un registro de un dispositivo conectado al bus:
Ejemplo:i2c_start();i2c_write(0xa1);data1 = i2c_read(); // Leemos un byte del dispositivo con id=0xA1data2 = i2c_read(); // Leemos el siguiente byte
i2c_stop();
Funciones I2C del compilador
� i2c_write();� Es la función más importante para este ejemplo. Se usa para seleccionar el dispositivo (mandando al bus su número de identificación. Dato “0xC6” para nuestro lcd.
� i2c_read();� Usamos esta función cuando queremos leer un registro de un dispositivo conectado al bus:
Ejemplo:i2c_start();i2c_write(0xa1);data1 = i2c_read(); // Leemos un byte del dispositivo con id=0xA1data2 = i2c_read(); // Leemos el siguiente byte
i2c_stop();
Creando nuestras propias funciones de control
/////////////////////////////////////////////////// //// FICHERO CON LAS FUNCIONES DE CONTROL DEL L.C.D //// para placa MONIBOT basada en pic-16F877A con //// interface I2C conectado en CON8 scl=RC3,sda=RC4 //// Fecha: mayo-2009 Rev: 9.05.11 //// By: Domingo Llorente //// ************************************************ //#use i2c(master, sda=PIN_C4, scl=PIN_C3) // Configu rar Dispositivo como
Master
//////////////////////////////// Declaración de funciones ////////////////////////////////void LCDI2C_Envia_comando(unsigned char comandos);void LCDI2C_Init(void);void LCDI2C_Stop(void);void LCDI2C_Envia_dato(unsigned char datoi2c);void LCDI2C_Envia_cadena(char *texto);void LCDI2C_Cursorpos(char fil, char col);void LCDI2C_BorrarL1(void);void LCDI2C_Nibble(unsigned char dato8bits);void LCDI2C_Binbcd(unsigned char dato8bits);
Creando nuestras propias funciones de control
/////////////////////////////// Declaración de comandos ///////////////////////////////#define borrar_lcd 0x0C // Borrar lcd#define cursor_home 0x01 // Situa cursor en pos 1,1#define cursor_ocultar 0x04 // Ocultar cursor#define cursor_mostrar 0x05 // Mostrar cursor b ajo#define cursor_parpadear 0x06 // Mostrar cursor b ajo#define cambio_linea 0x0D // Retorno de carro#define lcd_on 0x13 // Iluminación ON#define lcd_off 0x14 // Iluminación OFF
(*) El código fuente de todas las funciones se encu entra en el archivo:“lcd_i2c.c”
Segundo programa usando nuestras funciones de control
#include <16F877A.h>#fuses XT,NOWDT,NOPROTECT,NOLVP#use delay(clock=4000000)#include <lcd_i2c.c>/// MENSAJES DE TEXTO ///char msg1[]= " D.P.E (2009) ";char msg2[]= " IES LUIS DE LUCENA ";char msg3[]= " GUADALAJARA ";char msg4[]= " ------------- ";
void main(){LCDI2C_Init();LCDI2C_Envia_cadena(msg1); // Escribe la cadena msg1 en L1 del lcdLCDI2C_Envia_cadena(msg2); // Escribe la cadena msg2 en L2 del lcdLCDI2C_Envia_cadena(msg3); // Escribe la cadena msg3 en L3 del lcdLCDI2C_Envia_cadena(msg4); // Escribe la cadena msg4 en L4 del lcd
LCDI2C_Envia_dato(':');LCDI2C_Envia_dato('-');LCDI2C_Envia_dato(')');LCDI2C_Stop(); // Comando de "Stop" del bus i2cwhile(1); // Bucle infinito}