manejo de perifericos para microcontroladores

62
MICROCONTROLADORES II MANEJO DE PERIFÉRICOS (DISPLAYS, LCD , TECLADO Y EEPROM) PROF. LUIS ZURITA IUT Cumaná

Upload: jorge-palacio

Post on 26-Jul-2015

134 views

Category:

Documents


3 download

TRANSCRIPT

Page 1: Manejo de Perifericos Para Microcontroladores

MICROCONTROLADORES IIMANEJO DE PERIFÉRICOS

(DISPLAYS, LCD , TECLADO Y EEPROM)

PROF. LUIS ZURITA

IUT Cumaná

Page 2: Manejo de Perifericos Para Microcontroladores

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.

• 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

IUT Cumaná

Page 3: Manejo de Perifericos Para Microcontroladores

• 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 };

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.

DISPLAYS

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 4: Manejo de Perifericos Para Microcontroladores

• 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

a

f

b

g

e

c

d

CATODO COMUNProf. Luis Zurita Microcontroladores II

IUT Cumaná

Page 5: Manejo de Perifericos Para Microcontroladores

• 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 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.

DISPLAYS

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 6: Manejo de Perifericos Para Microcontroladores

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

IUT Cumaná

Page 7: Manejo de Perifericos Para Microcontroladores

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();

}}

}}

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 8: Manejo de Perifericos Para Microcontroladores

Programa simulado en Proteus

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 9: Manejo de Perifericos Para Microcontroladores

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.

• 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

IUT Cumaná

Page 10: Manejo de Perifericos Para Microcontroladores

• 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 laidentificación de los pines de conexión.

Pantalla LCD

16x220x4

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 11: Manejo de Perifericos Para Microcontroladores

• 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])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)

Pantalla LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 12: Manejo de Perifericos Para Microcontroladores

• 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, 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).

Pantalla LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 13: Manejo de Perifericos Para Microcontroladores

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:

#include LCD.c

• Este archivo tiene varias funciones yadefinidas.

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 14: Manejo de Perifericos Para Microcontroladores

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

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 15: Manejo de Perifericos Para Microcontroladores

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)

\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…)

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 16: Manejo de Perifericos Para Microcontroladores

• 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:– 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.

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 17: Manejo de Perifericos Para Microcontroladores

t puede indicar:c Carácters Cadena o carácteru Entero sin signod Entero con signoLu Entero sin signoLd 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.

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 18: Manejo de Perifericos Para Microcontroladores

• 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

IUT Cumaná

Page 19: Manejo de Perifericos Para Microcontroladores

• Otros ejemplos de aplicación:

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

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 20: Manejo de Perifericos Para Microcontroladores

• 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

1

2

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 21: Manejo de Perifericos Para Microcontroladores

• 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")

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.

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 22: Manejo de Perifericos Para Microcontroladores

• 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.

2. Cuando se presione el pulsador (pasa a 0), sepide 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.

Pantalla LCD con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 23: Manejo de Perifericos Para Microcontroladores

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

Ejercicio de pantalla LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 24: Manejo de Perifericos Para Microcontroladores

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

IUT Cumaná

Page 25: Manejo de Perifericos Para Microcontroladores

Sin presionar el pulsador

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 26: Manejo de Perifericos Para Microcontroladores

Al presionar el pulsador

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 27: Manejo de Perifericos Para Microcontroladores

• 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. Porejemplo 3x4 significa 3 columnas por 4 filas, para untotal de 12 teclas.

Teclado Matricial

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 28: Manejo de Perifericos Para Microcontroladores

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

Teclado Matricial

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 29: Manejo de Perifericos Para Microcontroladores

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

• Los microcontroladores PICs han dispuesto de unainterrupció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.

Teclado Matricial

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 30: Manejo de Perifericos Para Microcontroladores

• 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.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.

Teclado Matricial con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 31: Manejo de Perifericos Para Microcontroladores

