Skip to content

Instantly share code, notes, and snippets.

@Tamakichi
Last active July 8, 2019 11:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tamakichi/72a15b2ffc2c8d04c96a38db414831ab to your computer and use it in GitHub Desktop.
Save Tamakichi/72a15b2ffc2c8d04c96a38db414831ab to your computer and use it in GitHub Desktop.
MAX7179ドライバーライブラリ動作チェック 32x16ドットバージョン
// max7219_test3a.ino
// MAX7179ドライバーライブラリ動作チェック 32x16ドットバージョン
// 改良版 2019/07/09 たま吉さん
#include <string.h>
#include <sdfonts.h>
#include "MAX7219_matrix.h"
#include "libmatrix.h"
// MAX7219接続
#define MAX7219_DIN 2 // DIN
#define MAX7219_CLK 4 // CLK
#define MAX7219_LOAD 3 // LOAD(CS)
// SDカード接続
#define MOSI_SD 11 // SDカードのMOISへ接続
#define MISO_SD 12 // SDカードのMISOへ接続
#define CLK_SD 13 // SDカードのCLKへ接続
#define CS_SD 10 // SDカードモジュールCSへ接続
// LEDマトリックスの定義
#define MODULE1x2 1 // 4連モジュール 横1x縦2 (横32x16ドット)
#define MODULE1x3 0 // 4連モジュール 横1x縦3 (横32x24ドット)
#define MODULE1x4 0 // 4連モジュール 横1x縦4 (横32x32ドット)
#if MODULE1x2
#define SCREENS 8 // MAX7219カスケード接続数
#define SC_WIDTH 32 // マトリック表示横ドット数
#define SC_HIGHT 16 // マトリック表示縦ドット数
#elif MODULE1x3
#define SCREENS 12 // MAX7219カスケード接続数
#define SC_WIDTH 32 // マトリック表示横ドット数
#define SC_HIGHT 24 // マトリック表示縦ドット数
#elif MODULE1x4
#define SCREENS 16 // MAX7219カスケード接続数
#define SC_WIDTH 32 // マトリック表示横ドット数
#define SC_HIGHT 32 // マトリック表示縦ドット数
#endif
#define BRT 1 // LEDの輝度(0~7)
#define MXFONTZISE 16 // 表示フォントサイズ
uint8_t fbuf[SC_WIDTH*SC_HIGHT/8]; // 表示用バッファ
// 表示用バッファを表示
void update_screen() {
uint8_t* ptr = MAX7219_getBuffer(); //
for (uint8_t i=0; i < 8; i++) { // 1個あたりのマトリックスの縦ライン数分のループ
for (uint8_t j=0; j < SC_HIGHT/8; j++) {
memcpy(&ptr[i*SCREENS+4*j], &fbuf[i*4+32*(SC_HIGHT/8-j-1)], 4);
}
}
#if 0
#if MODULE1x2 // (フレームバッファ32x16ドットをMAX7219用バッファ64x8にマッピング)
for (uint8_t i=0; i < 8; i++) { // 1個あたりの4連マトリックスの縦ライン数分のループ
memcpy(&ptr[i*SCREENS+0], &fbuf[i*4+32], 4); // 1個目の4連マトリックス
memcpy(&ptr[i*SCREENS+4], &fbuf[i*4], 4); // 2個目の4連マトリックス
}
#elif MODULE1x3
for (uint8_t i=0; i < 8; i++) { // 1個あたりの4連マトリックスの縦ライン数分のループ
memcpy(&ptr[i*SCREENS+0], &fbuf[i*4+64], 4); // 1個目の4連マトリックス
memcpy(&ptr[i*SCREENS+4], &fbuf[i*4+32], 4); // 2個目の4連マトリックス
memcpy(&ptr[i*SCREENS+8], &fbuf[i*4+ 0], 4); // 3個目の4連マトリックス
}
#elif MODULE1x4
for (uint8_t i=0; i < 8; i++) { // 1個あたりの4連マトリックスの縦ライン数分のループ
memcpy(&ptr[i*SCREENS+0], &fbuf[i*4+96], 4); // 1個目の4連マトリックス
memcpy(&ptr[i*SCREENS+4], &fbuf[i*4+64], 4); // 2個目の4連マトリックス
memcpy(&ptr[i*SCREENS+8], &fbuf[i*4+32], 4); // 3個目の4連マトリックス
memcpy(&ptr[i*SCREENS+12],&fbuf[i*4+ 0], 4); // 4個目の4連マトリックス
}
#endif
#endif
MAX7219_update();
}
void demo1(char *str) {
uint8_t font[MAXFONTLEN];
SDfonts.open();
SDfonts.setFontSize(16);
for (uint8_t n=0; n<2; n++) {
str = SDfonts.getFontData(font, str);
for (uint8_t x= 0; x <2; x++)
for (uint8_t y=0; y<16; y++)
fbuf[y*4+x+n*2] = font[y*2+x];
}
update_screen();
SDfonts.close();
}
void demo2(char *str, uint8_t fsize=16, uint8_t y=0,uint8_t cls=1,uint8_t up=1) {
uint8_t font[MAXFONTLEN];
uint8_t fw,fh,pos=0;
SDfonts.open();
SDfonts.setFontSize(fsize);
if (cls)
memset(fbuf,0,64);
while (*str) {
str = SDfonts.getFontData(font, str);
fw = SDfonts.getWidth();
fh = SDfonts.getHeight();
setBitmapAt(fbuf, SC_WIDTH, SC_HIGHT, pos, y, font, fw, fh);
pos+= fw;
}
if (up)
update_screen();
SDfonts.close();
}
// デモ
void demo() {
uint8_t font[MAXFONTLEN];
if(SDfonts.open()) { // フォントのオープン
Serial.println("Cannot open font's file");
}
SDfonts.setFontSize(MXFONTZISE); // フォントサイズの設定
char* str = "Saitama こんにちは埼玉県!熱いぞ!埼玉県!";
MAX7219_clear();
while(1) {
str = SDfonts.getFontData(font, str); // フォントデータの取得
if (!*str)
break;
scrollInFont(fbuf, font, SDfonts.getWidth(), SDfonts.getHeight(), 30);
}
SDfonts.close();
}
// 1文字分スクロール挿入表示
void scrollInFont(uint8_t*ptr, uint8_t *fnt, uint8_t fw, uint8_t fh, uint16_t dt) {
for (int8_t t = 0; t < fw; t++) {
scrollBitmap(ptr, SC_WIDTH, SC_HIGHT, B0001); // 左スクロール
clearBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, fw, fh);
setBitmapAt(ptr, SC_WIDTH, SC_HIGHT, SC_WIDTH-t-1, 0, fnt, fw, fh);
update_screen();
delay(dt);
}
}
void setup() {
Serial.begin(115200);
if(SDfonts.init(CS_SD)) { // フォント管理の初期化
Serial.println("Cannot initialize SDfont library.");
} else {
Serial.println("Start.");
}
// マトリック表示ドライバの初期化
MAX7219_init(MAX7219_DIN, MAX7219_CLK, MAX7219_LOAD, SCREENS, BRT);
}
void loop() {
MAX7219_clear();
demo2("回送");
delay(1000);
demo2("急行");
delay(1000);
demo2("埼玉");
delay(1000);
demo2("ABCD");
delay(1000);
demo2("八王子",10,3);
delay(1000);
demo2("JR中央線",8,0,1,0);
demo2("西国分寺",8,8,0);
delay(1000);
demo();
delay(1000);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment