// Create variables at the top int once = 1; char kval = 'Z', inChar = ' '; // Setup is run one time. Define pins and assign starting values here. void setup() { // This is for the KEYPAD set up 4 output pins and 4 input pins pinMode(13, OUTPUT); pinMode(12, OUTPUT); pinMode(11, OUTPUT); pinMode(10, OUTPUT); pinMode(9, INPUT); pinMode(8, INPUT); pinMode(7, INPUT); pinMode(6, INPUT); // set 4 keypad output pins to 5V digitalWrite(13, HIGH); digitalWrite(12, HIGH); digitalWrite(11, HIGH); digitalWrite(10, HIGH); // set 4 pins to connect to the four LEDs pinMode(A0, OUTPUT); pinMode(A1, OUTPUT); pinMode(A2, OUTPUT); pinMode(A3, OUTPUT); // On Power Up, turn off all the LEDs digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); // Need this for serial commands, set to 9600 Baud. Serial.begin(9600); } // The main loop of the code is next. void loop( ) { // If something showed up, it is stored in 'inChar' and // it is no longer a blank space. Jump to mail_call. if (inChar != ' ') { mail_call(); } // Check the keypad and see if anything is being pressed scankeypad( ); // If the keypad had a button pressed, kval is something other than "Z" if (kval != 'Z' ) { // Some code you want to run when a key is pressed. Serial.println (kval); } } void mail_call( ) { if (inChar == 'A') { digitalWrite(A0, !digitalRead(A0)); } else if (inChar == 'B') { digitalWrite(A1, !digitalRead(A1)); } else if (inChar == 'C') { digitalWrite(A2, !digitalRead(A2)); } else if (inChar == 'D') { digitalWrite(A3, !digitalRead(A3)); } else if (inChar == 'X') { digitalWrite(A0, LOW); digitalWrite(A1, LOW); digitalWrite(A2, LOW); digitalWrite(A3, LOW); } // Blank space means "Nothing received" inChar = ' '; } void scankeypad() { // kval can be anything as long as it is NOT '0' - '9' or 'A' - 'F' (So I just picked 'Z') kval = 'Z'; digitalWrite(13, LOW); if (digitalRead(9) == LOW) kval = '1'; if (digitalRead(8) == LOW) kval = '4'; if (digitalRead(7) == LOW) kval = '7'; if (digitalRead(6) == LOW) kval = '0'; digitalWrite(13, HIGH); digitalWrite(12, LOW); if (digitalRead(9) == LOW) kval = '2'; if (digitalRead(8) == LOW) kval = '5'; if (digitalRead(7) == LOW) kval = '8'; if (digitalRead(6) == LOW) kval = 'F'; digitalWrite(12, HIGH); digitalWrite(11, LOW); if (digitalRead(9) == LOW) kval = '3'; if (digitalRead(8) == LOW) kval = '6'; if (digitalRead(7) == LOW) kval = '9'; if (digitalRead(6) == LOW) kval = 'E'; digitalWrite(11, HIGH); digitalWrite(10, LOW); if (digitalRead(9) == LOW) kval = 'A'; if (digitalRead(8) == LOW) kval = 'B'; if (digitalRead(7) == LOW) kval = 'C'; if (digitalRead(6) == LOW) kval = 'D'; digitalWrite(10, HIGH); // Limits the number of values being sent to 1, no matter how long the key is pressed. if (kval != 'Z' && once == 1) { once = 0; } else if (kval != 'Z' && once == 0) { kval = 'Z'; } else { once = 1; } } // SerialEvent occurs whenever a new data comes in the hardware serial RX. This // routine is run between each time loop( ) runs, so using delay inside loop can // delay response. Multiple bytes of data may be available. void serialEvent() { while (Serial.available()) { // get the new byte: inChar = (char)Serial.read(); } }