manejo de perifericos para microcontroladore

67
MICROCONTROLADORES II MANEJO DE PERIFÉRICOS MANEJO DE PERIFÉRICOS (DISPLAYS, LCD , TECLADO Y EEPROM) PROF. LUIS ZURITA

Upload: luis-zurita

Post on 30-May-2015

2.778 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Manejo de perifericos para microcontroladore

MICROCONTROLADORES IIMANEJO DE PERIFÉRICOSMANEJO DE PERIFÉRICOS

(DISPLAYS, LCD , TECLADO Y EEPROM)

PROF. LUIS ZURITA

Page 2: Manejo de perifericos para microcontroladore

DISPLAYS

• Existe otra forma de trabajar con los displays 7segmentos sin necesidad de utilizar undecodificador BCD-7segmentos, como losejercicios mostrados en el tema 1 del presentecurso.curso.

• Al igual que en lenguaje ensamblador serequiere el uso de una tabla para que sepueda manipular directamente los 7segmentos con el uso de un puerto.

Prof. Luis Zurita Microcontroladores II

Page 3: Manejo de perifericos para microcontroladore

• En lenguaje C la estructura equivalente a una tabla serepresenta con un arreglo (array) de datos en unformato similar al siguiente:

byte CONST DISPLAY[10] = { 0x3F, 0x06, 0x5b, 0x4f,0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };

DISPLAYS

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á elarray.

Prof. Luis Zurita Microcontroladores II

Page 4: Manejo de perifericos para microcontroladore

• Ahora, ¿Qué son estos valores que se encuentrandentro del array?

• Tomemos el primero= 0x3F, en binario= 00111111

• Observemos el circuito interno de un display cátodocomún:

DISPLAYS

común:a

f

b

g

e

c

d

CATODO COMUNProf. Luis Zurita Microcontroladores II

Page 5: Manejo de perifericos para microcontroladore

• Si colocamos el dato 00111111 a los segmentos a-gdel display observaremos que se formará el dígitocero (0).

• El resto de los códigos que se muestran en el arraycorresponde a los dígitos restantes (1 al 9).

• El programa que se muestra a continuación permite

DISPLAYS

• El programa que se muestra a continuación permiterealizar un conteo de manera automática desde 00hasta 99, mediante el uso de los bucles forestudiados en el tema 1.

• A manera de ejercicio, usted puede modificar elsiguiente programa para que ejecute la cuenta deforma manual.

Prof. Luis Zurita Microcontroladores II

Page 6: Manejo de perifericos para microcontroladore

Ejemplo 1. Realice un contador desde 00 hasta 99 yreinicie su cuenta#include <16f877.h>#use delay(clock=4000000)#use fast_io(B)#use fast_io(C)// Inicialización de variables, todas globalesbyte CONST DISPLAY[10] = { 0x3F, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,

0x07, 0x7f, 0x6f };byte uni=0;byte dec=0;byte dec=0;void mostrar (void) //Función 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 Microcontroladores II

Page 7: Manejo de perifericos para microcontroladore

void main ( void ) // Programa principal{

set_tris_b(0);set_tris_c(0);output_b(0);

for (;;){ // Programa de usuario

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

for (dec=0;dec<10;dec++){for (uni=0;uni<10;uni++){

delay_ms(500);mostrar();

}}

}}

Prof. Luis Zurita Microcontroladores II

Page 8: Manejo de perifericos para microcontroladore

Programa simulado en Proteus

Prof. Luis Zurita Microcontroladores II

Page 9: Manejo de perifericos para microcontroladore

CONTADORES CON DECODIFICADOR

• En el ejercicio anterior se utilizó el uso de arrays(tablas en .asm) para el manejo de los displays 7segmentos. Para el manejo de estos a través dedecodificadores BCD a 7 segmento con los circuitosintegrados 7447 o 7448, se debe implementar unafunción o rutina para tal fin, permitiendo mostrar losfunción o rutina para tal fin, permitiendo mostrar losdatos mediante los decodificadores.

