• No results found

Los display gráficos, son módulos similares a los LCD de caracteres, su particularidad principal es que permiten graficar un mapa de bits de mayor resolución. Estos se pueden adquirir comercialmente en tamaños como: 128x64, 128x128, 240x320, píxeles entre otros. Estos dispositivos de manera similar a los displays de caracteres requieren un protocolo de configuración, y para ello cuentan con un bus de datos y un bus de control. Los LCD gráficos, permiten imprimir fragmentos de líneas, horizontales o verticales armando en conjunto una imagen total. Para fines de estudio y análisis en este capítulo se demostrará el control sobre un LCD gráfico de 128x64 píxeles. La apariencia física y la vista desde el simulador ISIS, se puede apreciar en las siguientes imágenes:

Figura 5-15

Estos dispositivos cuentan con 20 pines de los cuales 8 son el bus de datos, 6 son de control, 2 son de polarización, y 2 son para ajustar el contraste. De la misma forma que el LCD de caracteres para fines de simulación los pines de contraste son ignorados. Sin embargo para fines prácticos los pines de contraste se deben instalar con un potenciómetro como se muestra en la siguiente figura:

Para los ejemplos tratados en este capítulo, se creará un proyecto nuevo en MikroC PRO, con el microcontrolador 16F877A. Este dispositivo es un PIC de 40 pines y 8K bytes de memoria de programa, la cual es suficiente para realizar las primeras practicas con el LCD gráfico. Nuevamente las bondades del compilador MikroC PRO, brindan una librería especializada en el uso y control de este display gráfico. Para esto se cuenta con la librería Glcd, ubicada en la paleta de librerías. Como primera medida para configurar el módulo gráfico, se definen de manera arbitraria los pines por los cuales se conectará el display. Para esto se hace una declaración de bits constantes similar a la que se hace con el LCD de caracteres. En el siguiente ejemplo se puede apreciar está declaración:

// Declaración del puerto con el bus de datos. char GLCD_DataPort at PORTD;

//Declaración de los pines de control. sbit GLCD_CS1 at RB0_bit;

sbit GLCD_CS2 at RB1_bit; sbit GLCD_RS at RB2_bit; sbit GLCD_RW at RB3_bit; sbit GLCD_EN at RB4_bit; sbit GLCD_RST at RB5_bit;

//Declaración de los registros de TRIS de control. sbit GLCD_CS1_Direction at TRISB0_bit;

sbit GLCD_CS2_Direction at TRISB1_bit; sbit GLCD_RS_Direction at TRISB2_bit; sbit GLCD_RW_Direction at TRISB3_bit; sbit GLCD_EN_Direction at TRISB4_bit; sbit GLCD_RST_Direction at TRISB5_bit;

Para inicializar el display se usa la función: Glcd_Init(); después de las configuraciones del PIC dentro de la función main. El paso siguiente es cargar alguna gráfica, para este ejemplo se dibujará en el display la siguiente imagen:

Figura 5-17

La configuración antes citada se debe respetar en las conexiones físicas con el display gráfico. En la creación del circuito electrónico en el simulador ISIS, se implementan los dispositivos: PIC 16F877A, y el módulo gráfico: AMPIRE 128x64. Posteriormente se realizan las conexiones respectivas como se puede apreciar en la siguiente gráfica:

Circuito 5-7

Las imágenes que se desean cargar deben ser editadas con anterioridad en algún editor de imágenes como el Paint de Windows. Estos archivos deben respetar las dimensiones de la pantalla gráfica en este caso de 128x64 píxeles. Por último el archivo debe ser guardado en formato bmp, y color monocromático. Para el ingreso del mapa de bits, se puede usar un herramienta incluida en el MikroC PRO, denominada: GLCD Bitmap Editor, este editor se ejecuta buscando en el menú principal dentro del ítem Tools, y su submenú GLCD Bitmap Editor. Al correr está aplicación se debe tener una vista como la siguiente:

