
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
const byte ROWS = 4;
const byte COLS = 4;
int Number = 0;
float Zstep = 1;
float XYstep = 10;
int Feedrate = 1000;


char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};
byte colPins[COLS] = {5, 4, 3, 2};

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

void setup() {
   Serial.begin(9600);
    lcd.init();                      // initialize the lcd
    lcd.backlight();
    lcd.setCursor(0, 0);
    lcd.print("XY Step =  ");
    lcd.print(XYstep);
    lcd.setCursor(0, 1);
    lcd.print("Z Step =  ");
    lcd.print(Zstep);
     lcd.setCursor(0, 2);
    lcd.print("Feedrate =  ");
    lcd.print(Feedrate);
      Serial.end();



}

void loop() {
  char customKey = customKeypad.getKey();
  if (customKey) {
    Serial.begin(115200);
    Number = customKey - '0';
    //Serial.println("Number = ");
    //Serial.println(Number);


    if (Number == 1) {
      Serial.print("$J=G91 Z");
      Serial.print (Zstep);
      Serial.print ("F");
      Serial.println (Feedrate);
      //delay(500);
      Serial.end();
    Serial.begin(9600);
   
    lcd.setCursor(0, 3);
    lcd.print("Stepping Z");
    //lcd.print(XYstep);
      Serial.end();
    }

    if (Number == 2) {
      Serial.print("$J=G91 Y");
      Serial.print (XYstep);
       Serial.print ("F");
      Serial.println (Feedrate);
     // delay(500);
      Serial.end();
    }
    if (Number == 4) {
      Serial.print("$J=G91 X");
      Serial.print (-XYstep);
      Serial.print ("F");
      Serial.println (Feedrate);
     // delay(500);
      Serial.end();
    }
    if (Number == 6) {
      Serial.print("$J=G91 X");
      Serial.print (XYstep);
       Serial.print ("F");
      Serial.println (Feedrate);
      //delay(500);
      Serial.end();
    }
    if (Number == 8) {
      Serial.print("$J=G91 Y");
      Serial.print (-XYstep);
       Serial.print ("F");
      Serial.println (Feedrate);
      //delay(500);
      Serial.end();
    }
    if (Number == 7) {
      Serial.print("$J=G91 Z");
      Serial.print (-Zstep);
       Serial.print ("F");
      Serial.println (Feedrate);
      //delay(500);
      Serial.end();
    }
    
    if (Number == -6) {
      Serial.println("!");
     // delay(500);
      Serial.end();
    }
    if (Number == -13) {
      Serial.println("~");
      //delay(500);
      Serial.end();
    }

    
    if (Number == 17) { // Button A + XY step
      XYstep = XYstep * 10;
      //Serial.println(XYstep);

    }
    if (Number == 18) { // Button B -xy step
      XYstep = XYstep / 10;
      //Serial.println(XYstep);

    }
    if (Number == 19) { // Button C +Z step
      Zstep = Zstep * 10;
      //Serial.println(Zstep);

    }
    if (Number == 20) { // Button C -Z step
      Zstep = Zstep / 10;
      //Serial.println(Zstep);

    }
    
    if (Number == 0) { // Button C -Z step
     XYstep = XYstep - 1;
      //Serial.println(Zstep);

    }
    if (Number == 5) { // Button C -Z step
     XYstep = XYstep + 1;
    }    
    if (Number == 3) { // Feedrate up
      Feedrate = Feedrate * 10;
      //Serial.println(Zstep);

    }
    
    if (Number == 9) { // Feedrate down
      Feedrate = Feedrate /  10;
      //Serial.println(Zstep);

    }
    
    Serial.begin(9600);
    lcd.init();
    lcd.setCursor(0, 0);
    lcd.print("XY Step =  ");
    lcd.print(XYstep);
    lcd.setCursor(0, 1);
    lcd.print("Z Step =  ");
    lcd.print(Zstep);
     lcd.setCursor(0, 2);
    lcd.print("Feedrate =  ");
    lcd.print(Feedrate);
      Serial.end();
  }
}