Page 10: Manejo de perifericos para microcontroladore

CONTADORES CON DECODIFICADOR

DATO

(3 cifras)

Centena Decena Unidad

Ingresa= 328

Sale = 8Sale = 2Sale = 3

void bin_bcd(){ // Rutina de conversión de binario a BCDuni=0;uni=0;dec=0;cen=0;copia=conta; //Registro a ser convertidocen=copia/100;copia= copia%100;dec= copia/10;copia= copia%10;uni=copia;

}

Page 11: Manejo de perifericos para microcontroladore

Realizar un contador ascendente – descendente de 0 a 750utilizando un decodificador BCD a 7 segmentos

#include <16F873A.h>#fuses XT,NOWDT,NOLVP#use delay (clock=4000000)#BYTE TRISA=0x85#BYTE PORTA=0x05#BYTE TRISB=0x86#BYTE PORTB=0x06#BYTE TRISC=0x87#BYTE PORTC=0x07#BYTE OPTION_REG=0x81

void bin_bcd(){// Rutina de conversión de binario a BCD

uni=0;dec=0;cen=0;copia=conta; //Registro a ser convertidocen=copia/100;copia= copia%100;dec= copia/10;copia= copia%10;#BYTE OPTION_REG=0x81

int uni;int16 dec;int16 cen;int16 conta;int16 copia;

copia= copia%10;uni=copia;

}void mostrar(){// Función de multiplexación de displays

bin_bcd();bit_set(PORTB,4);bit_set(PORTB,5);bit_set(PORTB,6);delay_ms(5);

Page 12: Manejo de perifericos para microcontroladore

Realizar un contador ascendente – descendente de 0 a 750utilizando un decodificador BCD a 7 segmentosbit_clear(PORTB,4);bit_set(PORTB,5);bit_set(PORTB,6);PORTA=uni;delay_ms(5);bit_set(PORTB,4);bit_clear(PORTB,5);bit_set(PORTB,6);PORTA=dec;delay_ms(5);

while (1){if (bit_test(PORTC,1)==0){ //se pulsó +1?

while (bit_test(PORTC,1)==0){mostrar();} //cerrojo antirrebote

if(conta<750){conta++;}else{conta=0;}delay_ms(5);

bit_set(PORTB,4);bit_set(PORTB,5);bit_clear(PORTB,6);PORTA=cen;delay_ms(5);

}void main ( ) {

bit_clear (OPTION_REG,7);TRISB=0x00;TRISA=0X00;TRISC=0XFF;conta=0;

}}

else if (bit_test(PORTC,0)==0){ //se pulsó -1?while (bit_test(PORTC,0)==0){mostrar();} //cerrojo antirrebote

if(conta<=0){conta=0;}else{conta--;}

}mostrar();

}}

Page 13: Manejo de perifericos para microcontroladore

Realizar un contador ascendente – descendente de 0 a 750utilizando un decodificador BCD a 7 segmentos

Page 14: Manejo de perifericos para microcontroladore

Pantalla LCD

• Las pantallas LCD (Liquid Cristal Display) sirven pararepresentar letras, números y caracteres presentes en elcódigo ASCII.

• En la actualidad las pantallas LCD incorporan internamente unmicrocontrolador (Driver) encargado del manejo de losdiferentes comandos que permiten su escritura y lectura; asícomo facilitar la comunicación con el mundo exterior.como facilitar la comunicación con el mundo exterior.

• Existen diversos fabricantes y modelos, siendo los máscomunes los de 16x2, 20x2 y 20x4, donde el primer númeroindica los caracteres máximos que se pueden escribir en unalínea y el segundo número significa las líneas de las quedispone una pantalla LCD. Por ejemplo 16x2 significa que sepueden escribir 16 caracteres por 2 líneas.

Prof. Luis Zurita Microcontroladores II

Page 15: Manejo de perifericos para microcontroladore