En está aplicación se pica la pestáña: KS0108, y se asegura la selección circular de 128x64 (KS0108). Posteriormente se pulsa el botón Load BMP Picture, y se carga el archivo de imagen

previamente diseñado en el editor de imagen. Seguidamente se selecciona el círculo con la opción

mikroC Code, y se pulsa el botón: Create CODE. Está acción genera el código en lenguaje C,

para agregar al código de programa en el inicio en la parte de la declaración de constantes. Está declaración es un arreglo de tipo: const unsigned char. Para el caso práctico de este ejemplo el resultado es el siguiente:

// --- // GLCD Picture name: Imagen.bmp // GLCD Model: KS0108 128x64

// --- unsigned char const Imagen_bmp[1024] = {

255, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193,241,193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,129,129,129,129,129, 65, 65, 65, 65, 65, 65, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 65, 65, 65, 65, 65, 65, 65,129,129,129, 129, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,255, 255, 0, 0, 0, 0, 16, 48,112,112,240,240,240,240,240,248,254, 255,255,255,254,248,240,240,240,240,240,112,112, 48, 16, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 4, 4, 8, 8, 8, 16, 16, 32, 64, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,129,241,255,255,127,127, 63, 31, 63,127,127,255,255,241,129, 0, 0, 0, 0, 0, 0,192, 32, 16, 12, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,192,192,192,192,192,192,128,128, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64,192,128,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 12, 16, 32,192, 0, 0, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0,240,240,240, 240,240,240,240,240, 0, 0, 1, 3, 0, 0, 0, 0,252, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0,129,255,126, 0, 0,254,254, 0, 0,156,190, 54,118,102,238,204, 0, 0,248,252,182, 54, 54, 188,184, 0, 0,254,254, 12, 6, 6, 6,254,252, 0, 0,248,252, 142, 6, 6,142,252,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,248, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 16, 96,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 1, 1, 0, 0, 0, 3, 3,

0, 0, 1, 3, 3, 3, 3, 3, 1, 0, 0, 0, 1, 3, 3, 3, 1, 0, 0, 0, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 48, 14, 1, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,240,240,255,255,255, 255,255,255,255,255,240,240, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 8, 8, 16, 32, 32, 64, 64,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 64, 64, 32, 32, 16, 8, 8, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 31,255,255, 255,255,255,255, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 30,226, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,131, 159,159,131,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,135,152,136,136,136,132,132,130,130,129,129,129,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,255 };

La declaración anterior contiene codificada la información del mapa de bits cargado en el editor. La vista final del generador debe ser la siguiente:

Después de editar, inicializar, y anexar el mapa de bits en el código fuente se tiene la siguiente fuente total:

// Declaración del puerto con el bus de datos. char GLCD_DataPort at PORTD;

//Declaración de los pines de control. sbit GLCD_CS1 at RB0_bit;

sbit GLCD_CS2 at RB1_bit; sbit GLCD_RS at RB2_bit; sbit GLCD_RW at RB3_bit; sbit GLCD_EN at RB4_bit; sbit GLCD_RST at RB5_bit;

//Declaración de los registros de TRIS de control. sbit GLCD_CS1_Direction at TRISB0_bit;

