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

1.

Enunciado del proyecto



Usar las tcnicas vistas en la materia para comunicacin serial, entre otras para
mostrar contador controlado en LCD .

2. Diagrama de bloques













Descripcin y objetivo

Se mostrar un men por pantalla mediante la comunicacin serial, donde se pedir
el ingreso de un nmero entre cero y cien, luego del cual se desplegar un men con
las siguientes opciones: A. Ascendente, B. Descendente, C. Pausa, D. Continuar,
todo esto tiene como objetivo concatenar las tcnicas aprendidas a lo largo del
curso, mostrando as las habilidades adquiridas.
















Microcontrolador

PIC16F887
Salidas
Leds,
Displays

3. Diagrama de flujo y algoritmo

INICIO
VARIABLES Y
SETEO DE
PUERTOS
INICIALIZACION
DE LIBRERIAS A
USAR
MENU
NUMERO
ASCENDER
MOSTRAR
EN LCD
RESET
NO
OPCIONES
DESCENDER
NO NO
MOSTRAR NUMERO
EN PUERTO A
PORTA=0
SI SI
CONTAR
ASCENDER
CONTEO
ASCENDENTE
SI 0NUMNUMERO
NO
DESCENDER NO
CONTEO
DESCENDENTE
SI
0NUMNUMERO
NO
PAUSA
NO
0NUMNUMERO NO
NO
SI
decena
NO
BARRIDO DE
LEDS DEL
PUERTO A
SI
SI
PAUSAR CONTEO SI ASCENDER CONTINUAR SI
SI
NO
DESCENDER
NO
CONTINUAR SI
SI
CONTINUAR NO
NO
NO
MOSTRAR
NOMBRE
CONTAR






Algoritmo

a) Iniciamos declarando las diferentes variables, seteando puertos que vamos a usar as
como tambin inicializando los mdulos para uso del teclado, comunicacin serial,
asi como los del juso para LCD.
b) De entrada mostramos el nombre del autor del proyecto en el LCD.
c) Mostramos mediante comunicacin serial un mensaje de ingreso de un dato entre 0
y 99, el cual una vez ingresado se va a mostrar por leds en el puerto A.
d) Luego se mostrar un men con las opciones ya mencionadas en la descripcin.
e) Si se elige la opcin ascendente, el contador va a ir contando desde cero hasta el
nmero ingresado si en cambio elige descendente va a empezar a contar desde el
nmero ingresado hasta cero, as como tambin mostrando por LCD el conteo y
verificando que el nmero est entre cero y el nmero ingresado.
f) Llegado el conteo a cada decena se har barridos de leds, que son en total cuatro
barridos, donde cada barrido se lo cuenta desde que empieza y llega al led menos
significativo.
g) Si durante el conteo se elige la opcin pausa, se detendr el conteo hasta que se elija
la opcin continuar, en el mismo estado de pausa se podr elegir el conteo, as como
tambin se lo podr elegir mientras se est contando, todo esto se lo podr apreciar
en el LCD.
h) Cuando se complete el conteo ya sea el ascendente o el descendente, el programa
volver al men principal para pedir de nuevo un nmero.

4. Lenguaje ensamblador

char keypadPort at PORTD;
// 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 nombre[] = "Juan Andres";
char txt[6]="";
void main()
{
int b=0, control=0;
unsigned short i=0, z=0,x=0, y=0, unidad=0, decena=0, kp, total;
char text;
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;

Keypad_Init();

TRISA=0;
PORTA=0;
TRISE=0;
TRISC=0; // Initialize Keypad
PORTC=0;
INTCON=0;
Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,4,nombre); // Write text in first row

