Keypad with 7 segment display

Hello guys!
I need some help with this code:

#include <Key.h>
#include <Keypad.h>
byte digitPlace;
byte digit0;
byte digit1;
byte digit2;
byte digit3;
byte digit0pins[] = {14,15,16,17,18,19,20,}; // g-f-e-d-c-b-a for example
byte digit1pins[] = {21,22,23,24,25,26,27,};
byte digit2pins[] = {28,29,30,31,32,33,34,};
byte digit3pins[] = {35,36,37,38,39,40,41,};
byte fontArray[] = {
0b00111111, // 0  with x-g-f-e-d-c-b-a, 1 =- segment on
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111, // 9
};
byte maskArray[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000,};
byte i;
const byte numRows= 4;
const byte numCols= 4;
char keymap [numRows][numCols]=
{
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', '+'}
};
byte rowPins[numRows] = {13,12,11,10}; //Rows 0 to 4
byte colPins[numCols]= {9,8,7,6}; //Columns 0 to 4
Keypad myKeypad= Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {
Serial.begin(9600);
for (i=0; i<7; i=i+1){
pinMode (digit0pins[i], OUTPUT);
pinMode (digit1pins[i], OUTPUT);
pinMode (digit2pins[i], OUTPUT);
pinMode (digit3pins[i], OUTPUT);
}
}

void loop() {
char keypressed = myKeypad.getKey();
if (keypressed != NO_KEY)
{
if (keypressed >= 48){  // www.asciitable.com]www.asciitable.com see if at least a '0' came in
keypressed = keypressed - 48; // yes, so convert from ASCII character to a number,
}
if (keypressed >= 0 && keypressed <=9){ // display valid numbers
switch (digitPlace) // switch between the different digits
{
case 0: // digit0
for (i=0; i<7;i=i+1){
if ((fontArray[keypressed] && maskArray[i]) == 0){  // test if segment is equal to 0, turn it off
// for example digit0 = 1, then fontArray[1] = 0b00000110. With i = 0, then 0b00000110 && 0b00000001 = 0,
// so pin for segment A gets turned off
// for example digit0 = 1, then fontArray[1] = 0b00000110. With i = 1, then 0b00000110 && 0b0000010 = 0b00000010,
// so pin for segment B gets turned on

digitalWrite (digit0pins[i], LOW);  
Serial.println("digit0");
Serial.println(digit0pins[i]);   
delay(500);          
}
else {   // otherwise, turn it on
digitalWrite (digit0pins[i], HIGH);
Serial.println("digit 0");
Serial.println(digit0pins[i]);
}
}
break;
case 1: // digit1
for (i=0; i<7;i=i+1){
if ((fontArray[keypressed] && maskArray[i]) == 0){
digitalWrite (digit1pins[i], LOW);
Serial.println("digit1");   
Serial.println(digit1pins[i]);  
delay(500);          
}
else { // otherwise, turn it on
digitalWrite (digit1pins[i], HIGH);
Serial.println("digit 1");   
Serial.println(digit1pins[i]);
delay(500);    
}
}
break;
case 2: // digit2
for (i=0; i<7;i=i+1){
if ((fontArray[keypressed] && maskArray[i]) == 0){

digitalWrite (digit2pins[i], LOW);
Serial.println("digit2");   
Serial.println(digit2pins[i]);  
delay(500);                 
}
else {  // otherwise, turn it on
digitalWrite (digit2pins[i], HIGH);
Serial.println("digit 2");   
Serial.println(digit2pins[i]);   
delay(500); 
}
}
break;
case 3: // digit3
for (i=0; i<7;i=i+1){
if ((fontArray[keypressed] && maskArray[i]) == 0){ 
digitalWrite (digit3pins[i], LOW);   
Serial.println("digit3");   
Serial.println(digit3pins[i]); 
delay(500);               
}
else { // otherwise, turn it on
digitalWrite (digit3pins[i], HIGH);
Serial.println("digit 3");   
Serial.println(digit3pins[i]); 
delay(500);   
}
}
break;
}
if (keypressed =='#'){  // if # came in, move to next digit
digitPlace = digitPlace +1;
if (digitPlace == 4){
digitPlace = 0;
}
}
}
}
}

When I pressed e.g. 1 on serial monitor shows this :

digit 0
14
digit 0
15
digit 0
16
digit 0
17
digit 0
18
digit 0
19
digit 0
20

What is the problem?
My project is to make a 4 7-led segment display. Something like this 1#3#5#7 ---> display shows 1357.

      if (keypressed == '#') { // if # came in, move to next digit
        digitPlace = digitPlace + 1;
        if (digitPlace == 4) {
          digitPlace = 0;
        }
      }

Is this correctly positioned?

Format and indent your code properly and it makes mistakes easier to notice.
Tools->Autoformat or Ctrl-T

Okey here is a code after Autoformat

#include <Key.h>
#include <Keypad.h>
byte digitPlace;
byte digit0;
byte digit1;
byte digit2;
byte digit3;
byte digit0pins[] = {14, 15, 16, 17, 18, 19, 20,}; // g-f-e-d-c-b-a for example
byte digit1pins[] = {21, 22, 23, 24, 25, 26, 27,};
byte digit2pins[] = {28, 29, 30, 31, 32, 33, 34,};
byte digit3pins[] = {35, 36, 37, 38, 39, 40, 41,};
byte fontArray[] = {
  0b00111111, // 0  with x-g-f-e-d-c-b-a, 1 =- segment on
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00000111, // 7
  0b01111111, // 8
  0b01101111, // 9
};
byte maskArray[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000,};
byte i;
const byte numRows = 4;
const byte numCols = 4;
char keymap [numRows][numCols] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', '+'}
};
byte rowPins[numRows] = {13, 12, 11, 10}; //Rows 0 to 4
byte colPins[numCols] = {9, 8, 7, 6}; //Columns 0 to 4
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {
  Serial.begin(9600);
  for (i = 0; i < 7; i = i + 1) {
    pinMode (digit0pins[i], OUTPUT);
    pinMode (digit1pins[i], OUTPUT);
    pinMode (digit2pins[i], OUTPUT);
    pinMode (digit3pins[i], OUTPUT);
  }
}

void loop() {
  char keypressed = myKeypad.getKey();
  if (keypressed != NO_KEY)
  {
    if (keypressed >= 48) { // www.asciitable.com]www.asciitable.com see if at least a '0' came in
      keypressed = keypressed - 48; // yes, so convert from ASCII character to a number,
    }
    if (keypressed >= 0 && keypressed <= 9) { // display valid numbers
      switch (digitPlace) // switch between the different digits
      {
        case 0: // digit0
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) { // test if segment is equal to 0, turn it off
              // for example digit0 = 1, then fontArray[1] = 0b00000110. With i = 0, then 0b00000110 && 0b00000001 = 0,
              // so pin for segment A gets turned off
              // for example digit0 = 1, then fontArray[1] = 0b00000110. With i = 1, then 0b00000110 && 0b0000010 = 0b00000010,
              // so pin for segment B gets turned on

              digitalWrite (digit0pins[i], LOW);
              Serial.println("digit0");
              Serial.println(digit0pins[i]);
              delay(500);
            }
            else {   // otherwise, turn it on
              digitalWrite (digit0pins[i], HIGH);
              Serial.println("digit 0");
              Serial.println(digit0pins[i]);
            }
          }
          break;
        case 1: // digit1
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) {
              digitalWrite (digit1pins[i], LOW);
              Serial.println("digit1");
              Serial.println(digit1pins[i]);
              delay(500);
            }
            else { // otherwise, turn it on
              digitalWrite (digit1pins[i], HIGH);
              Serial.println("digit 1");
              Serial.println(digit1pins[i]);
              delay(500);
            }
          }
          break;
        case 2: // digit2
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) {

              digitalWrite (digit2pins[i], LOW);
              Serial.println("digit2");
              Serial.println(digit2pins[i]);
              delay(500);
            }
            else {  // otherwise, turn it on
              digitalWrite (digit2pins[i], HIGH);
              Serial.println("digit 2");
              Serial.println(digit2pins[i]);
              delay(500);
            }
          }
          break;
        case 3: // digit3
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) {
              digitalWrite (digit3pins[i], LOW);
              Serial.println("digit3");
              Serial.println(digit3pins[i]);
              delay(500);
            }
            else { // otherwise, turn it on
              digitalWrite (digit3pins[i], HIGH);
              Serial.println("digit 3");
              Serial.println(digit3pins[i]);
              delay(500);
            }
          }
          break;
      }
      if (keypressed == '#') { // if # came in, move to next digit
        digitPlace = digitPlace + 1;
        if (digitPlace == 4) {
          digitPlace = 0;
        }
      }
    }
  }
}

I have no oder idea where to put this :frowning: . Do you?

    if (keypressed >= 0 && keypressed <= 9) {
      if (keypressed == '#') { // if # came in, move to next digit
        digitPlace = digitPlace + 1;
        if (digitPlace == 4) {
          digitPlace = 0;
        }
      }
    }

Looks right?

when i pressed '#' digitplace does not change.

mclavtar:
when i pressed '#' digitplace does not change.

Yes, because your if (keypressed == '#') is inside of the if (keypressed >= 0 && keypressed <= 9) block.

