8桁のLEDドライバ、MAX7219をカスケード接続し、BASCOM-AVRで使ってみました。
考え方の基本は必ず桁数分のデータを送ることです。今回は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マイクロ秒ウエイト。
これ以外の設定も同じように。以下に参考コード。
次に、表示ルーチン。
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を引いて代入する。
これで動きました。カスケード接続ではなく単独(8桁)なら、上記のno-opコードを取ればOKです。