Menu Driven Program

Hi Mowcius Sorry Yes Im still reading this I have been away and haven't had a chance to come back here.

I have been playing with the first code you gave me ( 1 Button) and I have it working fully.

Do you mind having a quick look to see if there are an obvious errors/problems.

/* Menu Code by Adapated from Mowcius Code
*/

#include <NewSoftSerial.h>
#include <EEPROM.h>

NewSoftSerial LCDserial(0, 3);


// START Menu Stuff
int menuButton = 2;    
int programnumber = 1;
int menudelaycount = 0;
int menudelaycount2 = 0;
// End Menu Stuff

long ramCycle = 0;

int FRPin =  8;   
int MotorPin = 7;

long fillDelay = 1000;
long holdDelay = 500;
int ramPulse = 500;

void setup()   {  
  LCDserial.begin(9600);
  Serial.begin(9600);
  LCDclear();
  selectLineOne();
  LCDserial.print("Azzurra Bathroom");
  selectLineTwo();
  LCDserial.print("Testing Rig V1.0");
  delay(5000);
  pinMode(menuButton, INPUT);
  
  pinMode(FRPin, OUTPUT);   
  pinMode(MotorPin, OUTPUT); 
  
  //Pull Ram in fully
  retractRam();
  
  mainMenu(); 
}

void loop(){
}


void start()                     
{
  delay(3000);
  while(digitalRead(menuButton) == LOW){
    
    LCDclear();
  
    //Turn on Motor then push out for ramPulse Time
    selectLineOne();
    LCDserial.print("Extending Ram");
    digitalWrite(MotorPin, HIGH);   
    digitalWrite(FRPin, HIGH);
    delay(ramPulse);
    checkPress();
    
    //Hold the motor for holdDelay Time (-- PUSH OUT--)
    LCDclear();
    selectLineOne();
    LCDserial.print("Holding Ram");
    digitalWrite(MotorPin, LOW);
    delay(holdDelay);
    checkPress();
    
    //Turn on Motor then pull in for ramPulse Time
    LCDclear();
    selectLineOne();
    LCDserial.print("Retracting Ram");
    digitalWrite(MotorPin, HIGH);   
    digitalWrite(FRPin, LOW);         
    delay(ramPulse);
    checkPress();
    
    //Hold the motor for holdDelay Time (--PULL IN--) & Print Current Ram Count
    LCDclear();
    selectLineOne();
    LCDserial.print("Holding Ram");
    digitalWrite(MotorPin, LOW);
    ramCycle++;
    LCDclear();
    selectLineOne();
    LCDserial.print("Ram Count   ");
    selectLineTwo();
    LCDserial.print(ramCycle);
    delay(fillDelay);
    checkPress();
    
  }
 
}

void retractRam()
{
  LCDclear();
  selectLineOne();
  LCDserial.print("Retracting Ram");
  selectLineTwo();
  LCDserial.print("to Home Position");
  digitalWrite(MotorPin, HIGH);
  digitalWrite(FRPin, LOW);
  delay(6000);
  digitalWrite(MotorPin, LOW);
}

void mainMenu()
{ 
 LCDclear();  //clears the LCD 
 selectLineOne();
 switch (programnumber) { //reads the program number (set as 1 in setup)
 case 1:            //displays the first menu item              
   LCDserial.print("Set Fill Delay");
   break;
 case 2:        //displays the second menu item
   LCDserial.print("Hold Delay");
   break;
 case 3:       //displays the third menu item
   LCDserial.print("Ram Pulse");
   break;
 case 4:            //displays the first menu item              
   LCDserial.print("Start"); 
   break;
 case 5:       //displays the third menu item
   LCDserial.print("Stop");
   break;
 default:      //if errors then it goes to default item 
   LCDserial.print("Fill Delay");
}
 selectLineTwo();
 LCDserial.print("Next >");    //next code in specific position 
 while(digitalRead(menuButton) == HIGH){} //while button is high do nothing: {} (helps with debounce after button has been pressed)
 delay(5);
 while(digitalRead(menuButton) == LOW){} //wait until button has been pressed (taken high).
   menudelaycount = 0; //clear menu delay
   while(menudelaycount <500){ //do this code within the 500 limit (over 500ms because of other stuff that is done and takes time)
   delay(1);
   menudelaycount++;
   if(digitalRead(menuButton) == LOW){ //if the button goes low (button released) within this loop then it advances one menu option
     programnumber++; //increase the menu option
   if(programnumber > 5){
     programnumber = 1;
   }
   mainMenu(); //then run menu code from start: the change in program number makes it change the option it is on.
   }
 }
 switch (programnumber) { //if the button is not let go within the menu time stated above then it does not loop back and then selects the subroutine from this switch case:
     case 1:
       //LCDserial.print("Fill Func");
       fillMenu();
       break;
     case 2:
       // LCDserial.print("Delay Func");
        delayMenu();
       break;
     case 3:
        //LCDserial.print("Pulse Func");
        pulseMenu();
       break;
      case 4:
        LCDclear();
        selectLineOne
        LCDserial.print("Starting Test");
        start();
       break;
     case 5:
        LCDserial.print("Stop Func");
       break;
     default:
        LCDserial.print("Default Start Func");
     }
}

