MAX7219をカスケード接続で使う

8桁のLEDドライバ、MAX7219をカスケード接続し、BASCOM-AVRで使ってみました。

Mio24_LED

考え方の基本は必ず桁数分のデータを送ることです。今回は2個つないで16桁のLEDを制御します。

まず、初期化。
spi_data()という配列(バイト変数)を用意して、spi_data(3)=0、spi_data(4)=0 。(no-op用)

Spi_data(1) = &H0f : Spi_data(2) = 0        ‘Display Test Off
Gosub Disp_write_setup_spi

上記は、初期設定の一部。Spi_data(1)にレジスタのアドレス。Spi_data(2)には設定値。

そして2行目のサブルーチンの中身。

Disp_write_setup_spi:        ‘initialize unit-1

Set Disp_en                ’enable load
Spiout Spi_data(3) , 2         ’no-op code
Spiout Spi_data(1) , 2         ’write data
Reset Disp_en              ’disable load
Waitus 5                  ’wait 5uS
Return

このunit-1はCPUに近い方のユニット。まず、LOADをイネーブル(=LOW  CPUとの間にトランジスタが入っているので、CPU側はここではHIGH)にし、spi_data(3)とspi_data(4)の2バイトを送信。(これがno-opコード)

次に、Display Test Offの設定値である、spi_data(1)とspi_data(2)の2バイトを送信。

LOADをディセーブル(HIGH)にして、5マイクロ秒ウエイト。

これ以外の設定も同じように。以下に参考コード。

max7219_1

max7219_2

次に、表示ルーチン。

spi_data(1)に桁番号(1~8)、spi_data(2)に表示データを入れておき、CPUに近い方は初めにno-opコード( 以下のspi_data(3)とspi_data(4)  但し、以下のコードでは、spi_data(3)から2バイトと設定しているので、spi_data(4)は見えない) を2バイト送り、その後にspi_data(1)とspi_data(2)を2バイト送信。CPUから遠いICへはこの逆で、設定値を送ってからno-opコードを2バイト送る。

2個のIC(=16桁)であれば、これを16回繰り返せばOK。気をつけなければならないのは、カスケードにつなげても、それぞれの桁番号(レジスタアドレスのD11-D8)は1から8であること。なので、ループで回す場合は下記のように8を超えた場合(=2個目のIC)は、1行目の If Led_digit>8 Thenのところのように、ループ変数から8を引いて代入する。

max7219_3

これで動きました。カスケード接続ではなく単独(8桁)なら、上記のno-opコードを取ればOKです。