• Una de las pantallas LCD más populares entre lostécnicos e ingenieros es la LCD del tipo HD44780 (Verwww.electronica.com.ve)

• Así como se han estandarizado los segmentos de losdisplays a nivel mundial, en las pantallas LCD, se habuscado unificar los criterios en cuanto a la

Pantalla LCD

buscado unificar los criterios en cuanto a laidentificación de los pines de conexión.

16x220x4

Prof. Luis Zurita Microcontroladores II

Page 16: Manejo de perifericos para microcontroladore

• Siendo estos:1. Vss (Tierra)2. Vcc (Alimentación entre 2.7 a 5.5 v)3. Ajuste de contraste (entre 0 a 5 v)4. RS (selección de registro)5. R/W (Lectura/Escritura)6. E (Enable)7. D0 (Dato menos significativo [LSB])

Pantalla LCD

7. D0 (Dato menos significativo [LSB])8. D19. D210. D311. D412. D513. D614. D7 (Dato más significativo [MSB])15. Ánodo16. Cátodo (estos dos últimos sirven para activar la luz interna de la pantalla

LCD)Prof. Luis Zurita Microcontroladores II

Page 17: Manejo de perifericos para microcontroladore

• Los tres pines de control (RS, R/W y E) permitenseleccionar y habilitar la pantalla LCD con la quese está trabajando, así como escribir (aplicaciónmás típica) en ella.

• Los restantes pines (D0 a D7) sirven para enviar eldato que se desea mostrar y/o el comando quepermitirá desplazar la posición del cursor, borrar

Pantalla LCD

permitirá desplazar la posición del cursor, borrarla pantalla LCD, cambiar de línea y posicióndentro de la misma entre otros.

• Generalmente por ahorro de pines delmicrocontrolador, se trabaja con el bus de datosde 4 bits en la pantalla LCD (Desde D4 hasta D7).

Prof. Luis Zurita Microcontroladores II

Page 18: Manejo de perifericos para microcontroladore

Pantalla LCD con lenguaje C

• El compilador CCS, y en general cualquiercompilador, incorpora un fichero (driver) paramanejar fácilmente una pantalla LCD.

• El archivo es nuestro caso es LCD.c y debellamarse con un #include:llamarse con un #include:

#include LCD.c

• Este archivo tiene varias funciones yadefinidas.

Prof. Luis Zurita Microcontroladores II

Page 19: Manejo de perifericos para microcontroladore

lcd_init ( );Es la primera función que debe ser llamada.Borra la pantalla LCD y lo configura en formato de 4bits, con dos líneas y con caracteres de 5x8 puntos,modo encendido, cursor apagado y sin parpadeo.Configura el LCD con un autoincremento del puntero

Pantalla LCD con lenguaje C

Configura el LCD con un autoincremento del punterode direcciones y sin desplazamiento del display real.

lcd_gotoxy (byte x, byte y);Indica la posición de acceso al LCD. Por ejemplo:lcd_gotoxy (1,2) indica la primera posición de lasegunda línea.

lcd_getc(byte x, byte y);Lee el carácter de la posición (x,y).

Prof. Luis Zurita Microcontroladores II

Page 20: Manejo de perifericos para microcontroladore

lcd_putc (char s);

S es una variable de tipo char. Esta función escribe lavariable en la posición correspondiente. Si además seindica:

\f = se limpia la LCD

\n = el cursor va a la posición (1,2)

Pantalla LCD con lenguaje C

\n = el cursor va a la posición (1,2)

\b = el cursor retrocede una posición.

El compilador de C ofrece una función más práctica paratrabajar con la LCD:

printf (string);

printf (cstring, values…)

printf (fname, cstring, values…)

Prof. Luis Zurita Microcontroladores II

Page 21: Manejo de perifericos para microcontroladore

• Donde string es una cadena o un arreglo(array) de caracteres y values es una lista devariables separadas por comas y fname es unafunción.