• 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 carátulas delteclado.

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 32: Manejo de Perifericos Para Microcontroladores

• 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

IUT Cumaná

Page 33: Manejo de Perifericos Para Microcontroladores

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

Teclado Matricial con lenguaje C

Fichero KBD.c

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 34: Manejo de Perifericos Para Microcontroladores

• 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

IUT Cumaná

Page 35: Manejo de Perifericos Para Microcontroladores

• 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 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.

Ejercicio 1 de Teclado y LCD.

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 36: Manejo de Perifericos Para Microcontroladores

#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

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

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

Ejercicio 1 de Teclado y LCD.

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 37: Manejo de Perifericos Para Microcontroladores

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();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);}

}}

Ejercicio 1 de Teclado y LCD. Continuación.

Microcontroladores II

IUT Cumaná

Page 38: Manejo de Perifericos Para Microcontroladores

• 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 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”

Ejercicio 2 de Teclado y LCD.

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 39: Manejo de Perifericos Para Microcontroladores

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

Ejercicio 2 de Teclado y LCD.

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 40: Manejo de Perifericos Para Microcontroladores

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

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

}}

}

Ejercicio 2 de Teclado y LCD.

Nota: Tambiénaplica la estructuracase

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 41: Manejo de Perifericos Para Microcontroladores

Ejercicio 2 de Teclado y LCD. Al iniciar

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 42: Manejo de Perifericos Para Microcontroladores

Ejercicio 2 de Teclado y LCD. Función 1

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 43: Manejo de Perifericos Para Microcontroladores

Ejercicio 2 de Teclado y LCD. Función 2

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 44: Manejo de Perifericos Para Microcontroladores

Ejercicio 2 de Teclado y LCD. Función 3

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 45: Manejo de Perifericos Para Microcontroladores

Ejercicio 2 de Teclado y LCD. Función 4

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 46: Manejo de Perifericos Para Microcontroladores

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 47: Manejo de Perifericos Para Microcontroladores

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 48: Manejo de Perifericos Para Microcontroladores

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

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

Manejo de la EEPROM de un Microcontrolador

EEPROM DataMemory

PIC16F873 PIC16F874 PIC16F876 PIC16F877

128 128 256 256

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 49: Manejo de Perifericos Para Microcontroladores

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

read_eeprom( )

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

valor= read_eeprom(address,variable) ó

valor=read_eeprom(address,pointer,N)

EEPROM con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 50: Manejo de Perifericos Para Microcontroladores

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

EEPROM con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 51: Manejo de Perifericos Para Microcontroladores

• 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.

• 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);

EEPROM con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 52: Manejo de Perifericos Para Microcontroladores

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 :

• Note que este directiva no previene el área de la ROM ausarse.

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.

EEPROM con lenguaje C

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 53: Manejo de Perifericos Para Microcontroladores

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

IUT Cumaná

Page 54: Manejo de Perifericos Para Microcontroladores

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

Posición 23 dela EEPROM sinvalor grabado

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 55: Manejo de Perifericos Para Microcontroladores

Posición 23 dela EEPROM convalor grabado

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 56: Manejo de Perifericos Para Microcontroladores

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

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 57: Manejo de Perifericos Para Microcontroladores

• 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 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.

Ejercicio 2 con la EEPROM, TECLADO Y LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 58: Manejo de Perifericos Para Microcontroladores

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

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

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

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

Ejercicio 2 con la EEPROM, TECLADO Y LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 59: Manejo de Perifericos Para Microcontroladores

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

{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);}

Ejercicio 2 con la EEPROM, TECLADO Y LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 60: Manejo de Perifericos Para Microcontroladores

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

}

Ejercicio 2 con la EEPROM, TECLADO Y LCD

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 61: Manejo de Perifericos Para Microcontroladores

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná

Page 62: Manejo de Perifericos Para Microcontroladores

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

Prof. Luis Zurita Microcontroladores II

IUT Cumaná