Skip to content

Instantly share code, notes, and snippets.

@schreibfaul1
Created February 24, 2024 07:21
Show Gist options
  • Save schreibfaul1/9bdcd744b1b4c860366c664099b7565b to your computer and use it in GitHub Desktop.
Save schreibfaul1/9bdcd744b1b4c860366c664099b7565b to your computer and use it in GitHub Desktop.
MAX7219_ LED_7segm_8digits
#include "Arduino.h"
void display_start();
void DisplayText(char *text);
void setup() {
Serial.begin(115200);
display_start();
DisplayText("01234567");
}
void loop() {}
//****************************************************************************************************************************************************
// 7 S E G M E N T 8 D I G I T S MAX7219 D I S P L A Y *
//****************************************************************************************************************************************************
#define MAX_CS 21
#define MAX_DIN 22
#define MAX_CLK 17
#define SHUTDOWN_ADDR 12
#define DISPLAYTEST_ADDR 15
#define SCANLIMIT_ADDR 11
#define DECODEMODE_ADDR 9
#define BRIGHTNESS_ADDR 10
const byte ARRAY_SIZE = 23;
byte segment_codes[ARRAY_SIZE];
String available_chars[ARRAY_SIZE];
int indexOf(const char *base, char ch, int startIndex);
int findIndexOfChar(char character) {
char s[24] = {"0123456789abcdefHLPS-_ "};
int p = indexOf(s, character, 0);
if(p == -1) p = 22;
return p;
}
void MAX7219_Write(volatile byte opcode, volatile byte data) {
digitalWrite(MAX_CS, LOW);
shiftOut(MAX_DIN, MAX_CLK, MSBFIRST, opcode);
shiftOut(MAX_DIN, MAX_CLK, MSBFIRST, data);
digitalWrite(MAX_CS, HIGH);
}
void _clear() {
for(int i = 1; i <= 8; i++) { MAX7219_Write(i, segment_codes[21]); }
}
void DisplayText(char *text) {
_clear();
int s = strlen(text);
for(int i = 0; i < 8; i++) {
if(s < i) break;
int p = findIndexOfChar(text[i]);
MAX7219_Write(s - i, segment_codes[p]);
}
}
int indexOf(const char *base, char ch, int startIndex = 0) {
const char *p = base;
for(; startIndex > 0; startIndex--)
if(*p++ == '\0') return -1;
char *pos = strchr(p, ch);
if(pos == nullptr) return -1;
return pos - base;
}
void display_start() {
segment_codes[0] = 0b1111110; // 0
segment_codes[1] = 0b0110000; // 1
segment_codes[2] = 0b1101101; // 2
segment_codes[3] = 0b1111001; // 3
segment_codes[4] = 0b0110011; // 4
segment_codes[5] = 0b1011011; // 5
segment_codes[6] = 0b1011111; // 6
segment_codes[7] = 0b1110000; // 7
segment_codes[8] = 0b1111111; // 8
segment_codes[9] = 0b1111011; // 9
segment_codes[10] = 0b1110111; // a
segment_codes[11] = 0b0011111; // b
segment_codes[12] = 0b0001101; // c
segment_codes[13] = 0b0111101; // d
segment_codes[14] = 0b1001111; // e
segment_codes[15] = 0b1000111; // f
segment_codes[16] = 0b0110111; // H
segment_codes[17] = 0b0001110; // L
segment_codes[18] = 0b1100111; // P
segment_codes[19] = 0b0000001; // -
segment_codes[20] = 0b0001000; // _
segment_codes[21] = 0b0000000; // space
segment_codes[22] = 0b1001001; // unknown
pinMode(MAX_DIN, OUTPUT);
pinMode(MAX_CS, OUTPUT);
pinMode(MAX_CLK, OUTPUT);
MAX7219_Write(DISPLAYTEST_ADDR, 0);
MAX7219_Write(SCANLIMIT_ADDR, 8 - 1);
MAX7219_Write(DECODEMODE_ADDR, 0);
MAX7219_Write(BRIGHTNESS_ADDR, 4); // 0 ... 15
MAX7219_Write(SHUTDOWN_ADDR, 0x01);
_clear();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment