Finally, I finished my small project to integrate a 4x4 keypad with Arduino uno using only five pins. At first I had planned to implement it using a 74HCT157. After some failed design attempts, I moved to the idea of use a 4052 but even as it resolved the rows writing, it took another IC: a 74HC165 for the columns reading. Here my raw code. I don't like it ‘as is’ but it works!:
#define PIN3 3
#define PIN4 4
int latchPin = 5;
int dataPin = 6;
int clockPin = 7;
int input;
void setup() {
pinMode(PIN3, OUTPUT);
pinMode(PIN4, OUTPUT);
pinMode(latchPin, OUTPUT);
pinMode(dataPin, INPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
}
uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder) {
uint8_t value = 0;
uint8_t i;
for (i = 0; i < 4; ++i) {
digitalWrite(clockPin, HIGH);
if (bitOrder == LSBFIRST)
value |= digitalRead(dataPin) << i;
else
value |= digitalRead(dataPin) << (7 - i);
digitalWrite(clockPin, LOW);
}
return value;
}
void loop() {
setMUX(LOW, LOW);
digitalWrite(7, HIGH);
digitalWrite(5, HIGH);
input = shiftIn(6, 7, LSBFIRST);
digitalWrite(5, LOW);
switch (input) {
case 14:
Serial.println("1");
break;
case 13:
Serial.println("2");
break;
case 7:
Serial.println("3");
break;
case 11:
Serial.println("A");
break;
}
delay(10);
setMUX(LOW, HIGH);
digitalWrite(7, HIGH);
digitalWrite(5, HIGH);
input = shiftIn(6, 7, LSBFIRST);
digitalWrite(5, LOW);
switch (input) {
case 14:
Serial.println("4");
break;
case 13:
Serial.println("5");
break;
case 7:
Serial.println("6");
break;
case 11:
Serial.println("B");
break;
}
delay(10);
setMUX(HIGH, LOW);
digitalWrite(7, HIGH);
digitalWrite(5, HIGH);
input = shiftIn(6, 7, LSBFIRST);
digitalWrite(5, LOW);
switch (input) {
case 14:
Serial.println("7");
break;
case 13:
Serial.println("8");
break;
case 7:
Serial.println("9");
break;
case 11:
Serial.println("C");
break;
}
delay(10);
setMUX(HIGH, HIGH);
digitalWrite(7, HIGH);
digitalWrite(5, HIGH);
input = shiftIn(6, 7, LSBFIRST);
digitalWrite(5, LOW);
switch (input) {
case 14:
Serial.println("*");
break;
case 13:
Serial.println("0");
break;
case 7:
Serial.println("#");
break;
case 11:
Serial.println("D");
break;
}
delay(10);
}
void setMUX(uint8_t a, uint8_t b)
{
digitalWrite(PIN3, a);
digitalWrite(PIN4, b);
//delay(1000);
}
I can post here the connections between the two ICs and the Arduino if requested.