#include "hal.h"
#include <string.h>
#include "bitmap.h"
#define DIN A_0
#define CLK A_1
#define CS A_2
#define HW_DELAY() for(volatile uint8_t d=0; d<2; d++)
// display buffer is called static buffer
volatile uint8_t static_buffer[64]={0};
void setup() {
max7219_init();
load_static_buffer("ETAL1234");
refresh_display();
}
void loop() {
// put your main code here, to run repeatedly:
}
void cs_active()
{
pin_drive_out(CS, 0);
}
void cs_idle()
{
pin_drive_out(CS, 1);
}
void clk_low()
{
pin_drive_out(CLK, 0);
}
void clk_high()
{
pin_drive_out(CLK, 1);
}
void write_byte(volatile uint8_t u_byte)
{
for (uint8_t i = 0; i < 8; i++)
{
(u_byte & 0x80) ? (pin_drive_out(DIN, 1)) : (pin_drive_out(DIN, 0));
HW_DELAY();
u_byte <<= 1;
clk_high();
HW_DELAY();
clk_low();
}
}
void send(uint8_t matrix_addr, uint8_t matrix_data)
{
cs_active();
for(uint8_t i=0;i<8;i++)
{
write_byte(matrix_addr);
write_byte(matrix_data);
}
cs_idle();
}
void max7219_init() {
init_pin(CLK, output);
init_pin(DIN, output);
init_pin(CS, output);
clk_low();//make clk low while initialization
cs_idle();//make CS idle while initialization
send(0x09, 0x00); // Decode Mode: No decode (Matrix mode)
send(0x0A, 0x03); // Intensity: 3/15 brightness
send(0x0B, 0x07); // Scan Limit: Display all 8 rows (0-7)
send(0x0C, 0x01); // Shutdown: 0x01 = Normal Operation
send(0x0F, 0x00); // Display Test: 0x00 = Off
// Clear the matrix initially
for (uint8_t i = 1; i <= 8; i++) {
send(i, 0x00);
}
}
void load_static_buffer(volatile uint8_t* str)
{
for(uint8_t m = 0; m < 8; m++)
{
volatile uint8_t *curr_char=fetch_char_data(str[m]);
volatile uint8_t matrix_off=m*8;
for (uint8_t i = 0; i < 8; i++)
{
static_buffer[matrix_off+i] = curr_char[i];
}
}
}
void refresh_display()
{
for (uint8_t row = 1; row < 9; row++)
{
cs_active();
for (uint8_t m = 0; m < 8; m++)
{
write_byte(row);
write_byte(static_buffer[(m * 8) + (row - 1)]);
}
cs_idle();
}
}