diff --git a/examples/max7219_8x8/Makefile b/examples/max7219_8x8/Makefile new file mode 100644 index 0000000..a2e7c00 --- /dev/null +++ b/examples/max7219_8x8/Makefile @@ -0,0 +1,3 @@ +PROGRAM = max7219_8x8 +EXTRA_COMPONENTS = extras/max7219 +include ../../common.mk diff --git a/examples/max7219_8x8/digit_font.h b/examples/max7219_8x8/digit_font.h new file mode 100644 index 0000000..3ee2aa2 --- /dev/null +++ b/examples/max7219_8x8/digit_font.h @@ -0,0 +1,95 @@ +const uint8_t DIGITS[][8] = { + { + 0x0, + 0x3c, + 0x66, + 0x6e, + 0x76, + 0x66, + 0x66, + 0x3c + }, { + 0x0, + 0x18, + 0x18, + 0x38, + 0x18, + 0x18, + 0x18, + 0x7e + }, { + 0x0, + 0x3c, + 0x66, + 0x6, + 0xc, + 0x30, + 0x60, + 0x7e + }, { + 0x0, + 0x3c, + 0x66, + 0x6, + 0x1c, + 0x6, + 0x66, + 0x3c + }, { + 0x0, + 0xc, + 0x1c, + 0x2c, + 0x4c, + 0x7e, + 0xc, + 0xc + }, { + 0x0, + 0x7e, + 0x60, + 0x7c, + 0x6, + 0x6, + 0x66, + 0x3c + }, { + 0x0, + 0x3c, + 0x66, + 0x60, + 0x7c, + 0x66, + 0x66, + 0x3c + }, { + 0x0, + 0x7e, + 0x66, + 0xc, + 0xc, + 0x18, + 0x18, + 0x18 + }, { + 0x0, + 0x3c, + 0x66, + 0x66, + 0x3c, + 0x66, + 0x66, + 0x3c + }, { + 0x0, + 0x3c, + 0x66, + 0x66, + 0x3e, + 0x6, + 0x66, + 0x3c + } +}; + +const int DIGITS_LEN = sizeof(DIGITS)/8; diff --git a/examples/max7219_8x8/main.c b/examples/max7219_8x8/main.c new file mode 100644 index 0000000..9610846 --- /dev/null +++ b/examples/max7219_8x8/main.c @@ -0,0 +1,48 @@ +/* + * Example of using MAX7219 driver with 8x8 LED Matrix displays + * + * MAX7219 driver uses the hardware SPI bus, so connect with pinout: + * DIN -> HSPID/HMOSI + * CS -> HSPICS/HCS + * CLK -> HSPICLK/HSCLK + */ +#include +#include +#include +#include +#include +#include + +#include "./digit_font.h" + +#define CS_PIN 15 +#define DELAY 1000 + +static max7219_display_t disp = { + .cs_pin = CS_PIN, + .digits = 8, + .cascade_size = 4, + .mirrored = false +}; + +void user_init(void) { + uart_set_baud(0, 115200); + printf("SDK version:%s\n", sdk_system_get_sdk_version()); + + max7219_init(&disp); + //max7219_set_decode_mode(&disp, true); + + uint8_t counter = 0; + while (true) { + max7219_clear(&disp); + + max7219_draw_image_8x8(&disp, 0, DIGITS[counter % 10]); + max7219_draw_image_8x8(&disp, 1, DIGITS[(counter+1) % 10]); + max7219_draw_image_8x8(&disp, 2, DIGITS[(counter+2) % 10]); + max7219_draw_image_8x8(&disp, 3, DIGITS[(counter+3) % 10]); + + vTaskDelay(DELAY / portTICK_PERIOD_MS); + + counter++; + } +} diff --git a/extras/max7219/max7219.c b/extras/max7219/max7219.c index 34ad069..2b84028 100644 --- a/extras/max7219/max7219.c +++ b/extras/max7219/max7219.c @@ -119,7 +119,7 @@ void max7219_set_shutdown_mode(const max7219_display_t *disp, bool shutdown) bool max7219_set_digit(const max7219_display_t *disp, uint8_t digit, uint8_t val) { - if (digit >= disp->digits) + if (digit >= (disp->digits * disp->cascade_size)) { debug("Invalid digit: %d", digit); return false; @@ -187,3 +187,9 @@ void max7219_draw_text(const max7219_display_t *disp, uint8_t pos, const char *s s++; } } + +void max7219_draw_image_8x8(const max7219_display_t *disp, uint8_t pos, const void *image) +{ + for (uint8_t i = (pos * disp->digits), offset = 0; i < (disp->digits * disp->cascade_size) && offset < 8; i++, offset++) + max7219_set_digit(disp, i, *((uint8_t *)image + offset)); +} diff --git a/extras/max7219/max7219.h b/extras/max7219/max7219.h index 59756d4..e2d4175 100644 --- a/extras/max7219/max7219.h +++ b/extras/max7219/max7219.h @@ -88,6 +88,14 @@ void max7219_clear(const max7219_display_t *disp); */ void max7219_draw_text(const max7219_display_t *disp, uint8_t pos, const char *s); +/** + * Draw 64-bit image on 8x8 matrix. + * @param disp Pointer to display descriptor + * @param pos Start digit + * @param image 64-bit buffer with image data + */ +void max7219_draw_image_8x8(const max7219_display_t *disp, uint8_t pos, const void *image); + #ifdef __cplusplus } #endif