gpop1:
just before switch (menu) you could compare prev_menu to menu and then if then clear_oneshot =0;
if (clear_oneshot ==0){lcd.clear();
clear_oneshot =1;}
that way it only clears the lcd when the data being displayed has changed.
end of switch set prev_menu = menu;
Interesting. I may switch to that approach.
Here's how I solved it:
I moved menu_fun() into read_button_clicks() so that the menu only updates if a button has been clicked.
#include <Wire.h>
#include <Adafruit_MCP23017.h>
#include <Adafruit_RGBLCDShield.h>
Adafruit_RGBLCDShield lcd = Adafruit_RGBLCDShield();
#define ON 0x7
#define OFF 0x0
byte icons[3][7] = {{ 0x0, 0x4, 0x6, 0x1f, 0x6, 0x4, 0x0},
{0x0, 0xe, 0x15, 0x17, 0x11, 0xe, 0x0},
{0x4, 0xe, 0xe, 0x1e, 0x1b, 0xb, 0x6}
};
//! Index into the bitmap array for the icons.
const int ARROW_ICON_IDX = 0;
const int CLOCK_ICON_IDX = 1;
const int FLAME_ICON_IDX = 2;
uint8_t clicked_buttons;
int menu = 0;
void setup() {
lcd.begin(16, 2);
lcd.createChar(ARROW_ICON_IDX, icons[ARROW_ICON_IDX]);
lcd.createChar(CLOCK_ICON_IDX, icons[CLOCK_ICON_IDX]);
lcd.createChar(FLAME_ICON_IDX, icons[FLAME_ICON_IDX]);
menu_fun();
}
void loop() {
read_button_clicks();
//menu_fun();
delay(50);
}
//! Return a bitmask of clicked buttons.(stolen from hunt_the_wumpus from adafruit)
/*!
Examine the bitmask of buttons which are currently pressed and compare against
the bitmask of which buttons were pressed last time the function was called.
If a button transitions from pressed to released, return it in the bitmask.
\return the bitmask of clicked buttons
*/
void read_button_clicks() {
static uint8_t last_buttons = 0;
uint8_t buttons = lcd.readButtons();
clicked_buttons = (last_buttons ^ buttons) & (~buttons);
last_buttons = buttons;
if(clicked_buttons){menu_fun();}
}
void menu_fun() {
if (clicked_buttons & BUTTON_RIGHT) {
menu++;
}
if (clicked_buttons & BUTTON_LEFT) {
menu--;
}
if (menu > 2 && menu < 100) {
menu = 0;
}
if (menu < 0) {
menu = 2;
}
if (menu > 106 && menu < 200) {
menu = 101;
}
if (menu < 101 && menu > 99) {
menu = 106;
}
if (menu > 205 && menu < 300) {
menu = 201;
}
if (menu < 201 && menu > 199) {
menu = 205;
}
switch (menu) {
case 0:
lcd.clear();
lcd.write(ARROW_ICON_IDX);
lcd.print("time ");
lcd.print("heat");
if (clicked_buttons & BUTTON_SELECT) {
menu = 101;
}
break;
case 1:
lcd.clear();
lcd.print(" time");
lcd.write(ARROW_ICON_IDX);
lcd.print("heat");
if (clicked_buttons & BUTTON_SELECT) {
menu = 201;
}
break;
case 101:
lcd.clear();
lcd.write(CLOCK_ICON_IDX);
lcd.print("time");
lcd.setCursor(0, 1);
lcd.write(ARROW_ICON_IDX);
lcd.print("Auto 90 60 45 30 15");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 102:
lcd.clear();
lcd.write(CLOCK_ICON_IDX);
lcd.print("time");
lcd.setCursor(0, 1);
lcd.print(" Auto");
lcd.write(ARROW_ICON_IDX);
lcd.print("90 60 45 30 15");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 103:
lcd.clear();
lcd.write(CLOCK_ICON_IDX);
lcd.print("time");
lcd.setCursor(0, 1);
lcd.print(" Auto 90");
lcd.write(ARROW_ICON_IDX);
lcd.print("60 45 30 15");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 104:
lcd.clear();
lcd.write(CLOCK_ICON_IDX);
lcd.print("time");
lcd.setCursor(0, 1);
lcd.print(" Auto 90 60");
lcd.write(ARROW_ICON_IDX);
lcd.print("45 30 15");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 105:
lcd.clear();
lcd.write(CLOCK_ICON_IDX);
lcd.print("time");
lcd.setCursor(0, 1);
lcd.print("90 60 45");
lcd.write(ARROW_ICON_IDX);
lcd.print("30 15");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 106:
lcd.clear();
lcd.write(CLOCK_ICON_IDX);
lcd.print("time");
lcd.setCursor(0, 1);
lcd.print("90 60 45 30");
lcd.write(ARROW_ICON_IDX);
lcd.print("15");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 201:
lcd.clear();
lcd.write(FLAME_ICON_IDX);
lcd.print("heat");
lcd.setCursor(0, 1);
lcd.write(ARROW_ICON_IDX);
lcd.print("Auto Hi Med Low Off");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 202:
lcd.clear();
lcd.write(FLAME_ICON_IDX);
lcd.print("heat");
lcd.setCursor(0, 1);
lcd.print(" Auto");
lcd.write(ARROW_ICON_IDX);
lcd.print("Hi Med Low Off");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 203:
lcd.clear();
lcd.write(FLAME_ICON_IDX);
lcd.print("heat");
lcd.setCursor(0, 1);
lcd.print(" Auto Hi");
lcd.write(ARROW_ICON_IDX);
lcd.print("Med Low Off");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 204:
lcd.clear();
lcd.write(FLAME_ICON_IDX);
lcd.print("heat");
lcd.setCursor(0, 1);
lcd.print("Hi Med");
lcd.write(ARROW_ICON_IDX);
lcd.print("Low Off");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
case 205:
lcd.clear();
lcd.write(FLAME_ICON_IDX);
lcd.print("heat");
lcd.setCursor(0, 1);
lcd.print("Hi Med Low");
lcd.write(ARROW_ICON_IDX);
lcd.print("Off");
if (clicked_buttons & BUTTON_UP) {
menu = 0;
}
break;
}
}
I don't know if that's the "right" way, but it seems to work 
I'm now working on integrating this into my main program code. Wish me luck 