/*************************************************************************/
/***** PONTIFICIA UNIVERSIDAD CATÓLICA DEL PERÚ *****/
/***** FACULTAD DE CIENCIAS E INGENIERÍA *****/
/***** SISTEMAS DIGITALES B *****/
/*************************************************************************/
/***** Tema: Protocolo SPI *****/
/***** Proyecto: SPI_MAX7219 *****/
/*************************************************************************/
/***** EvalBoard: ESP32 S3 DevKitC C1 *****/
/***** Autor: Wilver Aldo Ramírez Huamán *****/
/***** Fecha: octubre 2024 *****/
/*************************************************************************/
/***** Enunciado: *****/
/***** Tenemos un sistema formado por un SoC ESP32-S3 y una matriz *****/
/***** LED MAX7219. El programa transmite datos para encender los *****/
/***** leds de la matriz mediante el protocolo SPI. Se debe *****/
/***** transferir para cada fila, el dato, de manera que se usen *****/
/***** las primeras 7 filas de la matriz y que se visualice el *****/
/***** numero 3 en la matriz LED. Dicho numero tendra una dimension *****/
/***** de 4x7 LEDs de la matriz. *****/
/***** *****/
/***** pines: CS_PIN = 10, MOSI_PIN = 11, *****/
/***** MISO_PIN = 13 y SCK_PIN = 12 *****/
/*************************************************************************/
#include <SPI.h>
// Pines asignados para el protocolo SPI
const uint8_t CS_PIN = 10;
const uint8_t MOSI_PIN = 11;
const uint8_t MISO_PIN = 13;
const uint8_t SCK_PIN = 12;
// Registros de la matriz LED MAX7219
#define MAX7219_REG_NOOP 0x00
#define MAX7219_REG_DIGIT0 0x01
#define MAX7219_REG_DIGIT1 0x02
#define MAX7219_REG_DIGIT2 0x03
#define MAX7219_REG_DIGIT3 0x04
#define MAX7219_REG_DIGIT4 0x05
#define MAX7219_REG_DIGIT5 0x06
#define MAX7219_REG_DIGIT6 0x07
#define MAX7219_REG_DIGIT7 0x08
#define MAX7219_REG_DECODEMODE 0x09
#define MAX7219_REG_INTENSITY 0x0A
#define MAX7219_REG_SCANLIMIT 0x0B
#define MAX7219_REG_SHUTDOWN 0x0C
#define MAX7219_REG_DISPLAYTEST 0x0F
void setup() {
// Configurar pines SPI
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, CS_PIN);
// Configurar el pin CS
pinMode(CS_PIN, OUTPUT); // Pin CS configurado como salida
digitalWrite(CS_PIN, HIGH); // Desactivar el chip select
// Inicializar el MAX7219
// Utilizará las filas o dígitos del 0 al 7
sendToMax7219(MAX7219_REG_SCANLIMIT, 0x07);
// Con decodificación BCD
sendToMax7219(MAX7219_REG_DECODEMODE, 0x01);
// modo operacional
sendToMax7219(MAX7219_REG_SHUTDOWN, 0x01);
// Máxima intensidad (0x00 a 0x0F)
sendToMax7219(MAX7219_REG_INTENSITY, 0x0F);
}
void loop() {
// Enviar las filas o digitos
// luego de enviar los leds de cada fila que se encenderan
// se podrá visualizar la formación del numero 3 en la matriz 8x8 LED
for (int i = 0; i < 7; i++) { // Recorremos las 7 filas
if(i == 0 || i == 6){
sendToMax7219(i + 1, 7 ); // número 7 en binario a filas 1 y 7
}
else if(i == 1 || i == 2 || i == 4 || i == 5){
sendToMax7219(i + 1, 8 ); // número 8 en binario a filas 2,3,5 y 6
}else{
sendToMax7219(i + 1, 6 ); // número 6 en binario a fila 4
}
delay(200);
}
}
// Función para enviar datos al MAX7219 por protocolo PSI
void sendToMax7219(uint8_t registro, uint8_t data) {
digitalWrite(CS_PIN, LOW); // Seleccionar el dispositivo (CS bajo)
SPI.transfer(registro); // Enviar registro a comunicar
SPI.transfer(data); // Enviar dato a escribir en registro
digitalWrite(CS_PIN, HIGH); // Deseleccionar el dispositivo (CS alto)
}