Вы находитесь на странице: 1из 62

IUT Cuman

MICROCONTROLADORES II MANEJO DE PERIFRICOS (DISPLAYS, LCD , TECLADO Y EEPROM)


PROF. LUIS ZURITA

DISPLAYS

IUT Cuman

Existe otra forma de trabajar con los displays 7 segmentos sin necesidad de utilizar un decodificador BCD-7segmentos, como los ejercicios mostrados en el tema 1 del presente curso. 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.

Prof. Luis Zurita

Microcontroladores II

DISPLAYS

IUT Cuman

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.
Prof. Luis Zurita Microcontroladores II

DISPLAYS

IUT Cuman

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: a
f b

g e c d
Prof. Luis Zurita

CATODO COMUN

Microcontroladores II

DISPLAYS

IUT Cuman

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 estudiados en el tema 1. A manera de ejercicio, usted puede modificar el siguiente programa para que ejecute la cuenta de forma manual.
Prof. Luis Zurita Microcontroladores II

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; 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);}
Prof. Luis Zurita

IUT Cuman

Microcontroladores II

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


void main ( void ) { set_tris_b(0); set_tris_c(0); output_b(0); for (;;){ // Programa principal

IUT Cuman

// Programa de usuario

for (dec=0;dec<10;dec++){ for (uni=0;uni<10;uni++){ delay_ms(500); mostrar(); } }

Prof. Luis Zurita

Microcontroladores II

Programa simulado en Proteus

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Pantalla LCD

IUT Cuman

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.
Prof. Luis Zurita Microcontroladores II

Pantalla LCD

IUT Cuman

Una de las pantallas LCD ms populares entre los tcnicos e ingenieros es la LCD del tipo HD44780 (Ver www.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.

16x2
Prof. Luis Zurita

20x4
Microcontroladores II

Pantalla LCD

IUT Cuman

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)
Prof. Luis Zurita Microcontroladores II

Pantalla LCD

IUT Cuman

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 microcontrolador, se trabaja con el bus de datos de 4 bits en la pantalla LCD (Desde D4 hasta D7).
Prof. Luis Zurita Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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.

Prof. Luis Zurita

Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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).
Prof. Luis Zurita Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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)
Prof. Luis Zurita Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

Donde string es una cadena o un arreglo (array) de caracteres y 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.
Prof. Luis Zurita Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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) 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.
Prof. Luis Zurita Microcontroladores II

Pantalla LCD con lenguaje C


Veamos algunos ejemplos de los distintos formatos:
Formato %03u %u %d %x %X %4X %3.1w
Prof. Luis Zurita

IUT Cuman

Valor = 0xFE 254 254 -2 fe FE 00FE 25.4


Microcontroladores II

Pantalla LCD con lenguaje C


Otros ejemplos de aplicacin: byte x,y,z; printf (Micro) printf (Valor=>%2x\n\r , get_rtcc( ) ); printf (%2u % X %4X\n\r, x,y,z); printf (LCD_PUTC, n=%u,n);

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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:
1

Prof. Luis Zurita

Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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.
Prof. Luis Zurita Microcontroladores II

Pantalla LCD con lenguaje C

IUT Cuman

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.
Prof. Luis Zurita Microcontroladores II

Ejercicio de pantalla LCD


#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){

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

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); } } } Prof. Luis Zurita }

IUT Cuman

Microcontroladores II

Sin presionar el pulsador

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Al presionar el pulsador

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Teclado Matricial

IUT Cuman

Otro de los perifricos especiales que se utilizan en los proyectos con microcontroladores es el teclado matricial. Vienen generalmente en dos presentaciones: 3x4 y 4x4. Donde el primer nmero indica las cantidades de columnas y el segundo las cantidades de filas. Por ejemplo 3x4 significa 3 columnas por 4 filas, para un total de 12 teclas.

Prof. Luis Zurita

Microcontroladores II

Teclado Matricial
Esta es una conexin tpica entre un teclado y un microcontrolador:

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Teclado Matricial

IUT Cuman

Sin embargo si se activan las resistencias pull-ups del puerto B no se hace necesario la conexin de las resistencias en el circuito anterior. Los microcontroladores PICs han dispuesto de una interrupcin por cambio de nivel en cualquiera de los pines RB4 a RB7, lo cual resulta ideal para conectarse con un teclado matricial, ya que se puede preparar una funcin(subrutina) de interrupcin por esta causa.

