Display LCD gráfico para el curso

Introducción

Para hacer más llamativo el uso del microcontrolador en el curso, hemos decidido reciclar los display GLCD que usábamos con los microcontroladores 8051.
Ha sido interesante pelearse con un LCD diseñado para alimentarse a 5 volts. que hay que conectar a un micro diseñado para 3,3 volts, y lo contamos aquí para que sirva como material didáctico.
Aquí tenemos la bibliotecas y las conexiones realizadas, que se basan en el trabajo que ya se hizo en el Módulo para utilizar el lcd gráfico de la placa Mikroe EASY8051B.

Conexión al micro y configuración de la GPIO

El GLCD usado es el modelo GDM12864B de la empresa xmocular.
La marca del GLCD no es interesante, lo que es importante es conocer en controlador (hardware que gestiona la pantalla y hace de interfaz con el exterior). En este caso es un S6B0108 compatible  Samsung KS0108 e Hitachi HD61202, y tiene una resolución de 128×64 pixels monocromo (2 colores).
Para conectarlo al micro, el principal reto es conseguir hacer funcionar este dispositivo pensado para 5 V con un micro pensado para 3.3 V. Partimos de la ventaja de que el manual del STM32F4  dice que es “5 V tolerant”… veremos.
Para la conexión del GLCD al los puertos del micro, lo más razonable es:

  • usar resistencias de pull-up a 5 V
  • configurar el puerto en colector/drenador abierto
  • desconectar los pull-ups internos del puerto

Físicamente, la conexión sería

esquema_glcd

(El esquema es de Sergi Soro, que ha pasado mis rallajos)

Y, por ejemplo, para lograr la configuración antes indicada para las líneas de control, las líneas de código serían:

