Anda di halaman 1dari 12

Escuela Superior Politcnica del Litoral

Facultad de Ingeniera en Electricidad y Computacin

Laboratorio de Microcontroladores
Prctica #8
Estudiantes:
Mario Barzola Vera
Camilo Escobar Zambrano

Paralelo #1
Grupo #5
Fecha de presentacin:
31/Julio/2013
2013 Primer Trmino

1. Enunciado del Proyecto


Manejo de Displays LCD con y sin teclado utilizando las herramientas de MIKROC y PROTEUS

2. Diagrama de Bloques
PROGRAMA #1:

Registros y Definicion de
Texto

Programa Principal

Rutina de retardos

Salida al display LCD

PROGRAMA #2:

Registros y Definicion de
Texto

Programa Principal

Rutina de retardos

Salida al display LCD

3. Diagrama de Flujo funcional del Programa principal y de las


subrutinas
PROGRAMA #1
PROGRAMA PRINCIPAL
Inicio

TRISB = 0

Funcin:
Lcd_Out (2,6,txt4)

PORTB = 0xFF

Funcin:
Lcd_Out (1,6,txt3)

TRISB = 0xff

Funcin:
Lcd_Cmd (_LCD_CURSOR_OFF)

ANSEL = 0

ANSELH = 0

Funcin:
Lcd_Cmd (_LCD_CLEAR)

Funcin:
Lcd_Init ()

Delay_ms (2000)
Funcin:
Lcd_Cmd (_LCD_CLEAR)

i = i +1

No

Funcin:
Lcd_Out (1,1,txt1)

Funcin:
Lcd_Out (2,5,txt2)

i<16

Delay_ms (2000)

i=0

Lazo WHILE(1)
S

S
Lcd_Cmd (_LCD_SHIFT_RIGHT)
i=0

i<16

Subrutina
Move_Delay ()

No

Subrutina
Move_Delay ()

i = i +1

Lcd_Cmd (_LCD_SHIFT_LEFT)

SUBRUTINA Move_Delay
Inicio

Delay_ms (500)

Continua con el
Programa principal

SUBRUTINA DECLARACIN DE TEXTO


Declaracin del
Texto

Char txt1[] = mikroElektronika


Char txt2[] = EasyPIC5

Char txt3[] = Lcd4bit


Char txt4[] = example

Char i

PROGRAMA #2
PROGRAMA PRINCIPAL

Inicio

cnt = 0

Funcin:
Lcd_Out (1,1,"1")

Funcin:
Lcd_Cmd (_LCD_CURSOR_OFF)

Funcin:
Lcd_Out (1,1,"Key :")

Funcin:
Lcd_Out (2,1,"Times:")

TRISB = 0

PORTB = 0xFF

Funcin:
Lcd_Cmd (_LCD_CLEAR)

TRISB = 0xff

Funcin:
Lcd_Init ()

Lazo Do - While
Principal (Infinito)

kp = 0

ANSEL = 0

Funcin:
Keypad_Init ()

ANSELH = 0

Lazo Do - While
Secundario

S
No

kp = Keypad_Key_Click ()

!kp ?
Delay_ms (100)

Proceso Switch (kp)

Case 1:
kp = 49

Case 1:
kp = 49

Case 2:
kp = 50

Case 2:
kp = 50

Case 3:
kp = 51

Case 3:
kp = 51

Case 4:
kp = 65

Case 4:
kp = 65

Break

Case 5:
kp = 52

Case 5:
kp = 52

Case 6:
kp = 53

Case 6:
kp = 53

Case 7:
kp = 54

Case 7:
kp = 54

Case 8:
kp = 66

Case 8:
kp = 66

cnt =1
oldstate = kp

kp != oldstate
Lcd_Chr (1, 10, kp)

No
cnt++

cnt == 255
cnt = 0
Lcd_Out (2, 10, )

WordToStr (cnt, txt)

Lcd_Out (2, 10, txt)

SUBRUTINA DECLARACIN DE TEXTO

Declaracin de
Texto

Char txt[6]

Char keypadPort at PORTD

No

4. Descripcin del algoritmo o estrategia utilizada


PROGRAMA #1

Programa Principal

Inicio
Crear variables.
Seteo y Enceramiento de Puertos y Registros
Configurar Puertos de Entrada.
Configurar Puertos de Salida.
Inicializacin del Display.
Configuracin de las funciones especiales de LCD.
Ejecucin del Programa Principal.
Esperar por cambios de estados por el inicio de la subrutina de interrupcin.
Ejecucin de Subrutina de Interrupcin.
Establecer las respectivas Salidas en los puertos del PIC, segn lo que se quiera mostrar en la pantalla
LCD.
Fin

