#include <SPI.h>
const uint8_t CS_PIN = 10;
const uint8_t MOSI_PIN = 11;
const uint8_t MISO_PIN = 13; //Solo es necesario para la configuración SPI, la pantalla no devuelve datos
const uint8_t SCK_PIN = 12;
//Definición de registros de la matriz led
const uint8_t MAX7219_REG_NOOP = 0x00;
const uint8_t MAX7219_REG_DIGIT0 = 0x01;
const uint8_t MAX7219_REG_DIGIT1 = 0x02;
const uint8_t MAX7219_REG_DIGIT2 = 0x03;
const uint8_t MAX7219_REG_DIGIT3 = 0x04;
const uint8_t MAX7219_REG_DIGIT4 = 0x05;
const uint8_t MAX7219_REG_DIGIT5 = 0x06;
const uint8_t MAX7219_REG_DIGIT6 = 0x07;
const uint8_t MAX7219_REG_DIGIT7 = 0x08;
const uint8_t MAX7219_REG_DECODE_MODE = 0x09;
const uint8_t MAX7219_REG_INTENSITY = 0x0A;
const uint8_t MAX7219_REG_SCAN_LIMIT = 0x0B;
const uint8_t MAX7219_REG_SHUTDOWN = 0x0C;
const uint8_t MAX7219_REG_DISPLAY_TEST = 0x0F;
uint8_t Ascendente;
uint8_t Valor;
const uint8_t ArregloFilasNumero1[7] = {0x4, 0x6, 0x5, 0x4, 0x4, 0x4, 0x4};
const uint8_t ArregloFilasNumero2[7] = {0x6, 0x9, 0x8, 0x4, 0x2, 0x1, 0xF};
const uint8_t ArregloFilasNumero3[7] = {0x7, 0x8, 0x8, 0x6, 0x8, 0x8, 0x7};
const uint8_t ArregloFilasNumero4[7] = {0x9, 0x9, 0x9, 0xF, 0x8, 0x8, 0x8};
const uint8_t ArregloFilasNumero5[7] = {0xF, 0x1, 0x1, 0x7, 0x8, 0x8, 0x7};
const uint8_t ArregloFilasNumero6[7] = {0x6, 0x9, 0x1, 0x7, 0x9, 0x9, 0x6};
const uint8_t ArregloFilasNumero7[7] = {0xF, 0x8, 0x4, 0x4, 0x4, 0x2, 0x1};
const uint8_t ArregloFilasNumero8[7] = {0x6, 0x9, 0x9, 0x6, 0x9, 0x9, 0x6};
const uint8_t ArregloFilasNumero9[7] = {0x6, 0x9, 0x9, 0xE, 0x8, 0x8, 0x8};
const uint8_t ArregloFilasNumero0[7] = {0x6, 0x9, 0x9, 0x9, 0x9, 0x9, 0x6};
void setup() {
Serial.begin(115200);
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, CS_PIN);
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH);
ComunicarConMax7219(MAX7219_REG_SCAN_LIMIT, 0x07); //Cuántas filas se utilizan
ComunicarConMax7219(MAX7219_REG_DECODE_MODE, 0x01); //Módo de representación de los leds, solo binario o decodificador de BCD primero
ComunicarConMax7219(MAX7219_REG_SHUTDOWN, 0x01); //Se prende la pantalla
ComunicarConMax7219(MAX7219_REG_INTENSITY, 0x0F); //Brillo de los leds
Ascendente = 1;
Valor = 1;
}
void loop() {
Serial.print("Imprimiendo número: ");
Serial.println(Valor);
LimpiarPantalla();
ImprimirNumeroEnMatrizLed(Valor);
delay(1000);
if(Ascendente){
if(Valor == 9){
Ascendente = 0;
Valor--;
}else{
Valor++;
}
}else{
if(Valor == 1){
Ascendente = 1;
Valor++;
}else{
Valor--;
}
}
}
void ComunicarConMax7219(uint8_t Registro,uint8_t Dato){
digitalWrite(CS_PIN, LOW); //Inicio de la comunicación
//Con SPI.transfer, se envía y recibe datos a la vez. El valor () es el que se envía del maestro al esclavo. Los roles se definen con la inicialización en setup
SPI.transfer(Registro); //Primero se indica la dirección del registro
SPI.transfer(Dato); //Se inidca el dato a mandar al registro
SPI.transfer(Registro); //Primero se indica la dirección del registro
SPI.transfer(~Dato); //Not bit a bit
digitalWrite(CS_PIN,HIGH); //Fin de la comunicación
}
void ImprimirNumeroEnMatrizLed(uint8_t Valor){
int Fila;
int ArregloFila[7];
switch(Valor){
case 1:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero1[i];
}
break;
case 2:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero2[i];
}
break;
case 3:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero3[i];
}
break;
case 4:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero4[i];
}
break;
case 5:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero5[i];
}
break;
case 6:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero6[i];
}
break;
case 7:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero7[i];
}
break;
case 8:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero8[i];
}
break;
case 9:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero9[i];
}
break;
case 0:
for(int i = 0; i < 7; i++){
ArregloFila[i] = ArregloFilasNumero0[i];
}
break;
default:
break;
}
for(Fila = 1; Fila <=7; Fila++){
ComunicarConMax7219(Fila,ArregloFila[Fila-1]);
//delay(100);
}
}
void LimpiarPantalla(){
for(int Fila = 1; Fila <=7; Fila++){
ComunicarConMax7219(Fila,0);
//delay(100);
}
}
//Comunicación SPI con la pantalla