sbit GLCD_CS2_Direction at TRISB1_bit; sbit GLCD_RS_Direction at TRISB2_bit; sbit GLCD_RW_Direction at TRISB3_bit; sbit GLCD_EN_Direction at TRISB4_bit; sbit GLCD_RST_Direction at TRISB5_bit; unsigned char const Imagen_bmp[1024] = {

255, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 193,241,193, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,129,129,129,129,129, 65, 65, 65, 65, 65, 65, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, 65, 65, 65, 65, 65, 65, 65,129,129,129, 129, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,255, 255, 0, 0, 0, 0, 16, 48,112,112,240,240,240,240,240,248,254, 255,255,255,254,248,240,240,240,240,240,112,112, 48, 16, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 64, 32, 32, 16, 16, 8, 8, 4, 4, 2, 2, 2, 2, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 4, 4, 8, 8, 8, 16, 16, 32, 64, 64,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0,129,241,255,255,127,127, 63, 31, 63,127,127,255,255,241,129, 0, 0, 0, 0, 0, 0,192, 32, 16, 12, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192,192,192,192,192,192,192,128,128, 0, 0, 0,192,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,192, 64,192,128,192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 12, 16, 32,192, 0, 0, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 1, 0,240,240,240, 240,240,240,240,240, 0, 0, 1, 3, 0, 0, 0, 0,252, 3, 0,

0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255, 0, 0, 0, 0, 0,129,255,126, 0, 0,254,254, 0, 0,156,190, 54,118,102,238,204, 0, 0,248,252,182, 54, 54, 188,184, 0, 0,254,254, 12, 6, 6, 6,254,252, 0, 0,248,252, 142, 6, 6,142,252,248, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7,248, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255,255,255, 255,255,255,255,255, 0, 0, 0, 0, 0, 0, 0, 0, 1, 14, 16, 96,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 1, 1, 0, 0, 0, 3, 3, 0, 0, 1, 3, 3, 3, 3, 3, 1, 0, 0, 0, 1, 3, 3, 3, 1, 0, 0, 0, 3, 3, 0, 0, 0, 0, 3, 3, 0, 0, 0, 1, 3, 3, 3, 3, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128, 64, 48, 14, 1, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48,240,240,255,255,255, 255,255,255,255,255,240,240, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 4, 8, 8, 16, 32, 32, 64, 64,128,128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 64, 64, 32, 32, 16, 8, 8, 4, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0,255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 31,255,255, 255,255,255,255, 31, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 30,226, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,128, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16, 16, 16, 16, 8, 8, 8, 8, 4, 4, 4, 2, 2, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,255, 255,128,128,128,128,128,128,128,128,128,128,128,128,128,128,131, 159,159,131,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,135,152,136,136,136,132,132,130,130,129,129,129,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128, 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,255 };

void main( void ) {

Glcd_Init(); //Inicialización del display gráfico. Glcd_Fill(0);//Borra todo el display.

Glcd_Image(Imagen_bmp); //Graficación del mapa de bits. while(1)//Bucle infinito.

{ } }

La función: Glcd_Fill(0);, rellena el contenido de la pantalla con datos binarios iguales a 0, este proceso equivale a borrar toda la pantalla del LCD. Finalizada la creación del código, y compilado el proyecto la simulación en ISIS debe mostrar una vista como la siguiente:

Figura 5-20

La carga de mapas de bits, solo está limitada por el tamaño de las mismas, es decir que se pueden anexar tantas imágenes como la memoria de programa del PIC, soporte. Si se requiere anexar más imágenes y la memoria ya no es suficiente, se debe cambiar el microcontrolador por uno que cuente con mas campo de memoria de programa, por ejemplo el PIC 18F452, este tiene la misma distribución de pines del PIC 16F877A, pero cuenta con una memoria superior y puede procesar su unidad hasta 40MHz, el PIC 16F877A se puede desempeñar hasta 20MHz.

Además de cargar mapas de bits, la librería del MikroC PRO, permite dibujar líneas, círculos, y rectángulos. Por otra parte permite cargar una o más fuentes de texto previamente creadas para la impresión de datos. Lamentablemente, el compilador MikroC PRO, no cuenta con un editor de fuentes para este fin, pero es posible diseñarlas o incluso cargarlas de las fuentes convencionales del sistema operativo Windows. Para lograr este cometido se requiere un editor de fuentes para GLCD, como el software de la siguiente imagen:

Sin embargo la librería del MikroC PRO, contiene las siguientes fuentes de texto predeterminadas:

System3x5, definida como: Font_Glcd_System3x5

FontSystem5x7_v2, definida como: Font_Glcd_System5x7

font5x7, definida como: Font_Glcd_5x7

Character8x7, definida como: Font_Glcd_Character8x7

