LT-5016M1を74HC595で制御します。文字スクロールなどの参考にどうぞ。

Dependencies:   mbed

制作の過程はNotebookに書いています。

main.cpp

Committer:
p4ken
Date:
2016-09-25
Revision:
10:68078d989f4e
Parent:
9:4efad95ffa53
Child:
11:b58fb852b918

File content as of revision 10:68078d989f4e:

#include "mbed.h"

DigitalOut RCK(PB_12);// 74HC595
DigitalOut G(PB_1);   // 74HC595
DigitalOut SER(PC_6); // 74HC164
DigitalOut CLK(PC_5); // 74HC164
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.format(8, 0);
    spi.frequency(100000000);
    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; i++){
            if(round < 10000) { 
                spi.write(pattern1[scan-1][8-1-i]);
            } else if(round < 20000) {
                spi.write(pattern2[scan-1][8-1-i]);
            } else {
                spi.write(pattern3[scan-1][8-1-i]);
            }
        }
        
        // スクロール
        if(round > 30000) { // スクロール速度
            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("%f\r\n", timer.read());
    }
}