void fillMenu()
{ 
   LCDclear();
   selectLineOne();
   LCDserial.print(fillDelay);
   selectLineTwo();
   LCDserial.print("Next >");    
  
   while(digitalRead(menuButton) == HIGH){}
     delay(5);
   while(digitalRead(menuButton) == LOW){} 
     menudelaycount = 0;
   while(menudelaycount <500){
     delay(1);
     menudelaycount++;
     if(digitalRead(menuButton) == LOW){ 
        fillDelay = fillDelay +3000; 
     if(fillDelay > 120000){
       fillDelay = 0;
     }
   fillMenu();
   }
 }
   LCDclear();
   selectLineOne();
   LCDserial.print("Fill Delay set @ ");
   selectLineTwo();
   LCDserial.print(fillDelay);
   delay(3000);
   mainMenu();
}

void delayMenu()
{ 
  LCDclear();
  selectLineOne(); 
  LCDserial.print(holdDelay);
  selectLineTwo();
  LCDserial.print("Next >");    
  
   while(digitalRead(menuButton) == HIGH){} 
     delay(5);
   while(digitalRead(menuButton) == LOW){} 
     menudelaycount = 0; 
   while(menudelaycount <500){ 
     delay(1);
     menudelaycount++;
     if(digitalRead(menuButton) == LOW){ 
        holdDelay = holdDelay +500;
     if(holdDelay > 60000){
       holdDelay = 0;
     }
   delayMenu();
   }
 }
   LCDclear();
   selectLineOne();
   LCDserial.print("Hold Delay set @ ");
   selectLineTwo();
   LCDserial.print(holdDelay);
   delay(3000);
   mainMenu();
}

void pulseMenu()
{ 
   LCDclear();
   selectLineOne();  
   LCDserial.print(ramPulse);
   selectLineTwo();
   LCDserial.print("Next >");    
  
   while(digitalRead(menuButton) == HIGH){} 
     delay(5);
   while(digitalRead(menuButton) == LOW){} 
     menudelaycount = 0; 
   while(menudelaycount <500){ 
     delay(1);
     menudelaycount++;
     if(digitalRead(menuButton) == LOW){
        ramPulse = ramPulse +250; 
     if(ramPulse > 6000){
       ramPulse = 0;
     }
   pulseMenu(); 
   }
 }
   LCDclear();
   selectLineOne();
   LCDserial.print("Ram Pulse set @ ");
   selectLineTwo();
   LCDserial.print(ramPulse);
   delay(3000);
   mainMenu();
}

void checkPress()
{
  if (digitalRead(menuButton) == HIGH)
  {
    retractRam();
    LCDclear();
    selectLineOne();
    LCDserial.print("Paused");
  //  selectLineTwo();
   // LCDserial.print("Press button to goto menu");    
    delay(500);
    while(digitalRead(menuButton) == LOW){}
    mainMenu();
    
  }
}

void selectLineOne(){  //puts the cursor at line 0 char 0.
  LCDserial.print(0xFE, BYTE);   //command flag
  LCDserial.print(128, BYTE);    //position
}

void selectLineTwo(){  //puts the cursor at line 2 char 0.
  LCDserial.print(0xFE, BYTE);   //command flag
  LCDserial.print(192, BYTE);    //position
}

void LCDclear(){
  LCDserial.print(0xFE, BYTE);   //command flag
  LCDserial.print(0x01, BYTE);   //clear command
  }

Thanks again

Ben