TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: marmoleta en 25 de Julio de 2017, 03:02:28
-
Buenos dias estoy realizando un menu con pantalla lcd y pic 16f873A, pero tengo un problema, no puedo hacer que cuando se pulse el boton menu se quede en el submenu y cuando es presionado nuevamente el boton menu pase a otro
:g)es decir presiono pulsador y hasta que no se suelte y presione nuevamente no ingresa a otro
porque si mantengo presionado el boton menu entra a los submenu todo el tiempo
aqui dejo el codigo en css con el programa css c compiler
#include <main.h>
// DECLARACION DE FUNCIONES
int pulsador(void);
//DEFINICIONES
#define in input
//DEFINICION DE PINES
#define Mas PIN_C4
#define Menos PIN_C6
#define menu_bt PIN_C7
void main()
{
// VARIABLES LOCALES
int8 interna; // contador
int8 menu=0; // seleccion de menu
// PROGRAMA PRINCIPAL
lcd_init(); // Inicializo el LCD
delay_ms(100); // Retardo necesario para que se inicialice el LCD
lcd_gotoxy(1,1); // Me ubico en la posicion 1,1 del LCD
printf(lcd_putc," Test botones "); // Escribo el mensaje de bienvenida
lcd_gotoxy(1,2); // Me ubico en la posicion 1,2 del LCD
for(interna=0;interna<=15;interna++) // En el segundo renglon cargo 16 * y creo un retardo
{ // de 80ms para que el mensaje se mantenga 2 Segundos
lcd_putc('*');
delay_ms(80);
}
WHILE(TRUE)
{ // ESTA PARTE DEL SOFTWARE SE DEDICA A LOS MENUS
//MENU PRINCIPAL
while (menu==0)
{
lcd_gotoxy(1,1);
printf(lcd_putc," pantalla "); // Escribo el mensaje pantalla
lcd_gotoxy(1,2); // Me ubico en la posicion 1,2 del LCD
printf(lcd_putc," principal "); // Escribo principal
if(pulsador()==1){ // Si pulso el boton menu
menu=1;} // voy a menu 1
}
}
//MENU 1
if (menu==1)
{
lcd_gotoxy(1,2); // Me ubico en la posicion 1,2 del LCD
printf(lcd_putc," Menu "); // Escribo menu
while(menu==1){
lcd_gotoxy(1,1); // Me ubico en la posicion 1,1 del LCD
printf(lcd_putc," 1 "); // Escribo 1
if(pulsador()==1){ // Si pulso el boton menu
delay_ms(10);
menu=2;} // paso a siguiente menu
}
}
//MENU 2
if (menu==2) // Menu 2
{
lcd_gotoxy(1,2); // Me ubico en la posicion 1,2 del LCD
printf(lcd_putc," Menu "); // Escribo menu
while(menu==2){
lcd_gotoxy(1,1); // Me ubico en la posicion 1,1 del LCD
printf(lcd_putc," 2 "); // Escribo 2
if(pulsador()==1){ // Si pulso el boton menu
delay_ms(10);
menu=3;} // paso a siguiente menu
}
}
//MENU 3
if (menu==3) // Menu 3
{
lcd_gotoxy(1,2); // Me ubico en la posicion 1,2 del LCD
printf(lcd_putc," Menu "); // Escribo menu
while(menu==3){
lcd_gotoxy(1,1); // Me ubico en la posicion 1,1 del LCD
printf(lcd_putc," 3 "); // Escribo 3
if(pulsador()==1){ // Si pulso el boton menu
delay_ms(10);
menu=0;} // paso a siguiente menu
}
}
}
//FUNCION PULSADORES
int pulsador(void)
{
int interna;
if(!in(menu_bt)){
interna=1;
delay_ms(250);
interna=1;
}
if(!in(Mas)){
interna=2;
delay_ms(100);}
if(!in(Menos)){
interna=3;
delay_ms(100);}
return interna;
}
-
podrias adentro de los if, poner un while esperando que suelte
int pulsador(void)
{
int interna;
if(!in(menu_bt)){
interna=1;
while(!menu_bt);
}
if(!in(Mas)){
interna=2;
while(!Mas);}
if(!in(Menos)){
interna=3;
while(!Menos);}
return interna;
}
Esto puede afeectar a tu programa, todo depende de como es que este programado, pero ya lo veras.
-
Hola killerjc gracias por la respuesta ahora entiendo cuando es pulsado el boton luego suelta y se produce la accion, algo asi entiendo ya lo agregue al codigo y funciona muy bien, pero en el caso del boton aumentar y disminuir no es necesario quedaria solo para el boton menu. Cuando debo aumentar el valor y disminuirlo lo hace bien pero como puedo hacer para luego de 2 segundos aumente mas rapidamente
if (menu==2) // Menu de Tiempo
{
lcd_gotoxy(1,2); // Me ubico en la posicion 1,2 del LCD
printf(lcd_putc," Tiempo Deseado "); // Escribo en el renglon inferior la leyenda Tiempo deseado
while(menu==2){
lcd_gotoxy(1,1); // Me ubico en la posicion 1,1 del LCD
printf(lcd_putc," %Lu S ",Tiempo_deseado); // Escribo la variable tiempo_deseado
if((pulsador()==2)&&(Tiempo_deseado<255)) // Si pulso + y la variable es menor a 255
{
Tiempo_deseado++; // Aumento la variable en un segundo
}
if((pulsador()==3)&&(Tiempo_deseado>0)) // Si pulso - y la variable es mayor a 0
{
Tiempo_deseado--; // Disminuto la variable en un segundo
}
if(pulsador()==1){ // Si pulso el boton Temp/Tiempo
guardar_valor16(0x2110,Tiempo_deseado); // Guardo variable en eeprom
delay_ms(10);
menu=0;} // paso a siguiente menu
}
}
-
Para hacer eso necesitarias una refencia de tiempo, para saber cuanto tiempo paso. La unica forma de hacer esto es usar un Timer.
Dos soluciones:
- O llevas todo lo de los botones/acciones (Aca nada de mostrar en el LCD, eso se hace en el loop principal) a la interrupcion del Timer, esto va a hacer que saques esos while por completo del codigo de los botones, y contando cuantas veces entro a la interrupcion podes saber si aumentar de a 1 o de 5 por ejemplo.
- O creas un Timer el cual tenga un "contador", entonces cuando detectas que el boton se presiono, guardas el valor del contador por unica ves. Luego de alli en adelante empezas a revisar que valor posee el contador, y comparas, si supera una cierta diferencia ( 2 segundos ) entonces procedes a aumentar de otra forma.