#include "stm32c0xx.h"
#include "stm32c0xx_hal.h"
#include <stdio.h>
const uint8_t DANIEL[6][8] = {
{0XFF, 0XFF, 0X18, 0X18, 0X18, 0X18, 0X1F, 0X1F}, // J
{0xFF, 0x03, 0x03, 0xFF, 0xFF, 0x03, 0x03, 0xFF}, // E
{0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0xFF, 0xFF}, // S
{0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xC3, 0xFF, 0xFF}, // U
{0xFF, 0xFF, 0x01, 0xFF, 0xFF, 0x80, 0xFF, 0xFF}, // S
{0x00, 0x66, 0xFF, 0xFF, 0xFF, 0x7E, 0x3C, 0x18} // LOVES U
};
// MAX7219 REGISTER MAP
typedef enum {
MAX7219_REG_NOOP = 0x00,
MAX7219_REG_DIGIT0 = 0x01,
MAX7219_REG_DIGIT1 = 0x02,
MAX7219_REG_DIGIT2 = 0x03,
MAX7219_REG_DIGIT3 = 0x04,
MAX7219_REG_DIGIT4 = 0x05,
MAX7219_REG_DIGIT5 = 0x06,
MAX7219_REG_DIGIT6 = 0x07,
MAX7219_REG_DIGIT7 = 0x08,
MAX7219_REG_DECODE = 0x09,
MAX7219_REG_INTENSITY = 0x0A,
MAX7219_REG_SCANLIMIT = 0x0B,
MAX7219_REG_SHUTDOWN = 0x0C,
MAX7219_REG_DISPLAYTEST = 0x0F
} MAX7219_Registers;
typedef enum {
CS_PIN = 4, CLK_PIN = 5, DATA_PIN = 6
} MAX7219_Pins;
typedef union {
uint16_t raw;
struct {
uint16_t data:8;
uint16_t address:4;
uint16_t unused:4;
} fields;
} MAX7219_cmd;
/*
* Here you initialize all the functions that you create
*/
// Initializing the LCD by using TEST MODE
void MAX7219_INIT(MAX7219_cmd cmd);
void SEND_MAX7219_CMD(uint16_t command_word);
// Initialize GPIO
void GPIO_Init() {
RCC->IOPENR |= RCC_IOPENR_GPIOAEN; // Enable GPIOA clock
// Set PA4,5,6 as output
GPIOA->MODER &= ~(GPIO_MODER_MODE4 | GPIO_MODER_MODE5 | GPIO_MODER_MODE6);
GPIOA->MODER |= (GPIO_MODER_MODE4_0 | GPIO_MODER_MODE5_0 | GPIO_MODER_MODE6_0);
// Initial states
GPIOA->ODR |= (1 << CS_PIN) | (1 << CLK_PIN); // CS and CLK high
GPIOA->ODR &= ~(1 << DATA_PIN); // DATA low
}
int main(void) {
HAL_Init();
// Configure the system clock
SystemClock_Config();
GPIO_Init();
// printf("GPIO Initialized\n");
MAX7219_cmd cmd;
MAX7219_INIT(cmd);
while(1){
for (uint8_t col = 0; col < 6; col++) {
for (uint8_t row = 0; row < 8; row++) {
cmd.fields.address = row + 1;
cmd.fields.data = DANIEL[col][row];
SEND_MAX7219_CMD(cmd.raw);
}
HAL_Delay(1000); // 1-second delay
}
};
}
void MAX7219_INIT(MAX7219_cmd cmd) {
/*
* Note that the LCD is initialize in shutdown mode, based on
* the documentation
*/
//1. Wake up from shutdown
cmd.fields.address = MAX7219_REG_SHUTDOWN;
cmd.fields.data = 0x01;
SEND_MAX7219_CMD(cmd.raw);
//2. SET SCAN LIMIT
cmd.fields.address = MAX7219_REG_SCANLIMIT;
cmd.fields.data = 0x07;
SEND_MAX7219_CMD(cmd.raw);
//3. Disable BCD
cmd.fields.address = MAX7219_REG_DECODE;
cmd.fields.data = 0x00;
SEND_MAX7219_CMD(cmd.raw);
//4. Set brightness
cmd.fields.address = MAX7219_REG_INTENSITY;
cmd.fields.data = 0x0F; // Max brightness
SEND_MAX7219_CMD(cmd.raw);
}
void SEND_MAX7219_CMD(uint16_t command_word){
//PIN was high, then set to 0
GPIOA->ODR &= ~(1 << CS_PIN);
//Loop through the data, starting with the MSB
for (int8_t i=15; i>=0; i--) {
//set CLk to low
GPIOA->ODR &= ~(1 << CLK_PIN);
if (command_word & (1 << i)) {
GPIOA->ODR |= (1 << DATA_PIN);
} else {
GPIOA->ODR &= ~(1 << DATA_PIN);
}
// delayMicroseconds(50);
GPIOA->ODR |= (1 << CLK_PIN);
// delayMicroseconds(50);
}
//Pin is 0, then set to 1
GPIOA->ODR |= (1<< CS_PIN);
// delayMicroseconds(100);
}
Loading
st-nucleo-c031c6
st-nucleo-c031c6