/* PD11 - PD6 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_10 | GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; // modo salida
GPIO_InitStructure.GPIO_OType = GPIO_OType_OD; // "open drain"
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; // mejor menos, nos hemos pasado
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; // desconectar pulls
GPIO_Init(GPIOD, &GPIO_InitStructure);

¡Y a funcionar!

Biblioteca software

Descarga de la biblioteca

Descarga la biblioteca para manejar un glcd compatible KS0108 con un microcontrolador STM32F4.

Incorporación de la biblioteca al proyecto

Para poder utilizar fácilmente el glcd hay que seguir esos pasos:

  • descargar la biblioteca
  • descomprimirla en el directorio del proyecto
  • añadir al proyecto los módulos ks0108_common.c y ks0108_stm32f4.c
  • si se desea mostrar texto en el glcd, añadir el módulo font5x7.c
  • si se desea que la función printf() muestre la salida en el glcd, añadir el módulo glcd_fputc.c
  • en el módulo que utiliza el glcd será necesario incluir la cabecera glcd.h y llamar a la funcion glcd_inicializar()

Ejemplo de uso

A continuación tenemos un ejemplo de programa que usa la biblioteca. Este ejemplo viene con la biblioteca.

// Fichero: test_glcd.c
// Ejemplo de uso del módulo glcd de la placa Mikroe
// Angel Perles 2012

#include "glcd.h"
#include <stdio.h>

// Incorporar en el codigo una image en formato xbm
#include "./med_sim2.xbm"

void pausa(long i);

//----------------------------------------------------------------------------
int main(void) {

int i;
int x,y;

glcd_inicializar();    // preparar el hardware

// apagar y encender la pantalla
pausa(20000);
glcd_display_off();
pausa(20000);
glcd_display_on();

glcd_putxbitmap(1,1,0,med_sim2);    // mostrar una imagen en las coordenadas (1,1)

// hacer un triangulo a base de pixels
for (y=0;y<10;y++) {
for (x=0;x<y;x++)
{
glcd_putpixel(85+x,y,1);
glcd_putpixel(85-x,y,1);
glcd_putpixel(85+x,63-y,1);
glcd_putpixel(85-x,63-y,1);
}
}

// sacar un texto con el font por defecto
glcd_font_puts(&font5x7,57,20,"Cris i Ana!");

// dibujar un par de rectángulos
glcd_rectangle(50,30,120,50,1);
glcd_rectangle(55,35,115,45,1);

// probar la redirección de printf()
glcd_putchar_setxy(57,37);
printf("Cont=");

while (1) {
for(i=0;i<10000;i++) {
glcd_putchar_setxy(90,37);
  printf("%04d",i);
}
}

}

//----------------------------------------------------------------------------
void pausa(long i) {
while(i--);
}

 

Dibujando

La biblioteca es muy básica y solo es capaz de dibujar puntos (pixels) y rectángulos. Más que suficiente para el curso.

El sistema de coordenadas toma la coordenada superior izquierda como (x=0,y=0) y, como la resolución es de 128×64 pixels, la coordenada inferior derecha es (x=123,y=64).

Las siguientes funciones están disponibles para dibujar:

void glcd_putpixel(unsigned char x, unsigned char y, unsigned char color);

Dibuja un punto (pixel) en las coordenadas (x,y). El valor de color puede ser 0 o 1.

void glcd_rectangle( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, unsigned char color);

Dibuja un rectángulo con coordenadas (x1,y1), (x2,y2). El valor de color puede ser 0 o 1.

Mostrando texto

El módulo incorpora funciones para generar texto. Para usar ésta característica, es necesario incorporar los fuentes de texto que se deseen según se indica en el apartado de uso del módulo.

Las funciones disponibles son:

void glcd_font_puts(Tfont *fnt, unsigned char x, unsigned char y, char *textp);

Dibuja el texto apuntado por texto en las coordenadas (x,y) utilizando la fuente fnt.

Ejemplo: glcd_font_puts(&font5x7,57,20,"¡Hola GLCD!");

Utilizando la función printf()

Para que la funcin printf() muestre su salida por el glcd se puede incorporar al proyecto el módulo indicado en el apartado de uso.

Para indicar la coordenada del glcd en la que saldrá el texto, se deberá usar previamente la función:

void glcd_putchar_setxy(unsigned char x, unsigned char y);

Establece las coordenadas de texto para printf en (x,y)

Mostrando imágenes

La biblioteca incorpora funciones para mostrar imágenes de mapa de bits en formato X BitMap(xbm). Las imágenes en este formado se pueden conseguir exportando cualquier imagen a dicho formato. En el caso del ejemplo, la imagen se ha obtenido exportando, con el programa gimp, una imagen jpeg del médico de los Simpson.

Para incorporar la imagen al programa, se deberá hacer:


// Incorporar en el cdigo una image en formato xbm
#include "med_sim2.xbm"

Cuando se quiera mostrar la imagen en el glcd se usará la función:

void glcd_putxbitmap(unsigned char x, unsigned char y, unsigned char copy_options, unsigned char *xbm);

Donde (x,y) son las coordenadas superior izquierda donde colocar la imagen, copy_options dejarlo con un 0 (otro año será), y xmb es el puntero a la imagen.

Ejemplo: glcd_putxbitmap(1,1,0,med_sim2);

¿Por qué se ha usado este formato aparentemente desconocido?
La mayoría de las bibliotecas para uso de glcd encontradas por Internet suelen utilizar programas adicionales que convierten una imagen de tipo BMP al formato que haya ideado el que ha escrito la biblioteca.
Usar un programa y un formato específico particular es un engorro adicional, así que se ha intentado buscar una manera de incorporar imágenes directamente en los programas sin hacer conversiones. Y esto se ha logrado utilizando el formato libre para imágenes monocromas X BitMap.

Para poder visualizar estas imágenes en Guindows se puede emplear cualquier navegador de Internet que no sea Egplorer de Microplof, que ya no lo soporta. En Linux no hay pegas.

Agradecimientos

A Dani Fernández por la primera versión del generador de fuentes.
A Fabian Maximilian y Stephane Rey, por sacarme del bloqueo con las )#@! de este glcd y ser la base para esta biblioteca.