2016年12月13日火曜日

マトリックスLEDで遊ぶ その2

前回秋月のマトリックスLEDで一列ごとにスクロールさせるプログラムを作ってみました.
今回はさらに文字をスクロールさせて遊んでみることにします.

ダイナミック点灯にはタイマ割り込みを使用しました.

Ticker name; タイマ初期化
name.attach(&fptr,time);  で使用します.
簡単ですね.私はRenesasのRXマイコンを使用したことがありますが,
そこでは割り込み発生にも苦労しました.

今回は100usの割り込みを発生させ,900us点灯->100us消灯->列をずらす処理に
しました.割り込み周期等は完全に感覚です.


スクロール処理は表示部分8bit×8とバッファ8bit×8を用意し,バッファすべてを表示させたら
次の文字をバッファに読み込むという処理です.これはメインループ.
真夜中に作ったもんで頭が回らず自分で見てもあんまりいいプログラムではないです.何回 i 使うんだ(笑) 一応メモ用に公開しておきます.

#include "mbed.h"
#include "dots.h"

BusOut row(dp27,dp13,dp5,dp14,dp9,dp11,dp6,dp10);     //Row Cathode
//BusOut col(dp25,dp2,dp1,dp28,dp4,dp26,dp18,dp17);     //Col Anode
BusOut col(dp17,dp18,dp26,dp4,dp28,dp1,dp2,dp25);     //Col Anode

Ticker led_ctrl;    //LED点滅
uint16_t    out_col=0,out_row=1,st_led=0;

uint8_t pat[8];  //LED表示パターン
uint8_t pat_buf[8];  //LED表示次パターン

//LED点滅用割り込み
void led_out(){
    switch(st_led){
        case 0: row = ~out_row;
                col = pat[out_col];
                out_row*=2;
                out_col++;
                if(out_row>255){
                    out_row=1;
                    out_col=0;
                }
                break;
        case 10: col=0x00;
                break;
             
        default:break;
    }
    st_led++;
    if(st_led>10) st_led=0;
}

int main() {
    int i,j;
    int shift=0;
    row = 0x00;    //COL初期化
    col = 0x00;    //ROW初期化
    led_ctrl.attach_us(&led_out,100);
 
    //配列初期化
    for(i=0;i<8;i++){
        pat[i] = 0x00;
    }
 
    //表示配列初期化
    for(i=0;i<8;i++){
        pat_buf[i] = h[i];
    }
 
    while(1){
        for(i=0;i<8;i++){
            //配列シフト
            for(j=0;j<7;j++){
                pat[j] = pat[j+1];
            }
            pat[7]=pat_buf[0];  //末尾に代入
            //配列バッファシフト
            for(j=0;j<7;j++){
                pat_buf[j] = pat_buf[j+1];
            }
            wait(0.25);
        }
     
        //表示させたいパターンを挿入
        shift++;
        if(shift>6) shift=0;
        switch(shift){
            case 0: for(i=0;i<8;i++){ pat_buf[i] = h[i];}
                    break;
                 
            case 1: for(i=0;i<8;i++){ pat_buf[i] = e[i];}
                    break;
                 
            case 2: for(i=0;i<8;i++){ pat_buf[i] = l[i];}
                    break;
                 
            case 3: for(i=0;i<8;i++){ pat_buf[i] = l[i];}
                    break;
                 
            case 4: for(i=0;i<8;i++){ pat_buf[i] = o[i];}
                    break;
                 
            case 5: for(i=0;i<8;i++){ pat_buf[i] = ex[i];}
                    break;
                 
            case 6: for(i=0;i<8;i++){ pat_buf[i] = 0x00;}
                    break;
         
            default:break;
        }
    }
}

今回の表示パターン

uint8_t h[8]= {
    0xc6,
    0xc6,
    0xc6,
    0xfe,
    0xc6,
    0xc6,
    0xc6,
    0x00
};

uint8_t e[8]= {
    0xfe,
    0xc0,
    0xc0,
    0xfc,
    0xc0,
    0xc0,
    0xfe,
    0x00
};

uint8_t l[8]= {
    0xc0,
    0xc0,
    0xc0,
    0xc0,
    0xc0,
    0xc0,
    0xfe,
    0x00
};

uint8_t o[8]= {
    0x7c,
    0xc6,
    0xc6,
    0xc6,
    0xc6,
    0xc6,
    0x7c,
    0x00
};

uint8_t ex[8]= {
    0x66,
    0x66,
    0x66,
    0x66,
    0x00,
    0x66,
    0x66,
    0x00
};



動作の様子




とりあえず好きなパターンを表示できるようになりました.
マトリックスLEDの制御は,配列の操作などがとにかくややこしい.
しかし,その分効率の良いコードを目指そうと頭を使うので,
結構勉強になります.
気が向いたらASCIIコードを表示,シリアルで文字列送信等をやる予定です.

0 件のコメント:

コメントを投稿