do {
UART1_Init(9600);
Delay_ms(100);
UART1_Write(13);
UART1_Write_Text("Proyecto 2do parcial");
UART1_Write(13);
UART1_Write_Text("Contador controlado");
UART1_Write(13);
UART1_Write_Text("Ingrese numero entre 0 y 99");
UART1_Write(13);
UART1_Write_Text("Numero: ");
kp = 0; // Reset key code variable

do
{
kp = Keypad_Key_Click(); // Store key code in kp variable
switch (kp) {
case 1 : x= 1, text='1'; break;
case 2 : x= 2, text='2'; break;
case 3 : x= 3, text='3'; break;
case 5 : x= 4, text='4'; break;
case 6 : x= 5, text='5'; break;
case 7 : x= 6, text='6'; break;
case 9 : x= 7, text='7'; break;
case 10: x= 8, text='8'; break;
case 11: x= 9, text='9'; break;
case 14: x= 0, text='0'; break;
}
}
while (!kp || kp==4 || kp==8 || kp==12 || kp==16 || kp==13 || kp==15);

decena= x;
UART1_Write(text);
do
{
kp = Keypad_Key_Click(); // Store key code in kp variable
switch (kp) {
case 1 : y= 1, text='1'; break;
case 2 : y= 2, text='2'; break;
case 3 : y= 3, text='3'; break;
case 5 : y= 4, text='4'; break;
case 6 : y= 5, text='5'; break;
case 7 : y= 6, text='6'; break;
case 9 : y= 7, text='7'; break;
case 10: y= 8, text='8'; break;
case 11: y= 9, text='9'; break;
case 14: y= 0, text='0';break;
}
}
while (!kp || kp==4 || kp==8 || kp==12 || kp==16 || kp==13 || kp==15);

unidad= y;
UART1_Write(text);
UART1_Write(13);
total=(decena*10)+unidad;
PORTA=total;
UART1_Write_Text("Opciones:");
UART1_Write(13);
UART1_Write_Text("A. Ascendente");
UART1_Write(13);
UART1_Write_Text("B. Descendente");
UART1_Write(13);
UART1_Write_Text("C. Pausa");
UART1_Write(13);
UART1_Write_Text("D. Continuar");
UART1_Write(13);
while(Kp!=4 && Kp!=8)
{
kp = Keypad_Key_Press();
} /*kp=4 ascendente, kp=8 descendente*/
PORTA=0;
control=kp;
if(control==4)
{
i=0;
}
else
{
i=total;
}
Lcd_Cmd(_LCD_CLEAR); // Clear display
while (i >= 0 && i<=total)
{
kp= Keypad_Key_Press();
z = i % 10u;
WordToStr(i, txt); // Transform counter value to string
Delay_ms(1000);
Lcd_Out(2, 5, txt); // Display counter value on Lcd
if(kp==4 || kp==8)
{
control=kp;
}
if(kp==12)/*kp=12, pausa*/
{
while(kp!=16) /*kp distinto de continuar me quedo en el lazo*/
{
kp= Keypad_Key_Press();
if(kp==4 || kp==8) /*mientras estoy en pausa puedo decidir conteo*/
{
control=kp;
}
}
}

if (z==0)
{
for(b=0; b<4; b++)
{ //BARRIDO DEL PRIMERO AL ULTIMO LED//
PORTA=1; //1ER LED
delay_ms(100);
PORTA=2; //2DO LED
delay_ms(100);
PORTA=4; //3ER LED
delay_ms(100);
PORTA=8; //4TO LED
delay_ms(100);
PORTA=16; //5TO LED
delay_ms(100);
PORTA=32; //6TO LED
delay_ms(100);
PORTA=64; //7MO LED
delay_ms(100);
PORTA=128; //8VO LED
delay_ms(100);
//BARRIDO DEL ULTIMO AL PRIMER LED//
PORTA=64; //7MO LED
delay_ms(100);
PORTA=32; //6TO LED
delay_ms(100);
PORTA=16; //5TO LED
delay_ms(100);
PORTA=8; //4TO LED
delay_ms(100);
PORTA=4; //3ER LED
delay_ms(100);
PORTA=2; //2DO LED
delay_ms(100);
PORTA=1; //1ER LED
delay_ms(100);
} PORTA=0;
}
if(control==4)
{
i++;
}
else
{
i--;
}
}
} while (1);
}
5. Simulacin en Proteus


Mostrando nombre y men


Seleccionando contador descendente

Observando el barrido de leds



Conclusiones

- Mediante el proyecto se pudo familiarizar con el software, el algoritmo y
diagrama de bloques para resolver el problema, el cual consisti en usar las
herramientas adquiridas en el transcurso del semestre. El tipo de programacin
me parece algo buena ya que se puede comprender mejor el cdigo.

- Fue interesante la unin de todos los conocimientos en este trabajo ya que
tambin se pudo aprender an mas al igual que aplicar las herramientas que nos
permite el software que son de mucha utilidad y tambin un poco sencillas de
manejar.

- Finalmente en la simulacin en proteus se pudo observar como se haca la
comunicacin la cual funcionaba de acuerdo al cdigo hecho en el lenguaje C,
as mismo se pudo observar la interaccin de puertos, aunque la simulacin no
estaba en tiempo real ya que presentaba mucha carga.

Recomendaciones o sugerencias

- Seguir haciendo ejemplos con aplicaciones que hayan tenido impacto en la
tecnologa que hoy vivimos.
- Hacer conocimiento de otros compiladores sencillos para pics, que s los hay.






























1. ENUNCIADO DEL PROYECTO



En este proyecto utilizaremos la comunicacin USART entre el PIC y la PC
para manejar un juego llamado la Ruleta de casino. Este consiste en generar
nmeros aleatorios del 0-10 y pedirle al usuario que ingrese un nmero
previamente apostando un cantidad de dinero que esta entre 20-50-100.



