MAX7219搭載のユニットで7セグLEDを制御

PICマイコンで7セグLEDを表示するには、かなりのIOピンを必要とする。なんとかならないかと思っていたら、MAX7219搭載でシリアル通信で8桁のLEDを表示できる部品を見つけた。300円程度で購入できたので早速試してみた。

電源のほかには、3つのIOが必要で、I2CよりSPIに近いが、一方的に2バイト送り付けるだけなので、デジタルIOで送信する関数を使ったほうがよさそう。16F18325で試してみた。

/*
* 13 RA0 DIN 送信データ
* 12 RA1 CS 開始フラグ。Lowでデータ送信開始
* 11 RA2 CLK クロック供給
*/
void max_write(unsigned char addr,unsigned char data){
    int i;
    const unsigned char BitMask = 0b10000000;
    RA1 = 0;//CSをLowにして受信待機させる。
    for(i=0;i<8;i++){
        RA2 = 0;//クロックをLowに
        RA0 = (addr&BitMask)!=0;
        addr <<= 1;
        RA2=1; //クロックをHighに
    }
    for(i=0;i<8;i++){
        RA2=0;
        RA0=(data&BitMask)!=0;
        data <<=1;
        RA2=1;
    } 
    RA1=1;
    RA2=0;
}

この関数にアドレスとデータをパラメーターにして呼び出すと表示するはずが、なかなか動かなくてかなり苦戦した。
単純なミスで、初期化をきっちりしていなかったのが原因。mainで以下のようにすると無事動作した。

unsigned char i,j;

max_write(0x0C,0x01);//nomal oparation
max_write(0x09,0x00);//No Decode
max_write(0x0A,0x07);//LED輝度
max_write(0x0B,0x07);//ScanLimit
for(i=1;i<9;i++){
    max_write(i,0);
}

特に1つ目と4つ目が肝心、ShutDownモードになっていると全く動かない。Display
Testをすると、ShutDownが解除されそうな記述を見たけれど、そんなことはなかった。
ScanLimitを8桁全部にしておかないと、いくらデータを送っても反映されない。

できてしまえば、あとは非常に楽。数字だけなら、Decodeモードを使ったほうがいい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)