if you put that part of the code there is false, because '#' is not >=0 && <=9. Am i right?

mclavtar:
if you put that part of the code there is false, because '#' is not >=0 && <=9. Am i right?

Yes.

Current code:

#include <Key.h>
#include <Keypad.h>
byte digitPlace;
byte digit0;
byte digit1;
byte digit2;
byte digit3;
byte digit0pins[] = {14, 15, 16, 17, 18, 19, 20,}; // g-f-e-d-c-b-a for example
byte digit1pins[] = {21, 22, 23, 24, 25, 26, 27,};
byte digit2pins[] = {28, 29, 30, 31, 32, 33, 34,};
byte digit3pins[] = {35, 36, 37, 38, 39, 40, 41,};
byte fontArray[] = {
  0b00111111, // 0  with x-g-f-e-d-c-b-a, 1 =- segment on
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00000111, // 7
  0b01111111, // 8
  0b01101111, // 9
};
byte maskArray[] = {0b00000001, 0b00000010, 0b00000100, 0b00001000, 0b00010000, 0b00100000, 0b01000000,};
byte i;
const byte numRows = 4;
const byte numCols = 4;
char keymap [numRows][numCols] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', '+'}
};
byte rowPins[numRows] = {13, 12, 11, 10}; //Rows 0 to 4
byte colPins[numCols] = {9, 8, 7, 6}; //Columns 0 to 4
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {
  Serial.begin(9600);
  for (i = 0; i < 7; i = i + 1) {
    pinMode (digit0pins[i], OUTPUT);
    pinMode (digit1pins[i], OUTPUT);
    pinMode (digit2pins[i], OUTPUT);
    pinMode (digit3pins[i], OUTPUT);
  }
}

void loop() {
  char keypressed = myKeypad.getKey();
  if (keypressed != NO_KEY)
  {

    if (keypressed >= 48) { // www.asciitable.com]www.asciitable.com see if at least a '0' came in
      keypressed = keypressed - 48; // yes, so convert from ASCII character to a number,
    }
    // display valid numbers
    if (keypressed == '#') { // if # came in, move to next digit
      Serial.println(digitPlace);
      digitPlace = digitPlace + 1;
      Serial.println(digitPlace);
      if (digitPlace == 4) {
        digitPlace = 0;
      }
    }
    switch (digitPlace) // switch between the different digits
    {
      case 0: // digit0
        if (keypressed >= 0 && keypressed <= 9) {
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) { // test if segment is equal to 0, turn it off
              // for example digit0 = 1, then fontArray[1] = 0b00000110. With i = 0, then 0b00000110 && 0b00000001 = 0,
              // so pin for segment A gets turned off
              // for example digit0 = 1, then fontArray[1] = 0b00000110. With i = 1, then 0b00000110 && 0b0000010 = 0b00000010,
              // so pin for segment B gets turned on

              digitalWrite (digit0pins[i], LOW);
              Serial.println("digit0");
              Serial.println(digit0pins[i]);
              delay(500);
            }

            else {   // otherwise, turn it on
              digitalWrite (digit0pins[i], HIGH);
              Serial.println("digit 0");
              Serial.println(digit0pins[i]);
              delay(500);
            }
          }
        }
        break;
      case 1: // digit1
        if (keypressed >= 0 && keypressed <= 9) {
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) {
              digitalWrite (digit1pins[i], LOW);
              Serial.println("digit1");
              Serial.println(digit1pins[i]);
              delay(500);
            }
            else { // otherwise, turn it on
              digitalWrite (digit1pins[i], HIGH);
              Serial.println("digit 1");
              Serial.println(digit1pins[i]);
              delay(500);
            }
          }
        }
        break;
      case 2: // digit2
        if (keypressed >= 0 && keypressed <= 9) {
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) {

              digitalWrite (digit2pins[i], LOW);
              Serial.println("digit2");
              Serial.println(digit2pins[i]);
              delay(500);
            }
            else {  // otherwise, turn it on
              digitalWrite (digit2pins[i], HIGH);
              Serial.println("digit 2");
              Serial.println(digit2pins[i]);
              delay(500);
            }
          }
        }
        break;
      case 3: // digit3
        if (keypressed >= 0 && keypressed <= 9) {
          for (i = 0; i < 7; i = i + 1) {
            if ((fontArray[keypressed] && maskArray[i]) == 0) {
              digitalWrite (digit3pins[i], LOW);
              Serial.println("digit3");
              Serial.println(digit3pins[i]);
              delay(500);
            }
            else { // otherwise, turn it on
              digitalWrite (digit3pins[i], HIGH);
              Serial.println("digit 3");
              Serial.println(digit3pins[i]);
              delay(500);
            }
          }
        }
        break;
    }
  }
}

