byte Led[] = {23, 22, 21, 19, 18, 5, 4, 13};
byte Bar[] = {12, 14, 27, 26};
byte Dig[] = {0, 0, 0, 0};
byte seg[] = {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x19, 0x92, 0x01, 0x32, 0x3b, 0x30};
byte Filas[] = {35, 34, 32, 33};
byte Columnas[] = {2, 15, 25, 13};
unsigned long periodo = 200, valorAnterior = 0;
byte Teclas[4][4] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11},
{12, 13, 14, 15}
};
byte fcol = 0, cCol = 0;
void setup() {
for (byte i = 0; i <= 7; i++) {
pinMode(Led[i], OUTPUT);
}
for (byte i = 0; i < 4; i++) {
pinMode(Bar[i], OUTPUT);
}
for (byte f = 0; f < 4; f++) {
pinMode(Filas[f], OUTPUT);
pinMode(Columnas[f], INPUT);
digitalWrite(Filas[f], HIGH);
}
}
void loop() {
if (millis() - valorAnterior >= periodo) {
valorAnterior += periodo;
if (LeerTeclado()) {
Dig[0] = Teclas[fcol][cCol];
Dig[1] = Dig[0];
Dig[2] = Dig[1];
Dig[3] = Dig[2];
}
}
for (byte i = 0; i < 4; i++) {
barrido(i + 1);
Display(seg[Dig[i]]);
delay(5);
}
}
void barr(byte a, byte b, byte c, byte d){
digitalWrite(Bar[0], a);
digitalWrite(Bar[1], b);
digitalWrite(Bar[2], c);
digitalWrite(Bar[3], d);
}
void barrido(byte B){
barr(0,0,0,0);
switch (B){
case 1:
barr(0,0,0,1);
break;
case 2:
barr(0,0,1,0);
break;
case 3:
barr(0,1,0,0);
break;
case 4:
barr(1,0,0,0);
break;
}
}
void Display(byte N){
for (byte i = 0; i <= 7; i++){
digitalWrite(Led[i], bitRead(N, 7 - i));
}
}
bool LeerTeclado() {
for (byte f = 0; f < 4; f++) {
digitalWrite(Filas[f], LOW); // Activar la fila actual
for (byte c = 0; c < 4; c++) {
if (digitalRead(Columnas[c]) == LOW) { // Verificar si la columna está activa
if (digitalRead(Columnas[c]) == LOW) { // Verificar nuevamente después del debounce
fcol = f; // Guardar la fila detectada
cCol = c; // Guardar la columna detectada
digitalWrite(Filas[f], HIGH); // Desactivar la fila actual
return true; // Devolver true si se detectó una tecla
}
}
}
digitalWrite(Filas[f], HIGH); // Desactivar la fila actual si no se detectó ninguna tecla
}
return false; // Devolver false si no se detectó ninguna tecla
}