En términos muy simples, una pantalla táctil (touch screen) es una combinación de una pantalla gráfica estándar GLCD 128x64 a la que se le ha añadido un panel táctil (touch panel TP) lo que permite crear interfaces de usuario muy simples, intuitivos, versátiles y sumamente atractivos (similares a las pantallas táctiles de los teléfonos moviles y otros equipos electrónicos). La tecnología táctil es lo más moderno que existe actualmente para la interacción entre el usuario y un dispositivo electrónico y se usa ampliamente en teléfonos celulares, tablets, computadoras personales y otros artefactos electrónicos.


¡Descubre el mundo de los microcontroladores PIC y lleva tus habilidades de programación al siguiente nivel! Obtén nuestro eBook y disfruta aprendiendo paso a paso desde cero, podrás realizar proyectos prácticos, encontrar soluciones a problemas comunes y explorar una amplia cobertura de temas desde lo más básico a lo más avanzado. Incluye software y ejemplos resueltos. ¡Cómpralo ahora y libera el increíble potencial de esta poderosa tecnología hoy mismo!

Microcontroladores PIC en PDF: Curso completo


Normalmente para convertir una pantalla gráfica (GLCD 128x64) a la tecnología táctil se coloca sobre aquélla un panel táctil (se lo puede comprar por separado o incorporado al GLCD). El control del panel táctil se logra actuando sobre sus cuatro terminales de conexión a través de un pequeño circuito transistorizado y un microcontrolador. La pantalla táctil se conecta de la manera convencional al microcontrolador, y debido al número relativamente alto de conexiones necesarias se debe utilizar un microcontrolador con la cantidad suficiente de pines disponibles, por ejemplo puede ser el PIC16F877A o el PIC16F887.

Pantalla táctil GLCD 128x64 con panel táctil

El panel táctil dispone de cuatro pines de conexión (en una cinta de 4 terminales); estos terminales se identifican de la siguiente forma (se puede identificar visualmente cada pin observando con atencion a cual segmento del panel tactil esta conectado):

  • T-Top (Arriba)
  • R-Right (Derecha)
  • B-Bottom (Abajo)
  • L-Left (Izquierda)

Los pines R-L conforman lo que se llama superficie X, y permiten determinar la coordenada x del panel tactil. Los pines T-B conforman lo que se llama superficie Y, y permiten determinar la coordenada y del panel tactil.

Conexión del GLCD 128x64 y el panel táctil a un PIC16F877A

La conexión del GLCD 128x64 al PIC16F877A requiere 15 pines del PIC. Mientras que la conexión del panel táctil se logra por medio de un pequeño circuito transistorizado y necesita 4 pines más del PIC, como se indica en las siguientes figuras: Circuito con pantalla táctil glcd 128x64 y pic16f877aConexión del panel táctil

Los transistores pueden ser los siguientes (o en su defecto cualquier transistor de propósito general de características similares a los indicados):

  • BC556 ó 2N3906 (PNP, Si)
  • BC546 ó 2N3904 (NPN, Si)

Una desventaja de la pantalla táctil es su elevado número de conexiones, que al final se ve compensada por los resultados obtenidos. 

Ejemplo en mikroC PRO con el PIC16F877A

GLCD_tactil.c: Pantalla táctil con GLCD 128x64 funcionando como Hoja de dibujo con el microcontrolador PIC16F877A en C (mikroC PRO). Dispone de comandos en pantalla (estos comandos se activan al tocar sobre ellos) para borrar todo CLEAR, para seleccionar el ancho del pincel (los tres puntos cuadrados), para usar el pincel como borrador ERASE y para usar el pincel como lápiz WRITE. Cuando el pincel trabaja como lápiz se puede dibujar cualquier forma en la pantalla simplemente desplazando un señalador de punta redonda (para no dañar el panel táctil). Si se desea también se puede cambiar la función del pincel para que actúe como borrador. Librerías activas de mikroC PRO: ADC, T6963C, TouchPanel y Trigonometry

//GLCD_tactil.c
//Microcontrolador: PIC16F877A
//Oscilador: Externo 4MHz (Modo HS)
//El archivo T6963C.h contiene la definición de constantes y macros. Este
//archivo se encuentra en la carpeta del proyecto.

#include        "T6963C.h"

//Declaración de variables de conexión del T6963C
char T6963C_dataPort at PORTD;                   // Puerto de Datos