• Adicional a esto, el formato a utilizar es %nt,donde n es opcional y puede ser:

Pantalla LCD con lenguaje C

donde n es opcional y puede ser:– 1-9 : para especificar cuántos caracteres se deben

especificar.

– 01-09: para indicar la cantidad de ceros a laizquierda.

– 1.1-9.9 : para coma flotante.

Prof. Luis Zurita Microcontroladores II

Page 22: Manejo de perifericos para microcontroladore

t puede indicar:c Carácters Cadena o carácteru Entero sin signod Entero con signoLu Entero sin signoLd Entero largo con signo

Pantalla LCD con lenguaje C

Ld Entero largo con signox Entero hexadecimal (minúscula)X Entero hexadecimal (mayúscula)Lx Entero largo hexadecimal (minúscula)LX Entero largo hexadecimal (mayúscula)f Flotante con truncadog Flotante con redondeoe Flotante en formato exponencialw Entero sin signo con decimales insertados. La 1ra cifra

indica el total, la 2da el número de decimales.Prof. Luis Zurita Microcontroladores II

Page 23: Manejo de perifericos para microcontroladore

• Veamos algunos ejemplos de los distintosformatos:

Pantalla LCD con lenguaje C

Formato Valor = 0xFE

%03u 254

%u 254

%d -2

%x fe

%X FE

%4X 00FE

%3.1w 25.4Prof. Luis Zurita Microcontroladores II

Page 24: Manejo de perifericos para microcontroladore

• Otros ejemplos de aplicación:

byte x,y,z;

printf (“Micro”)

printf (“Valor=>%2x\n\r” , get_rtcc( ) );

Pantalla LCD con lenguaje C

printf (“Valor=>%2x\n\r” , get_rtcc( ) );

printf (“%2u % X %4X\n\r”, x,y,z);

printf (LCD_PUTC, “n=%u”,n);

Prof. Luis Zurita Microcontroladores II

Page 25: Manejo de perifericos para microcontroladore

• El driver LCD.C trabaja con el Puerto D o el Puerto B. Pordefecto trabaja con el Puerto D.

• Sin embargo podemos modificarlo para que trabaje con elPuerto C (no con el Puerto A ni el Puerto E, por no tener 7 bitsmínimos para manejar la pantalla LCD), mediante lamodificación del fichero LCD.c como se muestra acontinuación en dos partes del mismo:

Pantalla LCD con lenguaje C

continuación en dos partes del mismo:

1

2

Prof. Luis Zurita Microcontroladores II

Page 26: Manejo de perifericos para microcontroladore

• Luego de modificar el fichero podemos elegir entre el puertoC 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")

Pantalla LCD con lenguaje C

#define LCD_DATA_PORT getenv("SFR:PORTC")La cual debe estar colocada antes de declarar el driver de lapantalla LCD.

Ejemplo:#define LCD_DATA_PORT getenv("SFR:PORTC")#include LCD.c

Si la colocamos en orden inverso, trabajará por defecto con elPuerto D.

Prof. Luis Zurita Microcontroladores II

Page 27: Manejo de perifericos para microcontroladore

• Veamos un ejemplo sencillo para el manejo deuna pantalla LCD.

1. Se pide que si un pulsador está en 1, se muestreun mensaje en una pantalla LCD que indique:“PRESIONE TECLA” y muestre en la segundalínea el valor de un registro llamado “Dato1”, asícomo tener activado un led en RC0.

Pantalla LCD con lenguaje C

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í comotener desactivado el led RC0.

3. Dato1 inicia en 0.

Prof. Luis Zurita Microcontroladores II

Page 28: Manejo de perifericos para microcontroladore

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

Ejercicio de pantalla LCD

#include <lcd.c>

