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