Last active
July 8, 2019 11:51
-
-
Save Tamakichi/72a15b2ffc2c8d04c96a38db414831ab to your computer and use it in GitHub Desktop.
MAX7179ドライバーライブラリ動作チェック 32x16ドットバージョン
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// 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