Subrutina Move_Delay

Define retardo de 500 ms


Continua con el programa principal

Subrutina declaracin de texto

Define Char txt1[] con mikroelectronica


Define Char txt2[] con easyPIC5
Define Char txt3[] con Lcd4bit
Define Char txt4[] con example
Define iterador Char i

PROGRAMA #2

Programa Principal

Inicio
Crear variables.
Seteo y Enceramiento de Puertos y Registros
Configurar Puertos de Entrada.
Configurar Puertos de Salida.
Inicializacin del Display.
Configuracin de las funciones especiales de LCD.
Ejecucin del Programa Principal.
Esperar por cambios de estados por el inicio de la subrutina de interrupcin.
Ejecucin de Subrutina de Interrupcin.
Establecer las respectivas Salidas en los puertos del PIC, segn lo que se quiera mostrar en la pantalla
LCD.
Fin

Subrutina declaracin de texto

Define Char txt[6]


Asigna a PORTD el manejo del teclado con la funcin keypadPort

5. Codificacin
PROGRAMA #1

Cdigo del Programa


/*
* Nombre del Proyecto:
P6a_t0.c
* Nombre del Autor:
Mario Barzola Vera
Camilo Escobar Zambrano
* Description:
Muestra mensajes txt a travez del LCD y utilizando retardos se muestra
otros
mensajes y se les da movimiento de izquierda a derecha y viceversa
* Test configuration:
MCU:
PIC16F887
Oscillator:
HS, 08.0000 MHz
SW:
mikroC PRO for PIC
* NOTES:
*/
/*Header******************************************************/
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
char
char
char
char

txt1[]
txt2[]
txt3[]
txt4[]

=
=
=
=

"mikroElektronika";
"EasyPIC5";
"Lcd4bit";
"example";

char i;

// Loop variable

void Move_Delay() {
Delay_ms(500);
}

// Function used for text moving


// You can change the moving speed here

void main(){
TRISB = 0;
PORTB = 0xFF;
TRISB = 0xff;
ANSEL = 0;
ANSELH = 0;
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,6,txt3);

// Configure AN pins as digital I/O


// Initialize LCD
// Clear display
// Cursor off
// Write text in first row

Lcd_Out(2,6,txt4);
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);

// Write text in second row

Lcd_Out(1,1,txt1);
Lcd_Out(2,5,txt2);

// Write text in first row


// Write text in second row

// Clear display

Delay_ms(2000);
while(1) {
// Moving text

// Endless loop

for(i=0; i<16; i++) {


Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
for(i=0; i<16; i++) {
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();
}

// Move text to the right 4 times

// Move text to the left 7 times

}
}

Simulacin en PROTEUS

PROGRAMA #2

Cdigo del Programa


/*
* Nombre del Proyecto:
P8b_keyboard.c
* Nombre del Autor:
MARIO BARZOLA
CAMILO ESCOBAR
* Description:
CUENTA EL NUMERO DE VECES QUE SE PRESIONA UNA TECLA
* Test configuration:
MCU:
PIC16F887
Oscillator:
HS, 08.0000 MHz
SW:
mikroC PRO for PIC
* NOTES:
*/
unsigned short kp, cnt, oldstate = 0;
char txt[6];
// Keypad module connections
char keypadPort at PORTD;
// End Keypad module connections
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// End LCD module connections
void main() {
cnt = 0;
TRISB = 0;
PORTB = 0xFF;
TRISB = 0xff;
ANSEL = 0;
ANSELH = 0;
Keypad_Init();
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1, 1, "1");
Lcd_Out(1, 1, "Key :");
Lcd_Out(2, 1, "Times:");
do {
kp = 0;

// Reset counter

// Configure AN pins as digital I/O


// Initialize Keypad
// Initialize Lcd
// Clear display
// Cursor off
// Write message text on Lcd

// Reset key code variable

// Wait for key to be pressed and released


do {
//kp = Keypad_Key_Press();
// Store key code in kp variable

kp = Keypad_Key_Click();
// Store key code in kp variable
delay_ms(100);
}while (!kp);
// Prepare value for output, transform key to it's ASCII value
switch (kp) {
//case 10: kp = 42; break; // '*'
// Uncomment this block for
keypad4x3
//case 11: kp = 48; break; // '0'
//case 12: kp = 35; break; // '#'
//default: kp += 48;
case
keypad4x4
case
case
case
case
case
case
case
case
case
case
case
case
case
case
case

1: kp = 49; break; // 1
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:

kp
kp
kp
kp
kp
kp
kp
kp
kp
kp
kp
kp
kp
kp
kp

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

50;
51;
65;
52;
53;
54;
66;
55;
56;
57;
67;
42;
48;
35;
68;

break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;
break;

//
//
//
//
//
//
//
//
//
//
//
//
//
//
//

// Uncomment this block for

2
3
A
4
5
6
B
7
8
9
C
*
0
#
D

}
if (kp != oldstate) {
previous
cnt = 1;
oldstate = kp;
}
else {
cnt++;
}

// Pressed key differs from

// Pressed key is same as previous

Lcd_Chr(1, 10, kp);

// Print key ASCII value on Lcd

if (cnt == 255) {
cnt = 0;
Lcd_Out(2, 10, "
}

// If counter varialble overflow

WordToStr(cnt, txt);
string
Lcd_Out(2, 10, txt);
} while (1);
}

