#include <Keypad.
h>
#include <AccelStepper.h>
#include "U8glib.h" // U8glib for Nokia LCD
// Variables to hold entered number on Keypad
volatile int firstnumber=99; // used to tell how many
numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;
// Variables to hold Distance and CurrentPosition
int keyfullnumber=0; // used to store the final calculated
distance value
String currentposition = ""; // Used for display on Nokia LCD
// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
  {'*','0','#'}
};
byte rowPins[ROWS] = {7, 8, 9, 10}; // Arduino pins connected
to the row pins of the keypad
byte colPins[COLS] = {11, 12, 13}; // Arduino pins connected
to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins,
ROWS, COLS ); // Keypad Library definition
// U8glib Setup for Nokia LCD
#define backlight_pin 11
U8GLIB_PCD8544 u8g(2, 3, 5, 4, 6);   // Arduino pins connected
to Nokia pins:
                                     // CLK=2, DIN=3, CE=5,
DC=4, RST=6
// AccelStepper Setup
AccelStepper stepper(1, A0, A1); // 1 = Easy Driver interface
                                 // Arduino A0 connected to
STEP pin of Easy Driver
                                 // Arduino A1 connected to
DIR pin of Easy Driver
void setup(void) {
  // Light up the LCD backlight LEDS
  analogWrite(backlight_pin, 0); // Set the Backlight
intensity (0=Bright, 255=Dim)
  // AccelStepper speed and acceleration setup
  stepper.setMaxSpeed(1500); // Not to fast or you will have
missed steps
  stepper.setAcceleration(200); // Same here
     // Draw starting screen on Nokia LCD
    u8g.firstPage();
     do {
     u8g.drawHLine(0, 15, 84);
     u8g.drawVLine(50, 16, 38);
     u8g.drawHLine(0, 35, 84);
    u8g.setFont(u8g_font_profont11);
     u8g.drawStr(0, 10, "ENTER DISTANCE");
     u8g.drawStr(62, 29, "MM");
     u8g.drawStr(4, 46, "cur-pos");
     }
     while( u8g.nextPage() );
void loop(){
  char keypressed = keypad.getKey(); // Get value of keypad
button if pressed
  if (keypressed != NO_KEY){ // If keypad button pressed
check which key it was
    switch (keypressed) {
     case '1':
       checknumber(1);
     break;
     case '2':
       checknumber(2);
     break;
     case '3':
       checknumber(3);
     break;
     case '4':
       checknumber(4);
     break;
     case '5':
       checknumber(5);
     break;
     case '6':
       checknumber(6);
     break;
     case '7':
       checknumber(7);
     break;
     case '8':
       checknumber(8);
     break;
     case '9':
       checknumber(9);
     break;
     case '0':
       checknumber(0);
            break;
            case '*':
              deletenumber();
            break;
            case '#':
              calculatedistance();
            break;
        }
    }
void checknumber(int x){
  if (firstnumber == 99) { // Check if this is the first
number entered
    firstnumber=x;
    String displayvalue = String(firstnumber); // Transform
int to a string for display
   drawnokiascreen(displayvalue); // Redraw Nokia lcd
  } else {
    if (secondnumber == 99) { // Check if it's the second
number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) +
String(secondnumber));
     drawnokiascreen(displayvalue);
    } else { // It must be the 3rd number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) +
String(secondnumber) + String(thirdnumber));
     drawnokiascreen(displayvalue);
        }
    }
}
void deletenumber() { // Used to backspace entered numbers
  if (thirdnumber !=99) {
      String displayvalue = (String(firstnumber) +
String(secondnumber));
     drawnokiascreen(displayvalue);
        thirdnumber=99;
    }
    else {
      if (secondnumber !=99) {
        String displayvalue = String(firstnumber);
       drawnokiascreen(displayvalue);
            secondnumber=99;
    }
    else {
      if (firstnumber !=99) {
        String displayvalue = "";
       drawnokiascreen(displayvalue);
             firstnumber=99;
            }
        }
    }
}
void calculatedistance() {         // Used to create a full number
from entered numbers
    if (thirdnumber == 99 && secondnumber == 99 &&
firstnumber != 99) {
      keyfullnumber=firstnumber;
      movestepper(keyfullnumber);
    }
        if (secondnumber != 99 && thirdnumber == 99) {
         keyfullnumber=(firstnumber*10)+secondnumber;
          movestepper(keyfullnumber);
        }
        if (thirdnumber != 99) {
keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
      movestepper(keyfullnumber);
    }
    resetnumbers(); // Reset numbers to get ready for new
entry
  }
void movestepper(long z) {   //   Move the stepper
  long calculatedmove=((z*160L)/0.4); // Calculate number
of steps needed in mm
 stepper.runToNewPosition(calculatedmove);
  currentposition = String(z);
  u8g.firstPage();
  do {
    u8g.drawHLine(0, 15, 84);
    u8g.drawVLine(50, 16, 38);
    u8g.drawHLine(0, 35, 84);
    u8g.setFont(u8g_font_profont11);
    u8g.drawStr(0, 10, "ENTER DISTANCE");
    u8g.drawStr(62, 29, "MM");
    u8g.drawStr(4, 46, "cur-pos");
    u8g.setPrintPos(57,47);
    u8g.print(currentposition);
  }
  while( u8g.nextPage() );
}
void resetnumbers() {   // Reset numbers for next entry
  firstnumber=99;
  secondnumber=99;
  thirdnumber=99;
}
void drawnokiascreen(String y) {
   u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(50, 16, 38);
      u8g.drawHLine(0, 35, 84);
      u8g.setFont(u8g_font_profont11);
      u8g.drawStr(0, 10, "ENTER DISTANCE");
      u8g.setPrintPos(0,29);
      u8g.print(y); // Put entered number on Nokia lcd
      u8g.drawStr(62, 29, "MM");
      u8g.drawStr(4, 46, "cur-pos");
      u8g.setPrintPos(57,47);
      u8g.print(currentposition); // Display current
position of stepper
    }
      while( u8g.nextPage() );