int DATO1=0;void main(){

lcd_init( );while (true){

Prof. Luis Zurita Microcontroladores II

Page 29: Manejo de perifericos para microcontroladore

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

Page 30: Manejo de perifericos para microcontroladore

Sin presionar el pulsador

Prof. Luis Zurita Microcontroladores II

Page 31: Manejo de perifericos para microcontroladore

Al presionar el pulsador

Prof. Luis Zurita Microcontroladores II

Page 32: Manejo de perifericos para microcontroladore

• Otro de los periféricos especiales que se utilizan enlos proyectos con microcontroladores es el tecladomatricial.

• Vienen generalmente en dos presentaciones: 3x4 y4x4. Donde el primer número indica las cantidadesde columnas y el segundo las cantidades de filas. Por

Teclado Matricial

de columnas y el segundo las cantidades de filas. Porejemplo 3x4 significa 3 columnas por 4 filas, para untotal de 12 teclas.

Prof. Luis Zurita Microcontroladores II

Page 33: Manejo de perifericos para microcontroladore

• Esta es una conexión típica entre un teclado y unmicrocontrolador:

Teclado Matricial

Prof. Luis Zurita Microcontroladores II

Page 34: Manejo de perifericos para microcontroladore

• Sin embargo si se activan las resistencias pull-ups delpuerto B no se hace necesario la conexión de lasresistencias en el circuito anterior:

port_b_pullups(TRUE);

• Los microcontroladores PICs han dispuesto de unainterrupción por cambio de nivel en cualquiera de los

Teclado Matricial

interrupción por cambio de nivel en cualquiera de lospines RB4 a RB7, lo cual resulta ideal para conectarsecon un teclado matricial, ya que se puede prepararuna función(subrutina) de interrupción por estacausa.

Prof. Luis Zurita Microcontroladores II

Page 35: Manejo de perifericos para microcontroladore

• El compilador de C posee el driver KBD.c paramanejar un teclado 3x4. Las funciones queincorporan son las siguientes:

kbd_init ( )

Inicializa el sistema para manejo del teclado.

Teclado Matricial con lenguaje C

Inicializa el sistema para manejo del teclado.Debe ser la primera función en el programa.

kbd_getc ( )

Devuelve el valor de la tecla pulsada enfunción de la tabla que tiene programada.

Prof. Luis Zurita Microcontroladores II

Page 36: Manejo de perifericos para microcontroladore

• Extracto del fichero KBD.c en donde se muestran losvalores de las teclas:

Teclado Matricial con lenguaje C

• Esta tabla puede ser modificada para adecuar elresultado del programa a las distintas presentacionesdel teclado.

Prof. Luis Zurita Microcontroladores II

Page 37: Manejo de perifericos para microcontroladore

• El archivo KBD.c está pensado para trabajar con el Puerto B oel Puerto D. Basta activar o no la siguiente directiva:

#define use_portb_kbd true o

#define use_portb_kbd false

Teclado Matricial con lenguaje C

Fichero KBD.cMicrocontroladores II

Page 38: Manejo de perifericos para microcontroladore

• Las conexiones vienen dadas en el fichero y sepueden modificar:

Teclado Matricial con lenguaje C

Fichero KBD.c

Prof. Luis Zurita Microcontroladores II

Page 39: Manejo de perifericos para microcontroladore

• Se puede trabajar con la pantalla LCD y el teclado através de puertos separados.

Teclado Matricial con lenguaje C

Prof. Luis Zurita Microcontroladores II

Page 40: Manejo de perifericos para microcontroladore

• Realicemos un ejercicio básico para el manejo delteclado. Introduzca un dato mediante el teclado yvisualícelo 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

Ejercicio 1 de Teclado y LCD.

en la pantalla el mensaje:“TECLA= Nro de la tecla quese presionó”.

• El mensaje inicial será: “PRESIONE TECLA”

• Utilizar el Puerto B para el manejo del teclado y elPuerto D para el manejo de la pantalla LCD.

Prof. Luis Zurita Microcontroladores II

Page 41: Manejo de perifericos para microcontroladore

#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

Ejercicio 1 de Teclado y LCD.

#define use_portb_kbd TRUE // Se define al Puerto B para//manejar el teclado. Por defecto el puerto D manejará la pantalla LCD

#include <lcd.c> // Se incluye el driver para la pantalla LCD

#include <kbd.c> // Se incluye el driver para el teclado 3x4

Prof. Luis Zurita Microcontroladores II

Page 42: Manejo de perifericos para microcontroladore

void main() {

char k; // Se declara k como un dato tipo char o carácterint x;

lcd_init();kbd_init();port_b_pullups(TRUE);lcd_putc("\fPRESIONE TECLA\n"); // Mensaje inicial antes de entrar en buclewhile (TRUE) {

k=kbd_getc();

Ejercicio 1 de Teclado y LCD. Continuación.

k=kbd_getc();x=k-48; // Con esta resta se lleva un dato tipo carácter (ASCII) a

decimal.if(k!=0){if(k=='*') // Si se presiona “*”

lcd_putc("\f TECLA=???"); // muestra este mensajeelse

printf(lcd_putc,"\f TECLA=%u",x); //Caso contrario muestra el valor de la// tecla presionada.

delay_ms(1000);}

}} Microcontroladores II

Page 43: Manejo de perifericos para microcontroladore

• Realicemos un ejercicio de selección de funciones en base ala tecla que se haya presionado. El mensaje inicial será:“PRESIONE FUNCION”.

• Si la tecla presionada es 1: Se activa el led rojo y se muestraen la pantalla LCD: “FUNCION 1”

• Si la tecla presionada es 3: Se activa el led amarillo y semuestra en la pantalla LCD: “FUNCION 2”

• Si la tecla presionada es 5: Se activa el led verde y se

Ejercicio 2 de Teclado y LCD.

• Si la tecla presionada es 5: Se activa el led verde y semuestra en la pantalla LCD: “FUNCION 3”

• Si la tecla presionada es 8: Se activa el led azul y se muestraen la pantalla LCD: “FUNCION 4”

• Si se presiona cualquier otra tecla, los leds se prendensecuencialmente y luego se apagan con un intervalo de 500ms y se muestra en la pantalla LCD: “TODOS OFF”

Prof. Luis Zurita Microcontroladores II

Page 44: Manejo de perifericos para microcontroladore

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

Ejercicio 2 de Teclado y LCD.

#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 Microcontroladores II

Page 45: Manejo de perifericos para microcontroladore

while (TRUE) {k=kbd_getc();

x=k-48; // Con esta resta se lleva//un dato tipo carácter (ASCII) a//decimal.

if (k!=0) {if (x==1)

{OUTPUT_C(0x01);printf(lcd_putc,"\fFUNCION 1");}

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

Ejercicio 2 de Teclado y LCD.

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(0x07);delay_ms(500);OUTPUT_C(0x03);delay_ms(500);OUTPUT_C(0x01);delay_ms(500);OUTPUT_C(0x00);delay_ms(500);}

}}

}

