Problemas con menu de un lcd y boton "volver"

hola! tengo un pequeño problema y ojalá me puedan ayudar,estoy haciendo un menú para una pantalla lcd de 16x2,tengo 4 pulsadores que son: Arriba,Enter,Abajo y Volver,el menú es así:
escoja opciones:
living
dormitorio1
dormitorio2
hall
, luego al presionar enter puedo acceder a cualquier lugar de la casa,por ejemplo si entro a living me sale:
La temperatura del living es:
21.5ºC....y así sucesivamente con los demás lugares de la casa.

Ya,acá viene mi problema cuando veo la Tº del living por ejemplo necesito despues salir y volver al menu principal presionando el boton Volver,pero no logro volver,se queda pegado en la Tº.
Ahora adjunto una parte del código para que vean con mas claridad,yo creo que el Do-While es el problema,pero no se como salir de ahi por medio del pulsador.

void main(){
.
.
.

//acá va el boton que va hacia arriba.//


//este es el Enter

if (Button(&PORTD,1,120,0))
{

switch(a){
case 1:a=1;b=1;lcd_cmd(_lcd_clear);Lcd_Out(1,1,"La Temp.living es:");
Lcd_Chr(2,9,223);Lcd_Chr(2,8,'C');

do {
//lectura de la Tº, en el puerto RA5.

Ow_Reset(&PORTA, 5); // Onewire reset signal
Ow_Write(&PORTA, 5, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTA, 5, 0x44); // Issue command CONVERT_T
Delay_ms(400);
Ow_Reset(&PORTA, 5);
Ow_Write(&PORTA, 5, 0xCC); // SKIP_ROM
Ow_Write(&PORTA, 5, 0xBE); // READ_SCRATCHPAD

temp_value = Ow_Read(&PORTA, 5); //lectura byte 0.
temp_value = (Ow_Read(&PORTA, 5) << 8) + temp_value;
Display_Temperature(temp_value); //lo que se ve en el lcd
//delay_ms(5000);

} while (a!=2);
break;

// acá vienen mas Case para el resto de las habitaciones.
}
}

//acá está el pulsador que va hacia abajo//



if (Button(&PORTD,3,120,0)) este es el boton que presiono para volver al menu principal
{

switch(a){

case 1:b=1;//a=1;
lcd_cmd(_lcd_clear);lcd_out(2,1,op1);break; op1:living.

case 2:b=2;
lcd_cmd(_lcd_clear);lcd_out(2,1,op2);break; op2:dormitorio1.....

case 3:
lcd_cmd(_lcd_clear);lcd_out(2,1,op3);break;

case 4:
lcd_cmd(_lcd_clear);lcd_out(2,1,op4);break;
}
}

}

Ojalá se entienda Gracias!
 
Hola:
No tiene sentido en el do...while ya que si entras en la variable 'a' con el valor 1, nunca sale del do..while puesto que ahí se mantiene en el bucle mientras 'a' es diferente a 2 y sabemos que es 1, por lo tanto se queda en el bucle, a menos que en la rutina 'Display_Temperature' hagas el cambio pero veo que no.

Ahora para salir de ahí tendrías que poner dentro del do..while la rutina que lee el estado del pulsador y cuando esté activo sales del bucle con break... (break es usado en el switch...case, además es para salir de cualquier bucle ya sea while, for, do... incluso si está anidado).

No veo otro modo ya que así el código está ya para ser parchado...

Un saludo
 
Gracias por responder,sobre el ciclo do-while ya sé que no puede salir de ahí nunca y he puesto la funcion del pulsador dentro del do-while,pero no pasa nada sigue sin funcionar,e intentado hacer todo y aún no obtengo resultados,no se me ocurre como mas hacerlo :s
 
si Button no funciona, intenta hacerlo directamente con 'IF', detecta que el pulsador está accionado y ejecuta break o pone la variable 'a' = 2, para que salga del do..while. Lo digo ya que vuelves a usar Button mas abajo, así no creo que haya problemas con los rebotes.
Un caso extremo es que veas el código asm que genera para que veas lo que esta haciendo o también si lo estás simulando, pon un breakpoint en esa parte y simulas paso a paso.

Un saludo...
 
Gracias por las respuestas,logré hacerlo....en el while en vez de a!=1 coloque ahí la función button,entonces se queda pegado en la temperatura,pero cuando presiono el pulsador vuelve al menu principal. 8<)....Muchas Gracias!
 
hola bubu23 ojala y pudieras mostrar el codigo de tu programa ya terminado sin el error estoy con el mismo probr¿lema que tenias tu y aunque he intentado incorporar tu solucion a mi codigo UAN NO LOGRO RESOLVERLO
 
Atrás
Arriba