Now when i press '#' program shifts to next digit. But it turn all 7 segments on (e.g if i press 3 turn all segments not just abcdg segments). How to slove this?
Serial monitor situation:

digit 0
14
digit 0
15
digit 0
16
digit 0
17
digit 0
18
digit 0
19
digit 0
20
0
1
digit 1
21
digit 1
22
digit 1
23
digit 1
24
digit 1
25
digit 1
26
digit 1
27
1
2
digit 2
28
digit 2
29
digit 2
30
digit 2
31
digit 2
32
digit 2
33
digit 2
34
2
3
digit 3
35
digit 3
36
digit 3
37
digit 3
38
digit 3
39
digit 3
40
digit 3
41
3
4
digit 0
14
digit 0
15
digit 0
16
digit 0
17
digit 0
18
digit 0
19
digit 0
20

mclavtar:
Now when i press '#' program shifts to next digit. But it turn all 7 segments on (e.g if i press 3 turn all segments not just abcdg segments). How to slove this?

if ((fontArray[keypressed] && maskArray[i]) == 0)

&& is a logical operator.
You want to use & for bitwise operation.

I've run out of time, just at this moment, but I suspect there may be other errors in your code.

i think the problem is here:

 else {   // otherwise, turn it on
              digitalWrite (digit0pins[i], HIGH);
              Serial.println("digit 0");
              Serial.println(digit0pins[i]);
              delay(500);
            }

mclavtar:
i think the problem is here:

Did you change the && to & ? Fix the easy stuff first, then you will be more likely to find any more difficult issues.

I did, but this does not slove the problem. I think the program does not read, which pins must be high properly. I'm trying different things to slove it. If you have any idea what could be wrong, I would be very happy.

Try this untested code:

#include <Key.h>
#include <Keypad.h>

byte digitPlace;
byte digitPins[][7] = {
  // g-f-e-d-c-b-a for example
  {14, 15, 16, 17, 18, 19, 20}, // digit 1
  {21, 22, 23, 24, 25, 26, 27}, // digit 2
  {28, 29, 30, 31, 32, 33, 34}, // digit 3
  {35, 36, 37, 38, 39, 40, 41}  // digit 4
};

byte fontArray[] = {
  0b00111111, // 0  with x-g-f-e-d-c-b-a, 1 =- segment on
  0b00000110, // 1
  0b01011011, // 2
  0b01001111, // 3
  0b01100110, // 4
  0b01101101, // 5
  0b01111101, // 6
  0b00000111, // 7
  0b01111111, // 8
  0b01101111, // 9
};

const byte numRows = 4;
const byte numCols = 4;
char keymap [numRows][numCols] =
{
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', '+'}
};
byte rowPins[numRows] = {13, 12, 11, 10}; //Rows 0 to 4
byte colPins[numCols] = {9, 8, 7, 6}; //Columns 0 to 4
Keypad myKeypad = Keypad(makeKeymap(keymap), rowPins, colPins, numRows, numCols);

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 7; i++) {
    pinMode(digitPins[0][i], OUTPUT);
    pinMode(digitPins[1][i], OUTPUT);
    pinMode(digitPins[2][i], OUTPUT);
    pinMode(digitPins[3][i], OUTPUT);
  }
}

void loop() {
  char keypressed = myKeypad.getKey();

  if (keypressed != NO_KEY)
  {
    Serial.print("keypressed: ");
    Serial.print(keypressed);
    Serial.print(", digitPlace: ");
    Serial.println(digitPlace);
    
    if (keypressed >= '0' && keypressed <= '9') {
      // convert from ASCII character to a number
      int digit = keypressed - '0';
      for (int i = 0; i < 7; i++) {
        bool segmentOn = fontArray[digit] & (1 << i);
        Serial.print("segment: ");
        Serial.print(i);
        Serial.print(", pin: ");
        Serial.print(digitPins[digitPlace][i]);
        Serial.print(", ");
        Serial.println(segmentOn ? "ON" : "OFF");
        digitalWrite (digitPins[digitPlace][i], segmentOn ? HIGH : LOW);
      }
    }
    else if (keypressed == '#') {
      // if # came in, move to next digit
      digitPlace = digitPlace + 1;
      if (digitPlace == 4) {
        digitPlace = 0;
      }
    }
  }
}

Yes, it works great. I was doing new code in the same way, but i got some errors. Here in this code i see what i was doing wrong. I have learned with this code a lot. So it not just copy-paste. THANK YOU VERY MUCH!

Glad to have helped.

mclavtar, are you all set now?

Yes, thank you!