Nota: Tambiénaplica la estructuracase

Prof. Luis Zurita Microcontroladores II

Page 46: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Al iniciar

Prof. Luis Zurita Microcontroladores II

Page 47: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Función 1

Prof. Luis Zurita Microcontroladores II

Page 48: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Función 2

Prof. Luis Zurita Microcontroladores II

Page 49: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Función 3

Prof. Luis Zurita Microcontroladores II

Page 50: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Función 4

Prof. Luis Zurita Microcontroladores II

Page 51: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Función “TODOS OFF”

Prof. Luis Zurita Microcontroladores II

Page 52: Manejo de perifericos para microcontroladore

Ejercicio 2 de Teclado y LCD. Función “TODOS OFF”

Prof. Luis Zurita Microcontroladores II

Page 53: Manejo de perifericos para microcontroladore

• La EEPROM (Electrically Erasable ProgrammableReading Only Memory) o Memoria de Sólo LecturaBorrable Eléctricamente, de un microcontrolador dela familia PIC16F87X varia entre 128 a 256 bytes x 8bits de capacidad, según la siguiente tabla:

Manejo de la EEPROM de un Microcontrolador

EEPROM Data PIC16F873 PIC16F874 PIC16F876 PIC16F877

• Estas permiten almacenar datos de importancia parasu posterior procesamiento y/o comparación, comopor ejemplo valores patrones o claves que se deseanmantener almacenados indefinidamente.

