Você está na página 1de 3

IMPLEMENTACION Y MANEJO DE PERIFRICOS (DISPLAYS, LCD, TECLADO Y EEPROM)

Anderson Orozco, Andrs pea Universidad de la amazonia Florencia, Caquet


Villegasanderson@hotmail.om andresh-02@hotmail.com

I.

Displays

void mostrar (void) //Funcin o subrutina mostrar { output_c(0x02); output_b(DISPLAY[uni]); delay_ms(50); if (dec==0) output_c(0x03); else output_c(0x01); output_b(DISPLAY[dec]); delay_ms(50);} void main ( void ) // Programa principal { set_tris_b(0); set_tris_c(0); output_b(0); for (;;){ // Programa de usuario for (dec=0;dec<10;dec++){ for (uni=0;uni<10;uni++){ delay_ms(500); mostrar(); } } } }

Al igual que en lenguaje ensamblador se requiere el uso de una tabla para que se pueda manipular directamente los 7 segmentos con el uso de un puerto, en lenguaje C la estructura equivalente a una tabla se representa con un arreglo (array) de datos en un formato similar al siguiente: byte CONST DISPLAY[10] = { 0x3F, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; byte= define que el dato que se extraer del array DISPLAY ser de este tipo. CONST= define que ser un valor constante DISPLAY= es el nombre que el usuario le coloca al array [10]= define la cantidad de elementos que contendr el array. Ahora, Qu son estos valores que se encuentran dentro del array? Tomemos el primero= 0x3F, en binario= 00111111 Observemos el circuito interno de un display ctodo comn:

Fig. 1 Circuito. Si colocamos el dato 00111111 a los segmentos a-g del display observaremos que se formar el dgito cero (0), el resto de los cdigos que se muestran en el array corresponde a los dgitos restantes (1 al 9),el programa que se muestra a continuacin permite realizar un conteo de manera automtica desde 00 hasta 99, mediante el uso de los bucles for. A manera de ejercicio, usted puede modificar el siguiente programa para que ejecute la cuenta de forma manual.

Fig.2 programa simulado en proteus.

II.

Pantalla LCD

1) Ejemplo 1. Realice un contador desde 00 hasta 99 y reinicie su cuenta


#include <16f877.h> #use delay(clock=4000000) #use fast_io(B) #use fast_io(C) // Inicializacin de variables, todas globales byte CONST DISPLAY[10] = { 0x3F, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; byte uni=0; byte dec=0;

Las pantallas LCD (Liquid Cristal Display) sirven para representar letras, nmeros y caracteres presentes en el cdigo ASCII. En la actualidad las pantallas LCD incorporan internamente un microcontrolador (Driver) encargado del manejo de los diferentes comandos que permiten su escritura y lectura; as como facilitar la comunicacin con el mundo exterior. Existen diversos fabricantes y modelos, siendo los ms comunes los de 16x2, 20x2 y 20x4, donde el primer nmero indica los caracteres mximos que se pueden escribir en una lnea y el segundo nmero significa las lneas de las que dispone una pantalla LCD. Por ejemplo 16x2 significa que se pueden escribir 16 caracteres por 2 lneas. Una de las pantallas LCD ms populares entre los tcnicos e ingenieros es la LCD del tipo HD44780 (Verwww.electronica.com.ve) As como se han estandarizado los segmentos de los displays a nivel mundial, en las pantallas LCD, se ha buscado unificar los criterios en cuanto a la identificacin de los pines de conexin.

Fig. 3 LCD 16x2 y 20x4 Siendo estos: 1) Vss (Tierra) 2) Vcc (Alimentacin entre 2.7 a 5.5 v) 3) Ajuste de contraste (entre 0 a 5 v) 4) RS (seleccin de registro) 5) R/W(Lectura/Escritura) 6) E (Enable) 7) D0 (Dato menos significativo [LSB]) 8) D1 9) D2 10) D3 11) D4 12) D5 13) D6 14) D7 (Dato ms significativo [MSB]) 15) nodo 16) Ctodo (estos dos ltimos sirven para activar la luz interna de la pantalla LCD) Los tres pines de control (RS, R/W y E) permiten seleccionar y habilitar la pantalla LCD con la que se est trabajando, as como escribir (aplicacin ms tpica) en ella. Los restantes pines (D0 a D7) sirven para enviar el dato que se desea mostrar y/o el comando que permitir desplazar la posicin del cursor, borrar la pantalla LCD, cambiar de lnea y posicin dentro de la misma entre otros. Generalmente por ahorro de pines del micro controlador, se trabaja con el bus de datos de 4 bits en la pantalla LCD (Desde D4 hasta D7).

f Flotante con truncado g Flotante con redondeo e Flotante en formato exponencial w Entero sin signo con decimales insertados. La 1ra cifra indica el total, la 2da el nmero de decimales. El driver LCD.C trabaja con el Puerto D o el Puerto B. Por defecto trabaja con el Puerto D. Sin embargo podemos modificarlo para que trabaje con el Puerto C (no con el Puerto A ni el Puerto E, por no tener 7 bits mnimos para manejar la pantalla LCD), mediante la modificacin del fichero LCD.c como se muestra a continuacin en dos partes del mismo:

