Arduino Mega · Keypad

Arduino Mega Keypad Simulator: Wiring, Code and a Live Circuit

This is a 4x4 membrane keypad wired to an Arduino Mega 2560 and scanned live with the Keypad library: open it in the editor, press a key, and the serial monitor prints it.

Eight wires and nothing else: the rows go to 9, 8, 7, 6 and the columns to 5, 4, 3, 2.

  • 5 V logic
  • Library: Keypad.h
  • 8 pins, no resistors
  • Debounced in the library
Arduino Mega · Keypadlive0.000 s 0.00x
Click to open it in the editor
The circuit itself, running on the simulator with the sketch below. Press what can be pressed; click anything else to open it in the editor.

Wiring the Keypad to the Arduino Mega

Every connection in the circuit above, with the board’s own pin names.

Keypad pinArduino Mega pinWhy
R1, R2, R3, R4pin 9, pin 8, pin 7, pin 6The rows: the library drives one low at a time.
C1, C2, C3, C4pin 5, pin 4, pin 3, pin 2The columns: inputs with pull-ups, read for each row.

A membrane keypad has no power pin: it is sixteen switches at the crossings of four row wires and four column wires. Eight pins of the Arduino Mega scan it, using the chip’s internal pull-ups, so no resistors are needed.

Pins to leave alone on the Arduino Mega

Pins 14 to 19 are the three extra serial ports and 20 and 21 are I2C, so keep them free if you will need those. An Uno shield’s I2C on A4 and A5 is not connected to anything on a Mega.

On a real bench

The Mega is long, so put the breadboard beside its double row of pins 22 to 53 and leave the left-hand headers free. The Keypad uses only a few of its 54 pins; a Mega earns its size when one sketch drives a keypad, a display and several sensors at once.

The code

The sketch the circuit above runs. Open it in the editor, change a line and press Run: it compiles in your browser.

4x4 keypad on Arduino Mega
#include <Keypad.h>

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, 8, 7, 6};   // R1 to R4
byte colPins[COLS] = {5, 4, 3, 2};   // C1 to C4

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);

void setup() {
  Serial.begin(9600);
  Serial.println("Press a key");
}

void loop() {
  char key = keypad.getKey();   // 0 when nothing new was pressed
  if (key) {
    Serial.print("Key: ");
    Serial.println(key);
  }
}

makeKeymap(keys) tells the library which character sits at each crossing. rowPins and colPins list the board pins in the order of the keypad’s connector, R1 to R4 and C1 to C4.

getKey() scans the matrix: it pulls each row low in turn and reads the four columns, so a column that reads low is a key held in that row. It returns the key once, when it is first pressed, with a debounce built in, and 0 otherwise.

Serial.begin(9600) opens the serial monitor. Serial is the USB port; Serial1 to Serial3 are on pins 18 and 19, 16 and 17, and 14 and 15.

Common mistakes with the Keypad on the Arduino Mega

Rows and columns swapped

Swap the two arrays and every key prints its mirror across the diagonal, so 2 prints 4. If the wrong keys come out in a pattern, swap rowPins and colPins.

Pins listed in the wrong order

The connector order is R1 to R4 then C1 to C4 on most keypads, left to right with the keys facing you. List the pins in exactly that order or keys move around.

Using pins 0 and 1

With 54 pins it is tempting to use any eight. Pins 0 and 1 are the USB serial port, so a keypad there corrupts what the serial monitor shows. The circuit uses 2 to 9 for that reason.

Questions and answers

Can I simulate a keypad with an Arduino Mega 2560?

Yes. The circuit at the top of this page is an Arduino Mega 2560 with a 4x4 keypad, running in your browser on a simulated ATmega2560. Click a key to press it; the simulated keypad connects that row to that column the way the membrane does. Press Run it in the editor to change the wiring or the code; it is free and needs no account.

Can I detect two keys at once?

Keypad.h has getKeys() for that, and up to about three keys work. More can ghost: a missing key appears to be pressed because of the paths through the others.

How do I make a password lock?

Collect the keys into a string until # is pressed, compare it with the code, and drive a relay or a servo when it matches. The keypad lock project does exactly that.

Does a 4x3 keypad work the same way?

Yes, with COLS set to 3, three column pins and a 4 by 3 keys array. The simulator has a 4x3 keypad part too.

Build your own Keypad project

Open this circuit in the editor, change the wiring or the code, and keep your version in a free account.