// Lab07 - Angelo Oxsolon 20217398
#include <SPI.h>
#include <RTClib.h>
// Declaramos el objeto miRTC
RTC_DS1307 miRTC;
// Pines asignados para el protocolo SPI
const int CS_PIN = 10;
const int MOSI_PIN = 11;
const int MISO_PIN = 13;
const int 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
// Arreglo de segmentos para dígitos de 0 a 9 en un display de 7 segmentos
uint8_t numeros[10][7] = {
{0x0F, 9, 9, 9, 9, 9, 0x0F}, // 0
{8, 0x0C, 0x0A, 8, 8, 8, 8}, // 1
{0x0F, 8, 0x0F, 1, 1, 1, 0x0F}, // 2
{0x0F, 8, 0x0F, 8, 8, 8, 8}, // 3
{8, 0x0C, 0x0A, 8, 8, 8, 8}, // 4
{8, 0x0C, 0x0A, 8, 8, 8, 8}, // 5
{0x0F, 8, 0x0A, 8, 8, 8, 8}, // 6
{8, 0x0C, 0x0A, 8, 8, 8, 8}, // 7
{0x0F, 8, 0x0A, 8, 8, 8, 8}, // 8
{0x0F, 8, 0x0A, 8, 8, 8, 8} // 9
};
void setup() {
Serial.begin(115200); // Inicializamos comunicación serial
miRTC.begin(); // Inicializamos el RTC
// Ajustamos la hora y fecha según el enunciado [19:16] del 9 de octubre del 2024
miRTC.adjust(DateTime(2024, 10, 9, 19, 16, 0));
// Configurar el protocolo SPI
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, CS_PIN);
pinMode(CS_PIN, OUTPUT);
digitalWrite(CS_PIN, HIGH); // Desactivar el chip select por defecto
// Configuraciones iniciales del MAX7219
sendToMax7219(MAX7219_REG_SCANLIMIT, 0x07); // Usar todos los dígitos (0-7)
sendToMax7219(MAX7219_REG_DECODEMODE, 0x00); // Sin decodificación BCD
sendToMax7219(MAX7219_REG_SHUTDOWN, 0x01); // Salir del modo shutdown
sendToMax7219(MAX7219_REG_INTENSITY, 0x0F); // Máxima intensidad (0x00 a 0x0F)
}
void loop() {
DateTime now = miRTC.now(); // Obtener la hora actual del RTC
uint8_t minuto = now.minute();
uint8_t decenas = minuto / 10; // Obtener las decenas del minuto
uint8_t unidades = minuto % 10; // Obtener las unidades del minuto
// Mostrar los dígitos de los minutos en el MAX7219
mostrarMinuto(decenas, unidades);
delay(60000); // Actualizar cada minuto
}
// Función para enviar datos al MAX7219 por protocolo SPI
void sendToMax7219(uint8_t reg, uint8_t data) {
digitalWrite(CS_PIN, LOW); // Seleccionar el dispositivo (CS bajo)
SPI.transfer(reg); // Enviar registro
SPI.transfer(data); // Enviar dato
digitalWrite(CS_PIN, HIGH); // Deseleccionar el dispositivo (CS alto)
}
// Función para mostrar el minuto en el MAX7219
void mostrarMinuto(uint8_t decenas, uint8_t unidades) {
for (int i = 0; i < 7; i++) {
// Mostrar decenas en la parte izquierda y unidades en la parte derecha
uint8_t data = (numeros[decenas][i] << 4) | numeros[unidades][i];
sendToMax7219(i + 1, data);
}
}