Prof. Luis Zurita

Microcontroladores II

Teclado Matricial con lenguaje C

IUT Cuman

El compilador de C posee el driver KBD.c para manejar un teclado 3x4. Las funciones que incorporan son las siguientes: 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.
Prof. Luis Zurita Microcontroladores II

Teclado Matricial con lenguaje C


Extracto del fichero KBD.c en donde se muestran los valores de las teclas:

IUT Cuman

Esta tabla puede ser modificada para adecuar el resultado del programa a las distintas cartulas del teclado.

Prof. Luis Zurita

Microcontroladores II

Teclado Matricial con lenguaje C

IUT Cuman

El archivo KBD.c est pensado para trabajar con el Puerto B o el Puerto D. Basta activar o no la siguiente directiva: #define use_portb_kbd true o #define use_portb_kbd false

Fichero KBD.c
Microcontroladores II

Teclado Matricial con lenguaje C

IUT Cuman

Las conexiones vienen dadas en el fichero y se pueden modificar:


Fichero KBD.c

Prof. Luis Zurita

Microcontroladores II

Teclado Matricial con lenguaje C


Se puede trabajar con la pantalla LCD y el teclado a travs de puertos separados.

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 1 de Teclado y LCD.

IUT Cuman

Realicemos un ejercicio bsico para el manejo del teclado. Introduzca un dato mediante el teclado y visualcelo en una pantalla LCD. Si se presiona * aparecer en la pantalla el mensaje: TECLA=??? Para cualquier otra tecla que se presione aparecer en la pantalla el mensaje:TECLA= Nro de la tecla que se presion. El mensaje inicial ser: PRESIONE TECLA Utilizar el Puerto B para el manejo del teclado y el Puerto D para el manejo de la pantalla LCD.

Prof. Luis Zurita

Microcontroladores II

Ejercicio 1 de Teclado y LCD.


#include <16f877a.h> #use delay (CLOCK = 4000000) #fuses XT,NOWDT,NOPROTECT,NOLVP #use standard_io(b) #use standard_io(d) #define use_portb_kbd TRUE // Se define al Puerto B para
//manejar el teclado. Por defecto el puerto D manejar la pantalla LCD

IUT Cuman

#include <lcd.c> #include <kbd.c>

// Se incluye el driver para la pantalla LCD // Se incluye el driver para el teclado 3x4

Prof. Luis Zurita

Microcontroladores II

Ejercicio 1 de Teclado y LCD. Continuacin.


void main() {

IUT Cuman

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); } } Microcontroladores II }

Ejercicio 2 de Teclado y LCD.

IUT Cuman

Realicemos un ejercicio de seleccin de funciones en base a la tecla que se haya presionado. El mensaje inicial ser: PRESIONE FUNCION. Si la tecla presionada es 1: Se activa el led rojo y se muestra en la pantalla LCD: FUNCION 1 Si la tecla presionada es 3: Se activa el led amarillo y se muestra en la pantalla LCD: FUNCION 2 Si la tecla presionada es 5: Se activa el led verde y se muestra en la pantalla LCD: FUNCION 3 Si la tecla presionada es 8: Se activa el led azul y se muestra en la pantalla LCD: FUNCION 4 Si se presiona cualquier otra tecla, los leds se prenden secuencialmente y luego se apagan con un intervalo de 500 ms y se muestra en la pantalla LCD: TODOS OFF

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD.


#include <16f877a.h> #use delay (CLOCK = 4000000) #fuses XT,NOWDT,NOPROTECT,NOLVP #use standard_io(b) #use standard_io(d) #use fast_io(c) #define use_portb_kbd TRUE #define use_portd_lcd TRUE #include <lcd.c> #include <kbd.c> void main() { set_tris_c(0x00); char k; int x; lcd_init(); kbd_init(); port_b_pullups(TRUE); printf(lcd_putc,"\fPRESIONE FUNCION"); OUTPUT_C(0x00);
Prof. Luis Zurita

IUT Cuman

Microcontroladores II

Ejercicio 2 de Teclado y LCD.


