In this arduino electronics tutorial you will learn how to interface and read keypad with Arduino without library. In Arduino IDE you can find many keypad libraries such as Keypad.h which makes programming easier. The keypad library hides the programming details underneath it and sometimes you want to know how the keypad scanning algorithm with code works. So here we illustrate program code without library that reads 4x3 keypad and displays the pressed key on serial monitor with Arduino.
Interfacing 4x3 Keypad with Arduino
The schematic diagram of interfacing 4x3 keypad with Arduino is as shown below.
Before picture shows interfacing of the 4x3 keypad with Arduino on a breadboard.
Here we have connected the four rows R1, R2, R3 and R4 of the keypad to the digital pins 8, 7, 6 and 5 respectively. We connected the three columns C1, C2 and C3 to the digital pins 4, 3 and 2 respectively.
Programming & Coding
The keypad arduino code without library is below.
// Keypad Scanning without Library
// ee-diary.blogspot.com
const char rows = 4; // set display to four rows
const char cols = 3; // set display to three columns
const char keys[rows][cols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};
char rowPins[rows] = {8, 7, 6, 5};
char colPins[cols] = {4, 3, 2};
void setup () {
Serial.begin(9600);
for(char r = 0; r < rows; r++){
pinMode(rowPins[r], INPUT); //set the row pins as input
digitalWrite(rowPins[r], HIGH); //turn on the pullups
}
for(char c = 0; c < cols; c++){
pinMode(colPins[c], OUTPUT); //set the column pins as output
}
}
void loop() {
char key = getKey();
if(key != 0){
Serial.println(key);
}
}
char getKey(){
char k = 0;
for(char c = 0; c < cols; c++){
digitalWrite(colPins[c], LOW);
for(char r = 0; r < rows; r++){
if(digitalRead(rowPins[r]) == LOW){
delay(20); //20ms debounce time
while(digitalRead(rowPins[r])== LOW);
k = keys[r][c];
}
}
digitalWrite(colPins[c], HIGH);
}
return k;
}
Code explanation:
In the above program code we have first declared some constants such as the number of rows, number of columns, keypad 4 by 3 array corresponding to the keypad digits and arrays which maps the digital pin connected to rows and columns.
In the setup() function, we have setup the serial port @9600 baud rate for displaying the key pressed via Arduino IDE serial monitor using the Serial.begin() function. Then we have set up the rows and column ports. First we have made the four rows inputs and enabled the pullup resistors so that the rows are initially in High state using a for loop. Similarly, we set up the three columns as output using again a for loop.
In the loop() function we use the getKey() function(explained later) to scan and get the key pressed. Then we output the key pressed onto the serial monitor using the Serial.println() function.
The important function in this program code is the getKey() function. The getKey() function is the one which scans and detects which key is pressed and returns the key that is pressed. In the function getKey(), using a for loop, the three columns are sequentially made low(set low using the digitalWrite())function). For each column that is currently made low, we read the state of the four rows using a for loop. If anyone of the row being read is low then we wait for 20ms(debounce time), wait for that row to go back to high state using the while() function for checking the state of that row. Once that row goes high we pass that particular row and that particular column to the 2-D keys[][] array and save it as the key pressed in a variable k. Finally before returning our detected k from the getKey() function we make the column high again using the digitalWrite() function.
Once you upload the sketch to Arduino, you should open the serial monitor. Then press any key on the keypad and the pressed key will be shown on the serial monitor.
If you want to learn how to use keypad with arduino library see the post Arduino Keypad and LCD Interfacing with Code.
Recommended Tutorials
This was very helpful, changed it about to work with a 4x4 matrix keypad
glad to hear it was helpful, thanks
can we use for more columns say 4 rows and 6 columns?
yes you can
i'm trying to run this through tinkercad and it keeps coming up with the error 'invalid types 'const char[char]' for array subscript' any thoughts?
the code is working fine, so there should be something in tinkercad or something in your full code. i haven't used tinkercad(yet). maybe you want to ask in the tinkercad forum(https://tinkercad.zendesk.com/hc/en-us/community/topics).
Was struggling with a lot of sketches and tutorials that went into too much detail, or added too many functions to see the core concepts clearly. Yours is clear, works, and helped me understand the theory so that I can apply it in a project i'm working on. Many thanks!