High speed camera shutter release (in progress)

Was on hiatus for a while but have been getting back into the Arduino lately. This time I've started with just the breadboard in an effort to reduce the cost of the final product. Using the Mega was too expensive compared to a ATmega328 chip. Next steps are to design and mill a PCB for it, then mill an enclosure. Updated source too for use with a serial LCD and larger keypad (for added functions later). Any suggestions on guides for designing and milling a PCB? I've not done that before but have access to a Taig mill.

#include <Keypad.h>

// Setup keypad information and pins
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
  {
    '1','2','3','A'  }
  ,
  {
    '4','5','6','B'  }
  ,
  {
    '7','8','9','C'  }
  ,
  {
    '*','0','#','D'  }
};
byte rowPins[ROWS] = {
  9,10,11,12};
byte colPins[COLS] = {
  3,4,5,6};
Keypad kpd = Keypad(makeKeymap(keys),rowPins,colPins,ROWS,COLS);

// Setup camera pins
int focusPin = 7;
int shutterPin = 8;

// Setup sensor pins
int infraredPin = 0;

// Set program mode for dealing with user input
// 0 - idle
// 1 - millisecond input
// 2 - microsecond input
// 3 - infrared threshold input
// 4 - armed
// Initial program mode is idle
int programMode = 0;

// Default setup if none is selected by the user
unsigned int millisecondDelay = 250;
unsigned int microsecondDelay = 25000;
int infraredThreshold = 512;

// Setup initial infrared sensor value
int infraredReading = 1;


void setup()
{
  // Enable serial to communicate with LCD
  Serial.begin(9600);

  // Set modes for camera pins
  pinMode(focusPin,OUTPUT);
  pinMode(shutterPin,OUTPUT);

  // Display startup message
  selectLineOne();
  Serial.print(" Arduino High Speed");
  selectLineTwo();
  Serial.print("Shutter Release v1.1");
  selectLineThree();
  Serial.print("  # TO ENTER SETUP");
  selectLineFour();
  Serial.print("      * TO ARM");
}


void loop()
{
  // Get current infrared sensor value
  infraredReading = analogRead(infraredPin);

  // Check for armed mode and trigger if beam is cut
  if(programMode == 4 && infraredReading < infraredThreshold)
  {
    delay(millisecondDelay);
    delayMicroseconds(microsecondDelay);
    digitalWrite(shutterPin,HIGH);
    delay(5);
    digitalWrite(shutterPin,LOW);
    digitalWrite(focusPin,LOW);
    clearLCD();
    selectLineOne();
    Serial.print("SHUTTER RELEASED:");
    selectLineTwo();
    Serial.print("Dont forget to arm");
    selectLineThree();
    Serial.print("again for the next!");
    programMode = 0;
  }

  // Get key from keypad and respond accordingly
  if(programMode != 4){
    char key = kpd.getKey();
    if(key)
    {
      switch(key)
      {
      case '*':
        // Arm if program mode is idle
        switch(programMode)
        {
        case 0:
          programMode = 4;
          clearLCD();
          selectLineOne();
          Serial.print("ARMED:");
          selectLineTwo();
          Serial.print("Photo will be taken");
          selectLineThree();
          Serial.print("when IR beam is cut!");
          digitalWrite(focusPin,HIGH);
          break;
        case 1:
          millisecondDelay = 0;
          selectLineFour();
          Serial.print("0                   ");
          break;
        case 2:
          microsecondDelay = 0;
          selectLineFour();
          Serial.print("0                   ");
          break;
        case 3:
          infraredThreshold = 0;
          selectLineFour();
          Serial.print("0                   ");
          break;
        }
        break;
      case '#':
        switch(programMode)
        {
        case 0:
          programMode = 1;
          clearLCD();
          selectLineOne();
          Serial.print("SETUP:");
          selectLineTwo();
          Serial.print("Set ms + #");
          selectLineThree();
          Serial.print("No MIN or MAX for ms");
          selectLineFour();
          Serial.print(millisecondDelay);
          break;
        case 1:
          programMode = 2;
          clearLCD();
          selectLineOne();
          Serial.print("SETUP:");
          selectLineTwo();
          Serial.print("Set us + #");
          selectLineThree();
          Serial.print("Attn MIN:3 MAX:16383");
          selectLineFour();
          Serial.print(microsecondDelay);
          break;
        case 2:
          programMode = 3;
          clearLCD();
          selectLineOne();
          Serial.print("SETUP:");
          selectLineTwo();
          Serial.print("Set IR threshold + #");
          selectLineThree();
          Serial.print("Attn MIN:0 MAX:1024");
          selectLineFour();
          Serial.print(infraredThreshold);
          break;
        case 3:
          programMode = 0;
          clearLCD();
          selectLineOne();
          Serial.print("IDLE: press * to arm");
          selectLineTwo();
          Serial.print("ms delay = ");
          Serial.print(millisecondDelay);
          selectLineThree();
          Serial.print("us delay = ");
          Serial.print(microsecondDelay);
          selectLineFour();
          Serial.print("IR threshold = ");
          Serial.print(infraredThreshold);
          break;
        }
        break;
      default:
        switch(programMode)
        {
        case 1:
          millisecondDelay = millisecondDelay * 10 + int(key-48);
          selectLineFour();
          Serial.print(millisecondDelay);
          break;
        case 2:
          microsecondDelay = microsecondDelay * 10 + int(key-48);
          selectLineFour();
          Serial.print(microsecondDelay);
          break;
        case 3:
          infraredThreshold = infraredThreshold * 10 + int(key-48);
          selectLineFour();
          Serial.print(infraredThreshold);        
          break;
        }
        break;
      }
    }
  }
}


//Serial LCD Functions
void selectLineOne(){
  Serial.print(0xFE, BYTE);
  Serial.print(128, BYTE);
}

void selectLineTwo(){
  Serial.print(0xFE, BYTE);
  Serial.print(192, BYTE);
}

void selectLineThree(){
  Serial.print(0xFE, BYTE);
  Serial.print(148, BYTE);
}

void selectLineFour(){
  Serial.print(0xFE, BYTE);
  Serial.print(212, BYTE);
}

void goTo(int position) {
  if (position<20){ 
    Serial.print(0xFE, BYTE);
    Serial.print((position+128), BYTE);
  }
  else if (position<40){
    Serial.print(0xFE, BYTE);
    Serial.print((position+128+64-20), BYTE);
  }
  else if (position<60){
    Serial.print(0xFE, BYTE);
    Serial.print((position+128+20-40), BYTE);
  }
  else if (position<80){
    Serial.print(0xFE, BYTE);
    Serial.print((position+128+84-60), BYTE);
  } 
  else { 
    goTo(0); 
  }
}

void clearLCD(){
  Serial.print(0xFE, BYTE);
  Serial.print(0x01, BYTE);
}

void backlightOn(){
  Serial.print(0x7C, BYTE);
  Serial.print(157, BYTE);
}

void backlightOff(){
  Serial.print(0x7C, BYTE);
  Serial.print(128, BYTE);
}

void backlight50(){
  Serial.print(0x7C, BYTE);
  Serial.print(143, BYTE);
}

void serCommand(){
  Serial.print(0xFE, BYTE);
}