while (TRUE) { k=kbd_getc(); x=k-48; if (k!=0) { if (x==1) {OUTPUT_C(0x01); printf(lcd_putc,"\fFUNCION 1");} else if (x==3) {OUTPUT_C(0x02); printf(lcd_putc,"\fFUNCION 2");} else if (x==5) {OUTPUT_C(0x04); printf(lcd_putc,"\fFUNCION 3");} else if (x==8) {OUTPUT_C(0x08); printf(lcd_putc,"\fFUNCION 4");} else {printf(lcd_putc,"\fTODOS OFF"); OUTPUT_C(0x01);
Prof. Luis Zurita

IUT Cuman

delay_ms(500); OUTPUT_C(0x03); delay_ms(500); OUTPUT_C(0x07); delay_ms(500); OUTPUT_C(0x0f); delay_ms(500); OUTPUT_C(0x07); delay_ms(500); OUTPUT_C(0x03); delay_ms(500); OUTPUT_C(0x01); delay_ms(500); OUTPUT_C(0x00); delay_ms(500); }

Nota: Tambin aplica la estructura case


Microcontroladores II

Ejercicio 2 de Teclado y LCD. Al iniciar

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD. Funcin 1

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD. Funcin 2

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD. Funcin 3

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD. Funcin 4

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD. Funcin TODOS OFF

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 de Teclado y LCD. Funcin TODOS OFF

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Manejo de la EEPROM de un Microcontrolador

IUT Cuman

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 PIC16F876 PIC16F877 128 256 256

Estas permiten almacenar datos de importancia para su posterior procesamiento y/o comparacin, como por ejemplo valores patrones o claves que se desean mantener almacenados indefinidamente.
Prof. Luis Zurita Microcontroladores II

EEPROM con lenguaje C

IUT Cuman

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)
Prof. Luis Zurita Microcontroladores II

EEPROM con lenguaje C

IUT Cuman

Parmetros: address es un entero de 8 bits y especifica la direccin a leer. N especifica el nmero de bytes de la EEPROM a leer. Por defecto si se omite, se leer un byte. Variable es una ubicacin especificada para guardar el dato leido de la EEPROM La directiva ejecutada devuelve un valor de 8 bits. Por defecto la funcin lee una palabra de la EEPROM de la direccin especificada. El nmero de bytes para leer puede definirse opcionalmente por el argumento N. Si una variable se usa como un argumento, entonces la EEPROM se lee y los resultados se ponen en la variable hasta que el tamao de los datos de la variable est lleno. Finalmente, si un indicador se usa como un argumento, entonces se leen los n bytes de la EEPROM a la direccin dada al indicador. Ejemplo: #define ULTIMO_VALOR 10 valor=read_EEPROM (ULTIMO_VALOR)
Prof. Luis Zurita Microcontroladores II

EEPROM con lenguaje C


Para escribir en la EEPROM se utiliza: write_eeprom( ) Sintxis: write_eeprom(address,value) write_eeprom(address,pointer,N) Parmetros: address es la ubicacin de la EEPROM a escribir. N especifica el nmero de bytes de la EEPROM a escribir. Value es una constante o variable a escribir en la EEPROM. Ejemplo: #define ULTIMO_VALOR 10 //Ubicacin en la EEPROM valor++; write_eeprom (ULTIMO_VALOR , valor);
Prof. Luis Zurita

IUT Cuman

Microcontroladores II

EEPROM con lenguaje C

IUT Cuman

Directiva #ROM Sintaxis: # rom address = {list}; Elementos: address es una palabra de direccin de la ROM, list es una lista de palabras separadas por las comas . Propsito: Permite la insercin de datos en el archivo .HEX. En particular, esto puede usarse para programar los datos de la EEPROM, como es mostrado en el siguiente ejemplo : Note que este directiva no previene el rea de la ROM a usarse. La directiva #ORG sirve para reservar posiciones de la ROM. Ejemplo: #rom 0x2100={1,2,3,4,5,6,7,8} Asigna los valores que se encuentran dentro de los corchetes {}, a las posiciones 0,1,2,3,4,5,6,7 y 8 de la EEPROM.
Prof. Luis Zurita Microcontroladores II

Ejercicio 1 con la EEPROM

IUT Cuman

Realizar un programa que escriba en la posicin 23 de la EEPROM un dato que se incrementa de uno en uno. Leer la posicin 10 y guardar su valor en un registro llamado copia.
#include <16f877a.h> #use delay (CLOCK = 4000000) #fuses XT,NOWDT,NOPROTECT,NOLVP void main(void){ byte dato=10; //define el valor inicial del dato byte copia=0; //define el valor inicial del registro copia byte direccion=23; //define el valor de la direccin de la EEPROM while (true){ dato++; //dato=dato+1 write_eeprom(direccion,dato); // escribe en la direccin el dato copia=read_EEPROM(direccion); // lee la direccin y lo guarda en }
Microcontroladores II

copia }
Prof. Luis Zurita