2. DIAGRAMA DE BLOQUES


























3. DIAGRAMA DE FLUJO FUNCIONAL DEL PROGRAMA
PRINCIPAL (NIVEL ALTO).




SALIDA
c

PC

PUERTOS

START
Se configura el
puerto B para el
manejo del LCD
Se declara todas
las variables y
nombres de la
funciones a
utilizar
Se inicializa el
teclado
Se configura los
puertos como I/
0 digitales
Se inicializa la
comunicacin
UART
Se inicializa el
LCD y se limpia
pantalla y se
apaga el cursor
Se muestra los
mensajes de
presentacin
por medio del
UART como por
el LCD
Se llena el
arreglo de los
nmeros
aleatorios y se
los mezclan
Se llama a la
funcin
Inicio_Ruleta
para
inicialmente
muestre el
mensaje de las
apuestas
Con las
apuestas
seleccionadas
se le pide al
usuario que
ingrese un
nmero
Comparar
nmeros
No Si
Se muestra un
mensaje al
usuario que el
gan y adems
lo que obtuvo
en dinero
incrementadose
la variable que
contabiliza los
aciertos
Se enva un mensaje
al usuario que
perdi y se le
reduce el dinero
que tenia apostado.
FIN
MOSTRANDO
UN MENSAJE

4. DIAGRAMA DE FLUJO DE CADA UNA DE LAS SUBRUTINAS
EMPLEADAS.

SUBRUTIN
A1
INICIO_RULETA
Esta funcin recibe
como parmetros el
arreglo de los
nmeros aleatorios
Imprime el
mensaje de las
apuestas va
UART
Lee el teclado
para revisar
cuanto dinero
apuesto.
Luego se imprime el
mensaje de ingresar
numero.
tecla
Si
No
Se imprime el
mensaje de que
acert en el nmero
y el valor actual de
la apuesta.
Se imprime el
mensaje que no
acerto y el valor
actual de la apuesta
AL final se muestra
le mensaje de
terminado y regresa
nuevamente al main
donde reinicie

SUBRUTINA2


5. DESCRIPCIN DEL ALGORITMO O ESTRATEGIA
UTILIZADO.

Primero configura el puerto B para conectar el LCD.
Se configura el puerto d para manejar el teclado.
Se configura los puertos como I/O digitales.
Se inicializa al puerto D como el LCD y el UART con 19200 bps.
Se ingresa el lazo infinito donde mostrar el mensaje de bienvenidos
adems se llenar el arreglo de nmeros aleatorio.
Luego se llama a la funcin inicio_ruleta()
Se imprime los mensajes para la apuesta.
En esta funcin se le asigna a la variable dinero el valor de las
apuestas propuestas.
Se muestra el mensaje de ingresar nmero:
Se lee el teclado para comparar de la funcin teclado que tecla se
presion por el usuario para mostrar posteriormente los mensajes
Ganaste o perdiste.





6. LISTADO DEL PROGRAMA FUENTE EN LENGUAJE
ENSAMBLADOR CON COMENTARIOS EN LAS LNEAS DE
CDIGO QUE CONSIDERE FUNDAMENTALES.

TECLADO
Lee el teclado
completamente
y si encuentra
alguna
coincidencia
con los valores
del switch.
Retorna donde
se la llamo
/*Ruleta De casino
Grupo#2
*/
// 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

int numeros[10];
int i,j, cnt;
char keypadPort at PORTD;
unsigned int kp=0, tmp=0,tmp1=0;
void Inicio_Ruleta(int numeros[]);
char num[6];
int Conversion_Teclado(),tecla=0,dinero=0;