sbit T6963C_ctrlwr  at RB2_bit;                  // Señal WR write
sbit T6963C_ctrlrd  at RB1_bit;                  // Señal RD read
sbit T6963C_ctrlcd  at RB0_bit;                  // Señal CD command/data
sbit T6963C_ctrlrst at RB4_bit;                  // Señal RST reset
sbit T6963C_ctrlwr_Direction  at TRISB2_bit;     // Señal WR write
sbit T6963C_ctrlrd_Direction  at TRISB1_bit;     // Señal RD read
sbit T6963C_ctrlcd_Direction  at TRISB0_bit;     // Señal CD command/data
sbit T6963C_ctrlrst_Direction at TRISB4_bit;     // Señal RST reset

//Señales no empleadas por la librería, se configuran en la función main
sbit T6963C_ctrlce at RB3_bit;                   // Señal CE
sbit T6963C_ctrlfs at RB6_bit;                   // Señal FS
sbit T6963C_ctrlmd at RB5_bit;                   // Señal MD
sbit T6963C_ctrlce_Direction  at TRISB3_bit;     // Señal CE
sbit T6963C_ctrlfs_Direction  at TRISB6_bit;     // Señal FS
sbit T6963C_ctrlmd_Direction  at TRISB5_bit;     // Señal MD
//Final de declaración de variables de conexión del T6963C

// Touch Panel (TP) module connections
sbit DriveA at RC0_bit;
sbit DriveB at RC1_bit;
sbit DriveA_Direction at TRISC0_bit;
sbit DriveB_Direction at TRISC1_bit;
// End Touch Panel module connections

char         write_erase;
char         pen_size;
char write_msg[] = "WRITE";                                // GLCD menu messages
char clear_msg[] = "CLEAR";
char erase_msg[] = "ERASE";
unsigned int x_coord, y_coord;

void Initialize() {
  DriveA_Direction = 0;                                    // Set DriveA pin as output
  DriveB_Direction = 0;                                    // Set DriveB pin as output
  TRISA  = 3;
  ADC_Init();                                              // Initialize ADC
  TP_Init(128, 64, 0, 1); //Initialize TP. Canal 0(AN0) para la posición x, canal 1(AN1)
  //para la posición y.
  TP_Set_ADC_Threshold(900);                       // Set touch panel (TP) ADC threshold
}

  void Calibrate() {
  T6963C_Dot(0,63,T6963C_WHITE);                           // Draw bottom left dot
  T6963C_Write_Text("TOUCH BOTTOM LEFT",0,3,T6963C_ROM_MODE_OR);
  TP_Calibrate_Bottom_Left();                     // Calibration of bottom left corner
  Delay_ms(1000);

  T6963C_Dot(0,63,T6963C_BLACK);                           // Clear bottom left dot
  T6963C_Dot(127,0,T6963C_WHITE);                          // Draw upper right dot
  T6963C_Write_Text("                 ",0,3,T6963C_ROM_MODE_OR);
  T6963C_Write_Text("TOUCH UPPER RIGHT",0,4,T6963C_ROM_MODE_OR);
  TP_Calibrate_Upper_Right();                     // Calibration of upper right corner
  Delay_ms(1000);
}

