#include <16F887.h>
#fuses NOWDT, XT, NOPROTECT,MCLR
#use delay(clock=4000000) // Crystal 4Mhz
#USE Standard_io (C)
#USE Standard_io (A)
#USE Standard_io (D)
#USE Standard_io (B)
/* Definicion de la LCD */
#define LCD_DB4 PIN_B4
#define LCD_DB5 PIN_B5
#define LCD_DB6 PIN_B6
#define LCD_DB7 PIN_B7
#define LCD_RS PIN_B2
#define LCD_E PIN_B3
#define use_portb_lcd TRUE //definir portb lcd
#include <lcd1.c>
/*-------------------- Variables de movimiento-------------------------------*/
#define AVANCE output_low(PIN_C2),output_low(PIN_C4),output_high(PIN_C3),output_high(PIN_C5)
#define RETROCESO output_high(PIN_C2),output_high(PIN_C4),output_low(PIN_C3),output_low(PIN_C5)
#define PARO output_low(PIN_C2),output_low(PIN_C4),output_low(PIN_C3),output_low(PIN_C5)
#define GIRO_DERECHA output_high(PIN_C2),output_low(PIN_C4),output_low(PIN_C3),output_high(PIN_C5)
#define GIRO_IZQUIERDA output_low(PIN_C2),output_high(PIN_C4),output_high(PIN_C3),output_low(PIN_C5)
/*------------------- Variables para lectura obstáculo ----------------------
#define Sensor_Frontal_Izq output_low (PIN_A0)
#define Sensor_Frontal_Der output_low (PIN_A1)
#define Sensor_Lateral_Izq output_low (PIN_A2)
#define Sensor_Lateral_Der output_low (PIN_A3) */
/*-------------------LECTURA DE OPCIONES---------------------*/
void mostrar_opciones(){ // VOID DE RUTINAS QUE SE MUESTRAN EN PANTALLA!!
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"D1 RUTINA 1");
lcd_gotoxy(1,2);
printf(lcd_putc,"D2 RUTINA 2 ");
}
/*----------------------RUTINAS-------------*/
void Rutina_Uno(){
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"EJECUTANDO 1");
AVANCE;
delay_ms (500);
RETROCESO;
delay_ms (500);
PARO;
}
void Rutina_Dos(){
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"EJECUTANDO 2");
//DECLARACION DE VARIBALES!!
boolean A0,A1,A2,A3,B0;
inicio: // GOTO!
A0=input(PIN_A0);
A1=input(PIN_A1);
A2=input(PIN_A2);
A3=input(PIN_A3);
B0=input(PIN_B0);
if ( ( A0==0) && (A1==0) && (A2==0) && (A3==0) )
AVANCE; // EJECUTA RUTINA
delay_ms(1000);
if ( (A0==1) && (A1==1) && (A2==0) && (A3==0))
RETROCESO ; // EJECUTA RUTINA
delay_ms(1000);
if ( (A0==0) && (A1==0) && (A2==1) && (A3==0))
GIRO_DERECHA; // EJECUTA RUTINA
delay_ms(1000);
if ( (A0==0) && (A1==0) && (A2==0) && (A3==1))
GIRO_IZQUIERDA; // EJECUTA RUTINA
delay_ms(1000);
if ( (A0==1) && (A1==1) && (A2==1) && (A3==1))
PARO; // EJECUTA RUTINA
delay_ms(1000);
GOTO inicio; // BUCLE DE ESCANEO
}
/*-------------------------- PARTE PRINCIPAL DEL PROGRAMA!!---------------------*/
void main(){
lcd_init();
output_high (PIN_A4);
// ESCRIBIR LA BIENVENIDA
lcd_gotoxy( 1, 1);
printf(lcd_putc," BIENVENIDOS ");
lcd_gotoxy( 1, 2);
printf(lcd_putc,"D0 IR A OPCIONES");
//DECLARACION DE VARIBALES!!
boolean D0,D1,D2,D3;
menu: // GOTO!
D0=input(PIN_D0);
D1=input(PIN_D1);
D2=input(PIN_D2);
D3=input(PIN_D3);
IF ( ( D0==1) && (D1==0) && (D2==0) && (D3==0) ) // while (input(PIN_D0)==FALSE) // FUNCION QUE ENVIA A LAS RUTINAS
mostrar_opciones(); // LLAMADA DEL VOID
/* ---------RUTINA DE LLAMADA Y PUESTA EN FUNCION DE LAS RUTINAS-------*/
IF ( ( D0==1) && (D1==1) && (D2==0) && (D3==0) )
Rutina_Uno();
IF ( ( D0==1) && (D1==0) && (D2==1) && (D3==0) )
Rutina_Dos();
IF ( ( D0==0) && (D1==0) && (D2==0) && (D3==1) )
mostrar_opciones();
IF ( ( D0==1) && (D1==1) && (D2==0) && (D3==1) )
mostrar_opciones();
IF ( ( D0==1) && (D1==0) && (D2==1) && (D3==1) )
mostrar_opciones();
GOTO menu; // BUCLE DE ESCANEO
// LED QUE INDICA ENCENDIDO DEL SISTEMA
while(true){
output_high (PIN_A4); //led on
delay_ms(500);
output_low (PIN_A4); //led off
delay_ms(500);
}
} // Final del codigoPor otro lado no entiendo que estas tratando de hacer. Seria una buena idea que trataras de explicar lo que quieres hacer asi se te dan algunas ideas para que puedas mejorar o tal ves simplificar el programa.
void main(){
lcd_init();
output_high (PIN_A4);
// ESCRIBIR LA BIENVENIDA
lcd_gotoxy( 1, 1);
printf(lcd_putc," BIENVENIDOS ");
lcd_gotoxy( 1, 2);
printf(lcd_putc,"D0 IR A OPCIONES");
void mostrar_opciones(){ // VOID DE RUTINAS QUE SE MUESTRAN EN PANTALLA!!
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"D1 RUTINA 1");
lcd_gotoxy(1,2);
printf(lcd_putc,"D2 RUTINA 2 ");
}
while(1){el ultimo error que tengo es que cuando ingresa la rutina 1 se ejcuta de manera infinita y no deberia ser asi, porque deberia ejecutarse y listo pero no lo hace.
D0=input(PIN_D0);
D1=input(PIN_D1);
D2=input(PIN_D2);
D3=input(PIN_D3);
IF ( ( D0==1) && (D1==0) && (D2==0) && (D3==0) ) // while (input(PIN_D0)==FALSE) // FUNCION QUE ENVIA A LAS RUTINAS
mostrar_opciones(); // LLAMADA DEL VOID
/* ---------RUTINA DE LLAMADA Y PUESTA EN FUNCION DE LAS RUTINAS-------*/
IF ( ( D0==1) && (D1==1) && (D2==0) && (D3==0) ) // si se cumple llama a la rutina 1
Rutina_Uno();
IF ( ( D0==1) && (D1==0) && (D2==1) && (D3==0) ) // si se cumple llama a la rutina 2
Rutina_Dos();
IF ( ( D0==0) && (D1==0) && (D2==0) && (D3==1) ) // si se cumple llama al void de mostrar opciones
mostrar_opciones();
IF ( ( D0==1) && (D1==1) && (D2==0) && (D3==1) ) // si se cumple llama al void de mostrar opciones
mostrar_opciones();
IF ( ( D0==1) && (D1==0) && (D2==1) && (D3==1) ) // si se cumple llama al void de mostrar opciones
mostrar_opciones();
} // BUCLE DE ESCANEO
void Rutina_Uno(){si simulo esta parte por separado la ejecuta y ya, pero aqui junto con el resto del programa se repite de forma infinita(creo que es por la forma en que esta la parte de escoger las opciones).
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"EJECUTANDO 1");
AVANCE;
delay_ms (500);
RETROCESO;
delay_ms (500);
PARO;
}
Ahora cuando presionas algo, y por ejemplo comienza a hacer la rutina 1 o 2. Este tiene que continuar con la rutina 1 hasta cuando ? si presionas un boton deberia pararse?
void Rutina_Uno(){
lcd_gotoxy(1,1);
lcd_putc("\f");
printf(lcd_putc,"EJECUTANDO 1");
AVANCE;
delay_ms (500);
RETROCESO;
delay_ms (500);
PARO;
}