void main()
{
Keypad_Init(); // Initialize Keypad
ANSEL=0;
ANSELH= 0;
C1ON_bit=0;
C2ON_bit=0;
UART1_Init(19200);
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){
Lcd_Cmd(_LCD_CLEAR);
UART1_write_text("Bienvenido al juego de la Ruleta");
Lcd_Out(1,1,"Bienvenido al juego de la Ruleta");
delay_ms(1000);
for(i=0; i<35; i++) { // Move text to the right 7 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
delay_ms(100);
}
for(i=0; i<35; i++) { // Move text to the left 7 times
Lcd_Cmd(_LCD_SHIFT_LEFT);
delay_ms(100);
}
for(i=0;i<10;i++){
numeros[i]=i;
}
for(i=0;i<10;i++)
{
tmp= numeros[i+1];
numeros[i+1]=numeros[i];
numeros[i]=tmp;
}
Inicio_Ruleta(numeros);
}
}
void Inicio_Ruleta(int numeros[])
{
Lcd_Cmd(_LCD_CLEAR);
do{
UART1_write_text("Apuestas($)");
UART1_write(13);
UART1_write_text("1. 20");
UART1_write(13);
UART1_write_text("2. 50");
UART1_write(13);
UART1_write_text("3. 100");
UART1_write(13);
Lcd_Out(1,2,"Apuestas($)");
Lcd_Out(2,1,"1.20 2.50 3.100");
tecla= Conversion_Teclado();
}while(tecla==-1);

switch(tecla){
case 1: dinero=20; break;
case 2: dinero=50; break;
case 3: dinero=100; break;
default : dinero=0;
}
Lcd_Cmd(_LCD_CLEAR);
i=0;
while(dinero>0)
{
do{
UART1_write_text("Ingrese numero");
UART1_write(13);
Lcd_Out(1,1,"Ingrese numero");
tecla= Conversion_Teclado();
}while(tecla==-1);
tmp1=numeros[i];
if(tmp1==tecla)
{
UART1_write_text("Usted ha ganado:");
UART1_write(13);
dinero=dinero+2;
WordtoStr(dinero,num);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"Usted ha ganado:");
Lcd_Out(2,1,num);
delay_ms(1000);
}
else
{
Lcd_Out(1,1,"Usted ha perdido:");
Lcd_Out(2,1,num);
dinero=dinero-2;
WordtoStr(dinero,num);
UART1_write_text("Usted ha ganado:");
UART1_write(13);
Lcd_Cmd(_LCD_CLEAR);
delay_ms(1000);
}
i++;
}

Lcd_Cmd(_LCD_CLEAR);
Lcd_Out(1,1,"!!!Se termino el Juego!!!");
delay_ms(1000);
for(i=0; i<25; i++) { // Move text to the right 7 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
delay_ms(100);
}
for(i=0; i<25; i++) { // Move text to the left 7 times
Lcd_Cmd(_LCD_SHIFT_LEFT);
delay_ms(100);
}
return;
}
int Conversion_Teclado()
{
do{
kp= keypad_key_click();
}while(kp==0);

switch(kp){
case 1: kp=7; break;
case 2: kp=8; break;
case 3: kp=9; break;

case 5: kp=4; break;
case 6: kp=5; break;
case 7: kp=6; break;

case 9: kp=1; break;
case 10: kp=2; break;
case 11: kp=3; break;
case 14: kp=0; break;
default : kp=-1;
}
return kp;
}

7. COPIA IMPRESA DEL CIRCUITO ARMADO EN PROTEUS
PARA LA SIMULACIN EN EL MOMENTO DE SU
EJECUCIN (POR EJEMPLO CON LEDS ENCENDIDOS).








8. CONCLUSIONES.

Este proyecto est hecho en base al uso del mdulo art. de
comunicacin serial asincrnico que se aprendi en las prcticas
realizadas en el laboratorio. La comunicacin serial se la uso en
este proyecto con el fin de mostrar el men de funciones del
juego como por medio del LCD.
El proyecto me sirvi como refuerzos de todas las prcticas que
se ha visto en el laboratorio y a su vez es de disear y crear
programas necesarios para darle alguna funcin al PIC las
infinidades que tienen los hacen interesante. Tambin se manej
un teclado 4x4 usando las funciones que dispone el MikroC Pro
siendo ms verstil y dinmico manejar el teclado.
Los microcontroladores han evolucionado de lo complejo a lo
fcil ya que como nosotros programando ya sea en lenguaje C o
en Assembler puede darse el trabajo ese PIC en cualquier rea ya
sea en la Industria o en la fabricacin de carros con la ayuda de
los robots, manejados internamente con PIC.

9. RECOMENDACIONES.

Usar una velocidad 19200 bps para una comunicacin correcta
entre la simulacin del PIC con la PC. Esto puede variar
dependiendo del proyecto que estemos diseando.

Conectar correctamente los terminales del PIC de comunicacin
serial al puerto virtual porque si no mostrar error o smbolo
extraos en los datos que se han comunicados.

Si van a utilizar una funcin nueva que cuenta el MikroC Pro
vayan a la ayuda y busquen por el nombre de la funcin la
descripcin detallada del mismo.





ESCUELA SUPERIOR POLITCNICA DEL
LITORAL



FACULTAD DE INGENIERIA EN
EN ELECTRICIDAD Y COMPUTACIN
FIEC


LABORATORIO DE MICROCONTROLADORES

PROYECTO#2:

COMUNICACIN UART, LCD Y TECLADO

Profesor:
Ing. Carlos Valdivieso

Integrantes:
MAROTO LEMA JUAN
CISNEROS ROMO JONATHAN

Paralelo:
7

Grupo:
#2

Fecha de presentacin:
26/01/2011