");
// Transform counter value to
// Display counter value on Lcd

Simulacin en PROTEUS

6. Ejercicios y Preguntas
PROGRAMA #1
Al ejercicio anterior agregue un botn en RD0 y cada vez que se presione el botn se
mostrar en la pantalla LCD cuantas veces ha sido presionado el botn, es decir que
se cuente cuantos pulsos van ingresando por RD0.

PROGRAMA #2
Modifique el programa anterior para que se ingrese 4 caracteres desde el teclado 4x4 y se graben estos
datos en la memoria Eeprom. En la primera lnea de la pantalla LCD se muestra los caracteres en el
mismo orden que ingres el usuario y en la segunda lnea se muestran los caracteres al revs. Por
ejemplo:
1. 1234
2. 4321

Primera lnea en el LCD


Segunda lnea en el LCD

7. Conclusiones

Para controlar un LCD, el lenguaje C tiene sus funciones especiales, las cuales
debern ser llamadas e ingresar su sintaxis segn la definicin de cada una; La
posicin del botn presionado del teclado fue producida gracias a la deteccin de
cambio de estado de las entradas del PORTD utilizadas en este ejercicio, gracias a
este cdigo de 8 bits fue posible trabajar con un teclado de 4x4.
Para el primer programa se obtuvo un tiempo de 2 segundos entre cada cambio de
pares de mensaje, esto se lo obtuvo gracias al retardo Delay de 2000. Adems se
pudo tambin mostrar los tipos de mensajes en el display, gracias a la funcin
Lcd_out, en el cual se especifica la posicin donde iniciar el mensaje y los
caracteres que se deber mostrar en l, as mismo se logr desplazar los mensajes
finales gracias a la funcin Lcd_Cmd. Todas estas funciones debern estar en un lazo
infinito para que funcione, en este caso un lazo DO WHILE.
Para el segundo preograma, se pudo realizar el muestreo de las teclas presionadas
en el keypad de 4x4 gracias a un lazo infito Do-While, el cul dentro de l contena el
comando Switch para la variable kp, con el que el programa verific la posicin de la
tecla que fue presionada y muestra en la pantalla LCD, dicha tecla. La variable kp
almacen la posicin de la tecla presionada gracias a las funciones
KeyPad_Key_Press y KeyPad_Key_Click. El contador se realiz al comparar el
valor anterior de la variable kp por medio de los comando If-Else.

8. Recomendaciones
Revisar el cdigo fuente del programa, ya que se tuvo un inconveniente al ejecutar el
segundo programa en el simulador PROTEUS, debido a que no se haban seteado los
registros ANSEL y ANSELH y por consiguiente no se poda apreciar nada en el display,
estos registros son los que permiten convertir las entradas en entradas y salidas digitales y
de no hacerlo el programa no podra funcionar adecuadamente.
Es necesario cablear muy bien los pines del circuito simulado en PROTEUS, ya que de no
ser as se podra pensar que el cdigo elaborado en el entorno MIKROC esta incorrecto y
por ello no es posible observar los resultados en el simulador, al conectar los dispositivos
procure revisar muy bien las conexiones y sobre todo colocar correctamente los nombres a
cada cable, de esa forma se evita la telaraa de cables y basta solo con colocar unas
cuantas conexiones para que el circuito funcione adecuadamente.
Es prudente revisar la sintaxis de las instrucciones a utilizar en cada uno de los programas
que se vaya a realizar en lenguaje C, ya que cada uno de ellos se define de manera
diferente y los valores a ingresar difieren de unos a otros, normalmente los datos a ingresar
en las instrucciones son valores de registros, variables o direcciones de memoria, y adems
en donde van hacer almacenados dichos valores, en este caso no es necesario utilizar un
registro intermediario como es el registro W ya que el lenguaje C es un lenguaje de alto nivel
en el cual las asignaciones se las realiza de forma directa.

Anda mungkin juga menyukai