EEPROM DataMemory

PIC16F873 PIC16F874 PIC16F876 PIC16F877

128 128 256 256

Prof. Luis Zurita Microcontroladores II

Page 54: Manejo de perifericos para microcontroladore

• El manejo de la EEPROM resulta muy sencillo dellevar a cabo, pues sus operaciones se reducen aescribir en ella, con una dirección(es) específica(s) oa leer lo que hay en ella, con una dirección(es)específica(s).

• Para leer en la EEPROM se utiliza:

EEPROM con lenguaje C

• Para leer en la EEPROM se utiliza:

read_eeprom( )

Sintáxis: valor= read_eeprom(address,[N]) ó

valor= read_eeprom(address,variable) ó

valor=read_eeprom(address,pointer,N)

Prof. Luis Zurita Microcontroladores II

Page 55: Manejo de perifericos para microcontroladore

Parámetros:• address es un entero de 8 bits y especifica la dirección a leer.• N especifica el número de bytes de la EEPROM a leer. Por defecto si

se omite, se leerá un byte.• Variable es una ubicación especificada para guardar el dato leido de

la EEPROMLa directiva ejecutada devuelve un valor de 8 bits.

Por defecto la función lee una palabra de la EEPROM de la direcciónespecificada. El número de bytes para leer puede definirse

EEPROM con lenguaje C

Por defecto la función lee una palabra de la EEPROM de la direcciónespecificada. El número de bytes para leer puede definirseopcionalmente por el argumento N. Si una variable se usa como unargumento, entonces la EEPROM se lee y los resultados se ponenen la variable hasta que el tamaño 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 dirección dada alindicador.

Ejemplo:#define ULTIMO_VALOR 10valor=read_EEPROM (ULTIMO_VALOR)

Prof. Luis Zurita Microcontroladores II

Page 56: Manejo de perifericos para microcontroladore

• Para escribir en la EEPROM se utiliza:

write_eeprom( )

Sintáxis: write_eeprom(address,value) ó

write_eeprom(address,pointer,N)

Parámetros:

• address es la ubicación de la EEPROM a escribir.

EEPROM con lenguaje C

address es la ubicación de la EEPROM a escribir.

• N especifica el número de bytes de la EEPROM a escribir.

• Value es una constante o variable a escribir en la EEPROM.

Ejemplo:

#define ULTIMO_VALOR 10 //Ubicación en la EEPROM

valor++;

write_eeprom (ULTIMO_VALOR , valor);

Prof. Luis Zurita Microcontroladores II

Page 57: Manejo de perifericos para microcontroladore

Directiva #ROM• Sintaxis: # rom address = {list};• Elementos: address es una palabra de dirección de la ROM,

list es una lista de palabras separadas por las comas .• Propósito: Permite la inserción de datos en el archivo .HEX.

En particular, esto puede usarse para programar los datosde la EEPROM, como es mostrado en el siguiente ejemplo :

EEPROM con lenguaje C

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 posiciones0,1,2,3,4,5,6,7 y 8 de la EEPROM.

Prof. Luis Zurita Microcontroladores II

Page 58: Manejo de perifericos para microcontroladore

• Realizar un programa que escriba en la posición 23 de laEEPROM un dato que se incrementa de uno en uno. Leer laposición 10 y guardar su valor en un registro llamado “copia”.

Ejercicio 1 con la EEPROM

#include <16f877a.h>#use delay (CLOCK = 4000000)#fuses XT,NOWDT,NOPROTECT,NOLVP

void main(void){void main(void){byte dato=10; //define el valor inicial del datobyte copia=0; //define el valor inicial del registro copiabyte direccion=23; //define el valor de la dirección de la EEPROM

while (true){dato++; //dato=dato+1write_eeprom(direccion,dato); // escribe en la dirección el datocopia=read_EEPROM(direccion); // lee la dirección y lo guarda en

copia}

}Prof. Luis Zurita Microcontroladores II

Page 59: Manejo de perifericos para microcontroladore

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

Posición 23 dePosición 23 dela EEPROM sinvalor grabado

Prof. Luis Zurita Microcontroladores II

Page 60: Manejo de perifericos para microcontroladore

Posición 23 de

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

Posición 23 dela EEPROM convalor grabado

Prof. Luis Zurita Microcontroladores II

Page 61: Manejo de perifericos para microcontroladore

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

Registro “copia” con elvalor leído de la EEPROM

Prof. Luis Zurita Microcontroladores II

Page 62: Manejo de perifericos para microcontroladore

• Diseñar un sistema básico para un control deacceso. Mediante un teclado 3x4 introducir unaclave de 4 dígitos. Si la clave es correcta indicarmediante un led verde y abrirse una cerraduraeléctrica por 2 segundos, así como mostrarse enuna pantalla LCD el mensaje “PUERTA ABIERTA”.Si la clave es incorrecta se debe mantener un led

Ejercicio 2 con la EEPROM, TECLADO Y LCD

Si la clave es incorrecta se debe mantener un ledrojo indicando que la puerta también semantiene cerrada, así como mostrarse en unapantalla LCD el mensaje “PUERTA CERRADA”.

• A medida que se vayan presionando las teclas seirá mostrando dicha información en la pantallaLCD.

Prof. Luis Zurita Microcontroladores II

Page 63: Manejo de perifericos para microcontroladore

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

// respectivamente

void main() {

char k;

int i;

char data[4], clave[4];

//Matrices para guardar clave y datos

Ejercicio 2 con la EEPROM, TECLADO Y LCD

#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'}

//Posición 0,1,2 y 3 de la EEPROM

//Con los datos 2,0,1, y 1

//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=onProf. Luis Zurita Microcontroladores II

Page 64: Manejo de perifericos para microcontroladore

while (TRUE) {i=0; //posición de la matriz

printf(lcd_putc,"\fPULSAR TECLA 1\n"); //Primer dato

while(i<=3){ //Para cuatro datosk=kbd_getc(); //Lee el tecladoif (k!=0) //Si se ha pulsado alguna tecla

Ejercicio 2 con la EEPROM, TECLADO Y LCD

if (k!=0) //Si se ha pulsado alguna tecla{data[i]=k; //se guarda en la posición correspondientei++; //de la matrizprintf(lcd_putc,"\fPULSAR TECLA %u\n",i+1); //Siguiente dato

}}

for (i=0;i<=3;i++) { //Pasa datos de eeprom a la matriz claveclave[i]=read_eeprom(i);}

Prof. Luis Zurita Microcontroladores II

Page 65: Manejo de perifericos para microcontroladore

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=offoutput_high(PIN_A0);//Abre la cerradura con pulso al reléoutput_high(PIN_A2);//Led Verde=ondelay_ms(2000);

Ejercicio 2 con la EEPROM, TECLADO Y LCD

delay_ms(2000);output_low(PIN_A0);//Cierra la cerradura con pulso al reléoutput_low(PIN_A2);//Led Verde=offoutput_high(PIN_A1);}//Led Rojo=on

else printf(lcd_putc,"\fPUERTA CERRADA"); //Clave erróneadelay_ms(1000);}

}

Prof. Luis Zurita Microcontroladores II

Page 66: Manejo de perifericos para microcontroladore

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

Prof. Luis Zurita Microcontroladores II

Page 67: Manejo de perifericos para microcontroladore

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

Prof. Luis Zurita Microcontroladores II