void main() {
T6963C_ctrlce_Direction = 0;
T6963C_ctrlce = 0;            //Habilitar el T6963C.
T6963C_ctrlfs_Direction = 0;
T6963C_ctrlfs = 0;            //Fuente 8x8 (FS<1:0>=00).
T6963C_ctrlmd_Direction = 0;
T6963C_ctrlmd = 1;            //32 columnas (MD<3:2>=11) (pantalla virtual)

T6963C_init(128, 64, 8);      //Inicializa el T6963C. Caracteres de 8 bits.
T6963C_graphics(1);           //Habilita la presentación de gráficos.
T6963C_text(1);               //Habilita la presentación de texto.

Initialize();

T6963C_Write_Text("CALIBRATION",0,3,T6963C_ROM_MODE_OR);
Delay_ms(1000);
T6963C_txtFill(0);                                            // Clear GLCD
Calibrate();
T6963C_txtFill(0);
T6963C_Write_Text("WRITE ON SCREEN",0,5,T6963C_ROM_MODE_OR) ;
Delay_ms(1000);
T6963C_txtFill(0);                                            // Clear GLCD
T6963C_Write_Text(clear_msg,0,0,T6963C_ROM_MODE_OR);
T6963C_Write_Text(erase_msg,11,0,T6963C_ROM_MODE_OR);

// Pen Menu:
T6963C_Rectangle(41,0,52,9,T6963C_WHITE);
T6963C_Box(45,3,48,6,T6963C_WHITE);
T6963C_Rectangle(63,0,70,7,T6963C_WHITE);
T6963C_Box(66,3,67,4,T6963C_WHITE);
T6963C_Rectangle(80,0,86,6,T6963C_WHITE);
T6963C_Dot(83,3,T6963C_WHITE);

write_erase = T6963C_WHITE;
pen_size = 1;
while (1) {
  if (TP_Press_Detect()) {
    // After a PRESS is detected read X-Y and convert it to 128x64 space
    if (TP_Get_Coordinates(&x_coord, &y_coord) == 0) {

      if ((x_coord < 31) && (y_coord < 8)) {
        T6963C_grFill(0);
        T6963C_txtFill(0);

        // Pen Menu:
        T6963C_Rectangle(41,0,52,9,T6963C_WHITE);
        T6963C_Box(45,3,48,6,T6963C_WHITE);
        T6963C_Rectangle(63,0,70,7,T6963C_WHITE);
        T6963C_Box(66,3,67,4,T6963C_WHITE);
        T6963C_Rectangle(80,0,86,6,T6963C_WHITE);
        T6963C_Dot(83,3,T6963C_WHITE);

        T6963C_Write_Text(clear_msg,0,0,T6963C_ROM_MODE_OR);
        if (write_erase)
        T6963C_Write_Text(erase_msg,11,0,T6963C_ROM_MODE_OR);
        else
        T6963C_Write_Text(write_msg,11,0,T6963C_ROM_MODE_OR);
      }

      // If write/erase is pressed
      if ((x_coord > 96) && (y_coord < 8)) {
        if (write_erase) {
          write_erase = T6963C_BLACK;
          T6963C_Write_Text(write_msg,11,0,T6963C_ROM_MODE_OR);
          Delay_ms(500);
        }
        else {
          write_erase = T6963C_WHITE;
          T6963C_Write_Text(erase_msg,11,0,T6963C_ROM_MODE_OR);
          Delay_ms(500);
        }
      }

      // If pen size is selected
      if ((x_coord >= 41) && (x_coord <= 52) && (y_coord <= 9))
      pen_size = 3;

      if ((x_coord >= 63) && (x_coord <= 70) && (y_coord <= 7))
      pen_size = 2;

      if ((x_coord >= 80) && (x_coord <= 86) && (y_coord <= 6))
      pen_size = 1;

      if (y_coord < 11)
      continue;

      switch (pen_size) {
        case 1 : {
          if ( (x_coord >= 0) && (y_coord >= 0) && (x_coord <= 127) && (y_coord <= 63) )
          T6963C_Dot(x_coord, y_coord, write_erase);
          break;
        }
        case 2 : {
          if ( (x_coord >= 0) && (y_coord >= 0) && (x_coord <= 127-1) && (y_coord <= 63-1) )
          T6963C_Box(x_coord, y_coord, x_coord + 1, y_coord + 1, write_erase);
          break;
        }
        case 3 : {
          if ( (x_coord >= 1) && (y_coord >= 1) && (x_coord <= 127-2) && (y_coord <= 63-2) )
          T6963C_Box(x_coord-1, y_coord-1, x_coord + 2, y_coord + 2, write_erase);
          break;
        }
      }
    }
  }
}
}

Al iniciar la ejecución del programa se debe realizar en primer lugar la calibración del panel táctil, de tal forma que las coordenadas del panel coincidan con los puntos que se muestran en el GLCD 128x64 (de lo contrario, al presionar un punto en el panel se encenderá un punto del GLCD en otras coordenadas). Para la calibración hay que seguir las instrucciones que se van dando (se recomienda usar un señalador de punta delgada pero redonda, para mejorar la precisión y al mismo tiempo evitar el deterioro de la superficie del panel táctil). A continuación se pueden ver las fotografías del proceso de calibración y algunos ejemplos:

Calibracion

Panel táctil 128x64 - Ej.0

Tocar la esquina inferior izquierda

Panel táctil 128x64 - Ej.1

Tocar la esquina superior derecha

Panel táctil 128x64 - Ej.2

Pantalla lista para dibujar

Ejemplos

Panel táctil 128x64 - Ej.4

Panel táctil 128x64 - Ej.5

Información complementaria