p4 ken
/
LED_Matrix_Japanese_Scroll
LT-5016M1を74HC595で制御します。文字スクロールなどの参考にどうぞ。
制作の過程はNotebookに書いています。
main.cpp
- Committer:
- p4ken
- Date:
- 2016-10-02
- Revision:
- 20:29dc4a331254
- Parent:
- 19:7ba73bd55ca5
- Child:
- 21:bbb751c5d846
File content as of revision 20:29dc4a331254:
#include "mbed.h" DigitalOut RCK(PB_12);// 74595 DigitalOut G(PB_1); // 74595 DigitalOut SER(PC_6); // 74164 DigitalOut CLK(PC_5); // 74164 DigitalIn BUTTON(USER_BUTTON); Serial pc(USBTX, USBRX); Timer timer; // 経過時間デバッグ用 // 点灯パターン 手前赤、手前緑... unsigned char pattern1[16][8] = // 手前赤、手前緑... // 緑「次は」 {{0,128,0,0,0,0,0,0}, {0,129,0,0,0,0,0,6}, {0,130,0,0,0,0,0,4}, {0,68,0,32,0,4,0,4}, {0,192,0,127,0,36,0,124}, {0,72,0,34,0,196,0,7}, {0,40,0,18,0,2,0,4}, {0,36,0,18,0,2,0,4}, {0,4,0,2,0,2,0,4}, {0,4,0,5,0,2,0,4}, {0,3,0,5,0,2,0,4}, {0,130,0,8,0,202,0,15}, {0,130,0,8,0,42,0,52}, {0,66,0,16,0,68,0,68}, {0,48,0,32,0,132,0,7}, {0,12,0,64,0,0,0,0}}; unsigned char pattern2[16][8] = // 橙「横浜」 {{8,8,9,9,2,2,24,24}, {8,8,73,73,4,4,7,7}, {200,200,127,127,200,200,0,0}, {8,8,9,9,64,64,0,0}, {63,63,73,73,65,65,64,64}, {200,200,127,127,194,194,127,127}, {8,8,4,4,72,72,8,8}, {156,156,63,63,72,72,8,8}, {170,170,36,36,68,68,8,8}, {138,138,36,36,68,68,8,8}, {137,137,63,63,67,67,72,72}, {136,136,36,36,242,242,127,127}, {136,136,36,36,2,2,0,0}, {136,136,63,63,130,130,16,16}, {8,8,17,17,98,98,32,32}, {232,232,96,96,26,26,64,64}}; unsigned char pattern3[16][8] = // 赤「終点」 {{4,0,1,0,64,0,0,0}, {4,0,9,0,64,0,32,0}, {18,0,31,0,192,0,63,0}, {145,0,8,0,64,0,0,0}, {138,0,8,0,64,0,0,0}, {68,0,5,0,252,0,31,0}, {18,0,5,0,4,0,16,0}, {17,0,10,0,4,0,16,0}, {31,0,17,0,4,0,16,0}, {196,0,96,0,4,0,16,0}, {53,0,6,0,252,0,31,0}, {21,0,8,0,0,0,0,0}, {149,0,17,0,36,0,18,0}, {21,0,6,0,68,0,36,0}, {5,0,8,0,66,0,68,0}, {4,0,16,0,65,0,68,0}}; char scan = 16; // 点灯中の行 int round = 0; // スキャンを何周したか int scroll = 0; // 左スクロールした量 void receive() { if(pc.getc() == 0b00000001) pc.printf("received!\r\n"); // pc.putc(pc.getc() + 1); // echo } int main() { SPI spi(PB_15, PB_14, PB_13); // SPIピンの指定 spi.format(8, 0); // 74595へ8ビットずつ送る spi.frequency(96/16*1000*1000); // 74595へのクロック周波数 pc.attach(receive, Serial::RxIrq); timer.start(); // 経過時間デバッグ用 while(1) { timer.reset(); // 行選択 scan++; // 一行進む if(scan == 17) { // 16行目の次 SER = 0; // 点灯 scan = 1; // 1行目に戻る round++; // スキャンが1周した } else if(scan == 2) { // 2行目 SER = 1; // 消灯 } // 表示パターン送り込み for(int i=0; i<8*2; i++){ if(round < 5000) { spi.write(pattern1[scan-1][8-1-i%8]); } else if(round < 10000) { spi.write(pattern2[scan-1][8-1-i%8]); } else { spi.write(pattern3[scan-1][8-1-i%8]); } } // スクロール if(round > 15000) { // スクロール速度 scroll++; // 1ドットスクロールする round = 0; // スキャン周回カウントリセット } if(scroll > 32) { // スクロール幅 scroll = 0; // スクロール数リセット } RCK = 0; CLK = 0; G = 1; // 消灯 RCK = 1; CLK = 1; // ここまでの処理時間が長いほど明るくなる while(timer.read_us()<0) { // 数字のぶんだけ暗くする wait_us(10); } G = BUTTON; // ボタン押すと点灯 // ダイナミック点灯のパルス幅を決める while(timer.read_us()<100) { // 100*2500でゆっくり wait_us(10); } // pc.printf("%d\r\n", timer.read_us()); // pc.printf("%d\r\n", round/100); } }