Estás fuentes, en conjunto con las capacidades de graficación y la importación de mapas de bits hacen de los módulos LCD gráficos, una poderosa herramienta para dar una presentación profesional a los proyectos requeridos por el desarrollador.

Para el siguiente ejemplo se usarán las opciones de graficación por medio de puntos, líneas, círculos, rectángulos, e impresión de textos.

Para hacer la impresión de puntos se implementa la función:

Glcd_Dot( unsigned short x_pos, unsigned short y_pos, unsigned short color );, está función

imprime píxeles, con el color especificado en los parámetros de la función. El parámetro color puede valer: 0 para hacer un píxel de color blanco, 1 para hacer un píxel de color negro, o 2 para invertir el color sobre el píxel dibujado.

Para dibujar líneas se utiliza la función:

Glcd_Line(int x_start, int y_start, int x_end, int y_end, unsigned short color);, está función

contempla como parámetros de entrada las coordenadas de inicio y final así como el parámetro color este puede valer: 0 para hacer la línea de color blanco, 1 para hacer la línea de color negro, o 2 para invertir el color sobre el cual se dibuja la línea.

La impresión de rectángulos se logra con la función:

Glcd_Rectangle(unsigned short x_upper_left, unsigned short y_upper_left, unsigned short x_bottom_right, unsigned short y_bottom_right, unsigned short color);, Está función trabaja de

forma similar a la función de graficación de líneas, la diferencia radica en que las coordenadas ingresadas son los puntos diagonales del rectángulo.

La impresión de rectángulos con relleno es posible por medio de la siguiente función:

Glcd_Box(unsigned short x_upper_left, unsigned short y_upper_left, unsigned short

x_bottom_right, unsigned short y_bottom_right, unsigned short color); Su funcionamiento es

equivalente a la función Glcd_Rectangle, con la diferencia en el parámetro del color que es correspondiente a color de relleno.

La graficación de círculos se realiza por medio de la función:

Glcd_Circle(int x_center, int y_center, int radius, unsigned short color);, está función respeta

las mismas condiciones del parámetro del color de las anteriores funciones, tiene las coordenadas del centro del circulo y el radio del mismo.

Para demostrar el funcionamiento de estás funciones observe y analice el siguiente ejemplo:

void main( void ) {

Glcd_Init(); //Inicialización del display gráfico. Glcd_Fill(0); //Borra el display

Glcd_Set_Font( Font_Glcd_5x7 , 5, 7, 32);// Carga fuente de texto 5x7 delay_ms(500); //Retardo de 500ms

Glcd_Dot(4,4,1); //Se dibuja un píxel en la coordenada (4,4) delay_ms(500); //Retardo de 500ms

Glcd_Line(6,6,30,30,1); //Dibuja una línea de (6,6) a (30,30) delay_ms(500); //Retardo de 500ms

Glcd_Box(40,5,70,35,2);//Rectángulo relleno entre (40,5) y (70,35) delay_ms(500); //Retardo de 500ms

Glcd_Circle(64, 32, 20, 2);// Circulo con centro en (64,32) y radio de 20

Glcd_Write_Text( "Hola mundo!", 3, 7, 1); //Impresión del texto en las coordenadas (3,7) while(1)//Bucle infinito.

{ } }

Lamentablemente los dispositivos LCD gráficos de Proteus tienen una falla de diseño que hace que la simulación no funcione correctamente, este es un problema que se espera que sea corregido en versiones futuras de ISIS. Sin embargo los resultados de la simulación son muy cercanos al comportamiento real del dispositivo de graficación. El resultado en ISIS, sobre la simulación y una vista del comportamiento real sobre el LCD gráfico, se pueden apreciar en las siguientes figuras:

6 Teclados y sistemas de

entrada de datos

La interacción de los microcontrolados requiere de sistemas de entrada para los datos con el usuario. Para este propósito se pueden usar dispositivos como pulsadores, teclados matriciales, o paralelos, e incluso teclados PS2 como los que usan los ordenadores de escritorio. Este capítulo se centra en el estudio de estos dispositivos.