SPIインタフェースによってMAXQ2000マイクロコントローラと通信するMAX6951/MAX6950 LEDディスプレイドライバの用法
はじめに
MAX6950とMAX6951は高速SPIインタフェースによって制御される5桁および8桁のコモンカソードLEDディスプレイドライバです。これらのデバイスは独特な多重化方式を採用しており、LEDドライバとLEDパネル間の接続を最小化します。MAXQ2000は高性能の16ビット、RISCマイクロコントローラであり、LEDドライバとマイクロコントローラの間のインタフェースを容易とするSPIモジュールを内蔵しています。このアプリケーションノートはMAXQ® アセンブリ言語によるサンプルコードを提供し、MAXQ2000のSPIモジュールを使ってMAX6951/MAX6950の機能を試行する方法を示します。
ハードウェアとソフトウェアの要件
このアプリケーションノートに記述したインタフェースの実験を行うためには、MAX6951の評価キット(EVキット)、MAXQ2000の評価キット(MAX-IDEソフトウェアを含む)、容量が最小200mAの+5V電源、およびシリアルポートを使用可能なPCが必要です。
ハードウェアの設定
- MAX6951のEVキットのジャンパ設定
EVキット上のレベル変換器チップから、信号の/CS\、DIN、およびSCLKを切り離すためには、JU2、JU3、およびJU3のピン1と2を接続するトレースを切断してください。 - MAXQ2000のEVキットのジャンパとDIPスイッチの設定
SW3の1-8をOFFの位置に設定してください。
JU1:ピン1と2を接続
JU2:ピン1と2を接続
JU3:ピン1と2を接続
JU4:オープン
JU10:オープン
JU11:オン(MAXQ2000のEVキットはJTAGインタフェースボードから給電され、そのJTAGボードは+5V電源から給電されます。) - 2種のEVキットを図1に示すように接続してください。
図1. MAX6951のEVキットとMAXQ2000のEVキットの接続図
ファームウェアの説明
この例題プロジェクト用の完全なファームウェアファイルはマキシムのウェブサイトからダウンロードすることができ、MAXQマイクロコントローラファミリ用のマキシムの統合開発およびデバッグ環境のMAX-IDEを使用してコンパイルすることができます。
ダウンロード:完全ファームウェア(ZIP、18.8k)
main.asmファイル
このファイルはこの例題プロジェクト用のメインデモループです。これはMAX6951のレジスタに書き込む正しいデータをデモするために別のルーチンをコールします。ファームウェアは次のMAX6951の機能を順番にデモします:
- MAX6951 SPIインタフェースの初期化
- 16進デコードモードで、MAX6951上のすべての桁のP0とP1プレーンの両方に0、1、2、…、A、B、C、D、E、Fおよび8個の小数点(すなわち、すべてのLEDセグメントの点灯)の書込みと表示
- 非デコードモードとして、ユーザーが組み込んだフォントを使用して、上述の文字とその他のH、L、P、Q、Yなどの認識可能なその他の文字の書込みと表示
- LEDの調光ループ。このループはディジタル輝度制御をテストするために、MAX6951の輝度レジスタへの書込み方法を示します。
- スキャンリミットループ。このループは同じ輝度設定として、1~8個までの桁を表示します。
注:スキャンリミットが増加したら、輝度が下がることを確認するために、このプロセスをモニタしてください。 - ループのブリンキング。このループは各桁のP0とP1プレーンに対して異なった桁数字を書き込みます。また、このループは高速ブリンキングモードを使用して、複数のLEDドライバ間で同期することができるセグメントブリンキング制御をデモします。
- ループのスクロール。このループはテキストメッセージのHELLOを左から右へ、および右から左へスクロールします。
- ループのバウンス。このループはHELLOを2つのLEDエッジ間でバウンスします。
- カウントループ。この最後のループは、16進デコードモードおよび非デコードモードで、経過したミリ秒をカウントする表示の設計方法を示します。
max2000ev_6951.asmファイル
このファイルはMAXQ2000 マイクロコントローラを使用するMAX6951のEVキットと通信するためのすべてのユーティリティファンクションを備えています。その主な機能は次の通りです:
- max6951_init:この機能はMAX6951と会話するために、MAXQ2000を正しいSPIモードに設定します。この機能はSPIをイネーブルとし、MAX6951を初期化して表示パネルに8個の0を表示します。リスト1はこの機能の詳細を示しています。
リスト1. MAX6951の初期化コードの例
;******************************************************************************* ;* Function: max6951_init ;* ;* Sets the correct SPI modes for talking to the MAX6951, enables SPI, and ;* ;* initializes the MAX6951 to display 8 0s. ;* ;* Input: None. ;* ;* Output: None. ;* ;* Destroys: ACC, A[0] -- A[10], PSF ;* ;******************************************************************************* MAX6951_INIT: ; SET SPI BAUD RATE MOVE A[0], #2400H ; SYSTEM CLOCK IS 16,000,000 HZ MOVE A[1], #00F4H MOVE A[2], #4240H ; DESIRED BAUD RATE IS 1,000,000 HZ MOVE A[3], #000FH CALL SPI_SETBAUDRATE ; SET THE APPROPRIATE MODES FOR THE 6951 MOVE C, #SPI_IDLE_LOW ; IDLE = LOW CALL SPI_SETCLOCKPOLARITY MOVE C, #SPI_ACTIVE_EDGE ; ACTIVE = RISING EDGE CALL SPI_SETCLOCKPHASE MOVE C, #SPI_LENGTH_16 ; ALWAYS TRANSFER 16 BITS CALL SPI_SETCHARACTERLENGTH MOVE C, #SPI_MASTER_MODE ; MAXQ2000 IS THE MASTER, MAX6951 IS THE SLAVE CALL SPI_SETMODE ; ENABLE SPI MOVE C, #1 CALL SPI_ENABLE ; SHUTDOWN MAX6951 DISPLAY FIRST CALL MAX6951_SHUTDOWN ; SET MAX6951 IN HEXADECIMAL DECODE MODE MOVE ACC, #MAX6951REG_DECODE SLA4 SLA4 OR #0FFH ; HEXADECIMAL DECODE CALL MAX6951_TRANSMIT ; SET DISPLAY INTENSITY = 16/16 MOVE ACC, #MAX6951REG_INTENSITY SLA4 SLA4 OR #0FH ; INTENSITY = 16/16 CALL MAX6951_TRANSMIT ; SCAN LIMIT = 7 MOVE ACC, #MAX6951REG_SCANLIMIT SLA4 SLA4 OR #07H ; SCAN LIMIT = 7 CALL MAX6951_TRANSMIT RET
- max6951_transmit:この機能はMAX6951にレジスタアドレスとデータバイト(16ビット)を送ります。
- max6951_set_all_n:この機能は桁レジスタのP0とP1の両プレーンを数’n’に設定します。すべての機能は16進デコードと非デコードバージョンの両方を持ちます。
- max6951_e_d_s_d:この機能はMAX6951の表示をイネーブルとし、その後で0.5秒の遅延で表示をシャットダウンし、その後、100ms遅延します。
- max6951_screenshot:これらの機能は8桁のLEDパネルの8個の異なった位置にHELLOを表示します。
- max6951_scroll_R_to_L:異なったシーケンスでスクリーンショットを表示することによって、この機能はHELLOを非デコードモードで右から左にスクロールします。
- max6951_scroll_L_to_R:異なったシーケンスでスクリーンショットを表示することによって、この機能はHELLOを非デコードモードで左から右にスクロールします。
- max6951_bouncing:この機能はHELLOを2つのLEDエッジ間でバウンスさせます。
- font_lookup:桁値を16進形式で与えて、このルーチンは、標準の7セグメントLEDに非デコードモードで同じフォントを表示する値を探索します。
- max6951_counting:この機能は、経過時間をミリ秒で計数して表示します。分解能は10ミリ秒です。リスト2はコードの詳細を示しています。
リスト2. MAX6951の計数用コードの例
;******************************************************************************* ;* Function: max6951_counting ;* ;* This routine counts how many 10-milliseconds have elapsed and displays ;* ;* the value from 0000 to 9999 on LED digits 3-0(no way to blank leading digits). ;* ; The routine displays the same value on LED digits 7-4(by using no decode ;* ;* mode, individual leading digits can be blanked). ;* ;* Input: None ;* ;* Output: None ;* ;* Destroys: ACC, A[1] - A[4], A[9] ;* ;******************************************************************************* MAX6951_COUNTING: CALL MAX6951_SHUTDOWN CALL MAX6951_SET_ALL_0 ; SET ALL BITS OF DATA REGISTERS TO 0 MOVE ACC, #010FH ; HEXDECIMAL DECODE DIGITS 3-0, NO DEOCDE DIGITS 7-4 CALL MAX6951_TRANSMIT ; INITIALIZE THE COUNT TO 0 MOVE A[1], #0 ; A[1] => DIGIT 0 MOVE A[2], #0 ; A[2] => DIGIT 1 MOVE A[3], #0 ; A[3] => DIGIT 2 MOVE A[4], #0 ; A[4] => DIGIT 3 COUNT_LOOP: INCREASE_DIGIT3: MOVE ACC, A[4] ; PROCESS DIGIT 3 SUB #9 JUMP Z, INCREASE_DIGIT2 ; DIGIT 3 = 9, THERE IS CARRY OVER MOVE ACC, A[4] ; DIGIT 3 < 9, CONTINUE ADD #1 MOVE A[4], ACC CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT ; STORE IT IN A[9], KEEP ACC UNCHANGED OR #6300H CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 3 NEW VALUE MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 7 OR #6700H CALL MAX6951_TRANSMIT JUMP DISPLAY_NUMBER INCREASE_DIGIT2: OR #6300H CALL MAX6951_TRANSMIT ; WRITE 0 TO DIGIT 3 REGISTER FIRST MOVE A[4], #0 ; SET DIGIT 3 BACK TO 0 MOVE ACC, #677EH ; NO DECODE VALUE FOR FONT '0' IS "7EH" CALL MAX6951_TRANSMIT ; WRITE 7EH TO DIGIT 7 REGISTER MOVE ACC, A[3] ; PROCESS DIGIT 2 SUB #9 JUMP Z, INCREASE_DIGIT1 ; DIGIT 2 = 9, THERE IS CARRY OVER MOVE ACC, A[3] ; DIGIT 2 < 9, CONTINUE ADD #1 MOVE A[3], ACC CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT ; STORE IT IN A[9], KEEP ACC UNCHANGED OR #6200H CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 2 NEW VALUE MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 6 OR #6600H CALL MAX6951_TRANSMIT JUMP DISPLAY_NUMBER INCREASE_DIGIT1: OR #6200H CALL MAX6951_TRANSMIT ; WRITE 0 TO DIGIT 2 REGISTER FIRST MOVE A[3], #0 ; SET DIGIT 2 BACK TO 0 MOVE ACC, #667EH ; NO DECODE VALUE FOR FONT '0' IS "7EH" CALL MAX6951_TRANSMIT ; WRITE 7EH TO DIGIT 6 REGISTER MOVE ACC, A[2] ; PROCESS DIGIT 1 SUB #9 JUMP Z, INCREASE_DIGIT0 ; DIGIT 1 = 9, THERE IS CARRY OVER MOVE ACC, A[2] ; DIGIT 1 < 9, CONTINUE ADD #1 MOVE A[2], ACC CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT ; STORE IT IN A[9], KEEP ACC UNCHANGED OR #6100H CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 1 NEW VALUE MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 5 OR #6500H CALL MAX6951_TRANSMIT JUMP DISPLAY_NUMBER INCREASE_DIGIT0: OR #6100H CALL MAX6951_TRANSMIT ; WRITE 0 TO DIGIT 1 REGISTER FIRST MOVE A[2], #0 ; SET DIGIT 1 BACK TO 0 MOVE ACC, #657EH ; NO DECODE VALUE FOR FONT '0' IS "7EH" CALL MAX6951_TRANSMIT ; WIRTE 7EH TO DIGIT 5 REGISTER MOVE ACC, A[1] ; PROCESS DIGIT 0 SUB #9 JUMP Z, COUNT_COMPLETE ; DIGIT 0 = 9, COUNTING IS OVER MOVE ACC, A[1] ; DIGIT 0 < 9, CONTINUE ADD #1 MOVE A[1], ACC CALL FONT_LOOKUP ; LOOK UP THE VALUE FOR THIS FONT ; STORE IT IN A[9], KEEP ACC UNCHANGED OR #6000H CALL MAX6951_TRANSMIT ; NO CARRY OVER, WRITE DIGIT 0 NEW VALUE MOVE ACC, A[9] ; WRITE THE NO DECODE VALUE TO DIGIT 4 OR #6400H CALL MAX6951_TRANSMIT DISPLAY_NUMBER: ; DISPLAY DIGIT 3-0 IN HEXADECIMAL DECODE MODE ; DIEPLAY DIGIT 7-4 IN NO DECODE MODE CALL MAX6951_ENABLE CALL MAX6951_10MS_DELAY JUMP COUNT_LOOP COUNT_COMPLETE: RET
maxq2000_spi.asmファイル:このファイルはMAXQ2000のSPIモジュールを構成して使用するためのユーティリティファンクションです。このファイルはMAX-IDEに組み込まれており、ユーザーは変更しないでそのまま使用することができます。
divide32.asmファイル:これはMAX-IDE ソフトウェアに用意されている32-/32-ビット除算ルーチンです。
maxq2000.inc、maxq2000_spi.inc、およびmax2000ev_6951.incファイル:これらはMAXQ2000のpin定義およびMAX6951のレジスタ定義に対するインクルードファイルです。
結論
MAX6951/MAX6950 SPI LEDドライバは使いやすいコモンカソードディスプレイドライバであり、SPIシリアルインタフェースによってマイクロコントローラとインタフェースします。マイクロコントローラのMAXQファミリは便利なSPIモジュールを組み込んでおり、SPIインタフェースによってLEDドライバと通信します。ここに提示したサンプルコードはユーザーがMAX6951のLED機能の使用方法を理解する助けとなります。サンプルコードは同様なMAXQ2000をベースとしたアプリケーション開発においても利用することができます。