I am a complete beginner at this.
I want to display the keypress on a 4x3 keypad on a common cathode 7segment. We are instructed not to use any libraries or fancy work. Just write a simple code that you can understand and explain.
I wrote this but it doesn't work in my proteus simulation. I don't know if it's the code or my circuit. Can someone please help me identify the issue here. Thanks a lot in advance.
//defining segments
#define segmentA 13
#define segmentB 12
#define segmentC 11
#define segmentD 10
#define segmentE 9
#define segmentF 1
#define segmentG 0
//defining keypad rows and cols
const int rows = 4;
const int cols = 3;
const char keys[rows][cols] = {
{ '1', '2', '3' },
{ '4', '5', '6' },
{ '7', '8', '9' },
{ '*', '0', '#' }
};
//arrays for loops
int rowPins[rows] = { 8, 7, 6, 5 };
int colPins[cols] = { 4, 3, 2 };
int seg[7] = { 13, 12, 11, 10, 9, 1, 0 };
//setup
void setup() {
for (int r = 0; r < rows; r++) { //rowpins => output
pinMode(rowPins[r], OUTPUT);
}
for (int c = 0; c < cols; c++) { //colpins => input
pinMode(colPins[c], INPUT);
}
for (int s = 0; s < 7; s++) { //segmentpins => output
pinMode(seg[s], OUTPUT);
}
}
//main loop
void loop() {
setLow();
char key = getKey();
if (key != 'n' && key != '*' && key != '#') {
displayNum(key);
}
}
//making all the keypad keys low
void setLow() {
for (int r = 0; r < rows; r++) {
digitalWrite(rowPins[r], LOW);
}
for (int c = 0; c < cols; c++) {
digitalWrite(colPins[c], LOW);
}
}
//getting the pressed key
char getKey() {
char k = 'n'; //if no key was registered return n
for (int r = 0; r < rows; r++) {
digitalWrite(rowPins[r], HIGH); //set a row high
for (int c = 0; c < cols; c++) {
if (digitalRead(colPins[c]) == HIGH) { //check if any col got high
delay(20); //debounce time
while (digitalRead(colPins[c]) == HIGH)
k = keys[r][c]; //save that value in k
}
}
digitalWrite(rowPins[r], LOW); //set the row back to low
}
return k;
}
//reset all the segment to low
void reset7seg() {
for (int i = 0; i < seg; i++) {
digitalWrite(seg[i], LOW);
}
}
//display on 7segment
void displayNum(char key) {
reset7seg();
switch (key) {
case '0': //display 0
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
break;
case '1': //display 1
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
break;
case '2': //display 2
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentG, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
break;
case '3': //display 3
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentG, HIGH);
break;
case '4': //display 4
digitalWrite(segmentG, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentF, HIGH);
break;
case '5': //display 5
digitalWrite(segmentA, HIGH);
digitalWrite(segmentG, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentF, HIGH);
break;
case '6': //display 6
digitalWrite(segmentA, HIGH);
digitalWrite(segmentG, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
break;
case '7': //display 7
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
break;
case '8': //display 8
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentE, HIGH);
digitalWrite(segmentF, HIGH);
digitalWrite(segmentG, HIGH);
break;
case '9': //display 9
digitalWrite(segmentA, HIGH);
digitalWrite(segmentB, HIGH);
digitalWrite(segmentC, HIGH);
digitalWrite(segmentD, HIGH);
digitalWrite(segmentG, HIGH);
digitalWrite(segmentF, HIGH);
break;
}
}