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
2. Diagrama de Bloques
PROGRAMA #1:
Registros y Definicion de
Texto
Programa Principal
Rutina de retardos
PROGRAMA #2:
Registros y Definicion de
Texto
Programa Principal
Rutina de retardos
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
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)
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, )
Declaracin de
Texto
Char txt[6]
No
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
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
5. Codificacin
PROGRAMA #1
txt1[]
txt2[]
txt3[]
txt4[]
=
=
=
=
"mikroElektronika";
"EasyPIC5";
"Lcd4bit";
"example";
char i;
// Loop variable
void Move_Delay() {
Delay_ms(500);
}
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);
Lcd_Out(2,6,txt4);
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,txt1);
Lcd_Out(2,5,txt2);
// Clear display
Delay_ms(2000);
while(1) {
// Moving text
// Endless loop
}
}
Simulacin en PROTEUS
PROGRAMA #2
// Reset counter
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;
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
2
3
A
4
5
6
B
7
8
9
C
*
0
#
D
}
if (kp != oldstate) {
previous
cnt = 1;
oldstate = kp;
}
else {
cnt++;
}
if (cnt == 255) {
cnt = 0;
Lcd_Out(2, 10, "
}
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
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.