Fig. 4 Ejemplo Luego de modificar el fichero podemos elegir entre el puerto C o D mediante el uso de las directivas: #define use_portc_lcd false #define use_portd_lcd true #include <lcd.c> O mediante el uso de la siguiente directiva: #define LCD_DATA_PORT getenv("SFR:PORTC") La cual debe estar colocada antes de declarar el driver de la pantalla LCD. Ejemplo: #define LCD_DATA_PORT getenv("SFR:PORTC") #include LCD.c Si la colocamos en orden inverso, trabajar por defecto con el Puerto D. Veamos un ejemplo sencillo para el manejo de una pantalla LCD. 1. Se pide que si un pulsador est en 1, se muestre un mensaje en una pantalla LCD que indique: PRESIONE TECLA y muestre en la segunda lnea el valor de un registro llamado Dato1, as como tener activado un led en RC0. 2. Cuando se presione el pulsador (pasa a 0), se pide que se muestre un mensaje que indique PULSADOR EN 0 y muestra el valor del registro Dato1 que se incrementa en uno, as como tener desactivado el led RC0. 3. Dato1 inicia en 0. #include <16F877A.h> #fuses XT,NOWDT,NOPROTECT,PUT #use delay(clock=4000000) #use standard_io(C) #use standard_io(A) #use standard_io(B) #include <lcd.c> int DATO1=0; void main(){ lcd_init( ); while (true){ if (input(PIN_A0)==1){ output_high(PIN_C0); delay_ms(5); lcd_gotoxy(1,1); printf(lcd_putc,"PRESIONE TECLA"); delay_ms(50); lcd_gotoxy(1,2); printf(lcd_putc,"DATO1=%d",DATO1); delay_ms(50); if (input(PIN_A0)==0) { output_low(PIN_C0); lcd_gotoxy(1,1); printf(lcd_putc,"PULSADOR EN 0 "); delay_ms(50); lcd_gotoxy(1,2); DATO1++; printf(lcd_putc,"DATO1=%d",DATO1); delay_ms(50); } } } }

III.

Pantalla LCD con Lenguaje C

El compilador CCS, y en general cualquier compilador, incorpora un fichero (driver) para manejar fcilmente una pantalla LCD. El archivo es nuestro caso es LCD.c y debe llamarse con un #include: #include LCD.c Este archivo tiene varias funciones ya definidas. 1) lcd_init ( ); Es la primera funcin que debe ser llamada. Borra la pantalla LCD y lo configura en formato de 4 bits, con dos lneas y con caracteres de 5x8 puntos, modo encendido, cursor apagado y sin parpadeo. Configura el LCD con un autoincremento del puntero de direcciones y sin desplazamiento del display real. lcd_gotoxy (byte x, byte y); Indica la posicin de acceso al LCD. Por ejemplo: lcd_gotoxy (1,2) indica la primera posicin de la segunda lnea. lcd_getc(byte x, byte y); Lee el carcter de la posicin (x,y). lcd_putc (char s); S es una variable de tipo char. Esta funcin escribe la variable en la posicin correspondiente. Si adems se indica: \f = se limpia la LCD \n= el cursor va a la posicin (1,2) \b= el cursor retrocede una posicin. El compilador de C ofrece una funcin ms prctica para trabajar con la LCD: printf (string); printf (cstring, values) printf (fname, cstring, values)

2) 3) 4)

5) 6) 7)

Donde string es una cadena o un arreglo (array) de caracteres, values es una lista de variables separadas por comas y fname es una funcin. Adicional a esto, el formato a utilizar es %nt, donde n es opcional y puede ser: 1-9 : para especificar cuntos caracteres se deben especificar. 01-09: para indicar la cantidad de ceros a la izquierda. 1.1-9.9 : para coma flotante. t puede indicar: c Carcter s Cadena o carcter u Entero sin signo d Entero con signo Lu Entero sin signo Ld Entero largo con signo x Entero hexadecimal (minscula) X Entero hexadecimal (mayscula) Lx Entero largo hexadecimal (minscula) LX Entero largo hexadecimal (mayscula)

Fig. 5 programa simulado en proteus, Sin presionar el pulsador. Fig. 6 programa simulado en proteus, presionando el pulsador.

IV TECLADO CON LENGUAJE C Se puede trabajar con la pantalla LCD y el teclado a Travs de puertos separados.

EEPROM con lenguaje C El manejo de la EEPROM resulta muy sencillo de llevar a cabo, pues sus operaciones se reducen a escribir en ella, con una direccin(es) especfica(s) o a leer lo que hay en ella, con una direccin(es) especfica(s). Para leer en la EEPROM se utiliza: read_eeprom( ) Sintxis: valor= read_eeprom(address,[N]) valor= read_eeprom(address,variable) valor=read_eeprom(address,pointer,N) //antes de ejecutarse la posicion 23 del EEPROM sin valor

kbd_init ( ) Inicializa el sistema para manejo del teclado. Debe ser la primera funcin en el programa. kbd_getc ( ) Devuelve el valor de la tecla pulsada en Funcin de la tabla que tiene programada. void main() { char k; // Se declara k como un dato tipo char o carcter int x; lcd_init(); kbd_init(); port_b_pullups(TRUE); lcd_putc("\fPRESIONE TECLA\n"); // Mensaje inicial antes de entrar en bucle while (TRUE) { k=kbd_getc(); x=k-48; // Con esta resta se lleva un dato tipo carcter (ASCII) a decimal. if(k!=0){ if(k=='*') // Si se presiona * lcd_putc("\f TECLA=???"); // muestra este mensaje else printf(lcd_putc,"\f TECLA=%u",x); //Caso contrario muestra el valor de la // tecla presionada. delay_ms(1000); } } }

//ahora se guarda un valor (05) en la posicin 23 del EEPROM

//se muestra un registro copia con el valor ledo de la EEPROM

V Manejo de la EEPROM de un Microcontrolador


La EEPROM (Electrically Erasable Programmable Reading Only Memory) o Memoria de Slo Lectura Borrable Elctricamente, de un microcontrolador de la familia PIC16F87X varia entre 128 a 256 bytes x 8 bits de capacidad, segn la siguiente tabla: EEPROM Data Memory

PIC16F873
128

PIC16F874
128

PIC16F876
256

PIC16F877
256

Você também pode gostar