Ejercicio 1 con la EEPROM. Antes de ejecutarse la escritura.

IUT Cuman

Posicin 23 de la EEPROM sin valor grabado

Prof. Luis Zurita

Microcontroladores II

Ejercicio 1 con la EEPROM. Luego de ejecutarse la escritura.

IUT Cuman

Posicin 23 de la EEPROM con valor grabado

Prof. Luis Zurita

Microcontroladores II

Ejercicio 1 con la EEPROM. Luego de ejecutarse la lectura.

IUT Cuman

Registro copia con el valor ledo de la EEPROM


Prof. Luis Zurita Microcontroladores II

Ejercicio 2 con la EEPROM, TECLADO Y LCD

IUT Cuman

Disear un sistema bsico para un control de acceso. Mediante un teclado 3x4 introducir una clave de 4 dgitos. Si la clave es correcta indicar mediante un led verde y abrirse una cerradura elctrica por 2 segundos, as como mostrarse en una pantalla LCD el mensaje PUERTA ABIERTA. Si la clave es incorrecta se debe mantener un led rojo indicando que la puerta tambin se mantiene cerrada, as como mostrarse en una pantalla LCD el mensaje PUERTA CERRADA. A medida que se vayan presionando las teclas se ir mostrando dicha informacin en la pantalla LCD.
Prof. Luis Zurita Microcontroladores II

Ejercicio 2 con la EEPROM, TECLADO Y LCD


#include <16f877a.h> #use delay (CLOCK = 4000000) #fuses XT,NOWDT,NOPROTECT,NOLVP #use standard_io(a) #use standard_io(b) #use standard_io(d) #use fast_io(c) #define use_portb_kbd TRUE #define use_portd_lcd TRUE #include <lcd.c> #include <kbd.c> #include <stdlib.h> #rom 0x2100={'2','0','1','1'} //Posicin 0,1,2 y 3 de la EEPROM //Con los datos 2,0,1, y 1
Prof. Luis Zurita

IUT Cuman

// respectivamente void main() { char k; int i; char data[4], clave[4]; //Matrices para guardar clave y datos lcd_init(); kbd_init(); port_b_pullups(TRUE); output_low(PIN_A0); output_low(PIN_A2); //Led verde=off output_high(PIN_A1); //Led rojo=on

Microcontroladores II

Ejercicio 2 con la EEPROM, TECLADO Y LCD


while (TRUE) { i=0; //posicin de la matriz printf(lcd_putc,"\fPULSAR TECLA 1\n"); //Primer dato while(i<=3){ //Para cuatro datos k=kbd_getc(); //Lee el teclado if (k!=0) //Si se ha pulsado alguna tecla {data[i]=k; //se guarda en la posicin correspondiente i++; //de la matriz printf(lcd_putc,"\fPULSAR TECLA %u\n",i+1); //Siguiente dato } for (i=0;i<=3;i++) { //Pasa datos de eeprom a la matriz clave clave[i]=read_eeprom(i);}

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 con la EEPROM, TECLADO Y LCD


if ((data[0]==clave[0])&&(data[1]==clave[1])&&(data[2]==clave[2])&&(data[3]==clave[3])) //compara digito a digito los valores almacenados en la EEPROM y la clave // introducida { printf(lcd_putc,"\fPUERTA ABIERTA"); //Compara los datos con la clave output_low(PIN_A1); //Led Rojo=off output_high(PIN_A0);//Abre la cerradura con pulso al rel output_high(PIN_A2);//Led Verde=on delay_ms(2000); output_low(PIN_A0);//Cierra la cerradura con pulso al rel output_low(PIN_A2);//Led Verde=off output_high(PIN_A1);}//Led Rojo=on else printf(lcd_putc,"\fPUERTA CERRADA"); //Clave errnea delay_ms(1000); } }

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 con la EEPROM, TECLADO Y LCD Luego de presionar una clave errada

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Ejercicio 2 con la EEPROM, TECLADO Y LCD Luego de presionar la clave correcta

IUT Cuman

Prof. Luis Zurita

Microcontroladores II

Вам также может понравиться