アプリケーションノート 3729

SPIインタフェースによってMAXQ2000マイクロコントローラと通信するMAX6951/MAX6950 LEDディスプレイドライバの用法


要約: このアプリケーションノートはMAXQ2000のSPIペリフェラルを使用するMAX6951/MAX6950 LEDドライバに対するアセンブリ言語技術を述べたものです。

はじめに

MAX6950MAX6951は高速SPIインタフェースによって制御される5桁および8桁のコモンカソードLEDディスプレイドライバです。これらのデバイスは独特な多重化方式を採用しており、LEDドライバとLEDパネル間の接続を最小化します。MAXQ2000は高性能の16ビット、RISCマイクロコントローラであり、LEDドライバとマイクロコントローラの間のインタフェースを容易とするSPIモジュールを内蔵しています。このアプリケーションノートはMAXQ® アセンブリ言語によるサンプルコードを提供し、MAXQ2000のSPIモジュールを使ってMAX6951/MAX6950の機能を試行する方法を示します。

ハードウェアとソフトウェアの要件

このアプリケーションノートに記述したインタフェースの実験を行うためには、MAX6951の評価キット(EVキット)、MAXQ2000の評価キット(MAX-IDEソフトウェアを含む)、容量が最小200mAの+5V電源、およびシリアルポートを使用可能なPCが必要です。

ハードウェアの設定

  1. MAX6951のEVキットのジャンパ設定
      EVキット上のレベル変換器チップから、信号の/CS\、DIN、およびSCLKを切り離すためには、JU2、JU3、およびJU3のピン1と2を接続するトレースを切断してください。
  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電源から給電されます。)
  3. 2種のEVキットを図1に示すように接続してください。

図1. MAX6951のEVキットとMAXQ2000のEVキットの接続図
図1. MAX6951のEVキットとMAXQ2000のEVキットの接続図

ファームウェアの説明

この例題プロジェクト用の完全なファームウェアファイルはマキシムのウェブサイトからダウンロードすることができ、MAXQマイクロコントローラファミリ用のマキシムの統合開発およびデバッグ環境のMAX-IDEを使用してコンパイルすることができます。

ダウンロード:完全ファームウェア(ZIP、18.8k)

main.asmファイル
このファイルはこの例題プロジェクト用のメインデモループです。これはMAX6951のレジスタに書き込む正しいデータをデモするために別のルーチンをコールします。ファームウェアは次のMAX6951の機能を順番にデモします:

  1. MAX6951 SPIインタフェースの初期化
  2. 16進デコードモードで、MAX6951上のすべての桁のP0とP1プレーンの両方に0、1、2、…、A、B、C、D、E、Fおよび8個の小数点(すなわち、すべてのLEDセグメントの点灯)の書込みと表示
  3. 非デコードモードとして、ユーザーが組み込んだフォントを使用して、上述の文字とその他のH、L、P、Q、Yなどの認識可能なその他の文字の書込みと表示
  4. LEDの調光ループ。このループはディジタル輝度制御をテストするために、MAX6951の輝度レジスタへの書込み方法を示します。
  5. スキャンリミットループ。このループは同じ輝度設定として、1~8個までの桁を表示します。
    :スキャンリミットが増加したら、輝度が下がることを確認するために、このプロセスをモニタしてください。
  6. ループのブリンキング。このループは各桁のP0とP1プレーンに対して異なった桁数字を書き込みます。また、このループは高速ブリンキングモードを使用して、複数のLEDドライバ間で同期することができるセグメントブリンキング制御をデモします。
  7. ループのスクロール。このループはテキストメッセージのHELLOを左から右へ、および右から左へスクロールします。
  8. ループのバウンス。このループはHELLOを2つのLEDエッジ間でバウンスします。
  9. カウントループ。この最後のループは、16進デコードモードおよび非デコードモードで、経過したミリ秒をカウントする表示の設計方法を示します。

max2000ev_6951.asmファイル
このファイルはMAXQ2000 マイクロコントローラを使用するMAX6951のEVキットと通信するためのすべてのユーティリティファンクションを備えています。その主な機能は次の通りです:

  1. 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
    
  2. max6951_transmit:この機能はMAX6951にレジスタアドレスとデータバイト(16ビット)を送ります。
  3. max6951_set_all_n:この機能は桁レジスタのP0とP1の両プレーンを数’n’に設定します。すべての機能は16進デコードと非デコードバージョンの両方を持ちます。
  4. max6951_e_d_s_d:この機能はMAX6951の表示をイネーブルとし、その後で0.5秒の遅延で表示をシャットダウンし、その後、100ms遅延します。
  5. max6951_screenshot:これらの機能は8桁のLEDパネルの8個の異なった位置にHELLOを表示します。
  6. max6951_scroll_R_to_L:異なったシーケンスでスクリーンショットを表示することによって、この機能はHELLOを非デコードモードで右から左にスクロールします。
  7. max6951_scroll_L_to_R:異なったシーケンスでスクリーンショットを表示することによって、この機能はHELLOを非デコードモードで左から右にスクロールします。
  8. max6951_bouncing:この機能はHELLOを2つのLEDエッジ間でバウンスさせます。
  9. font_lookup:桁値を16進形式で与えて、このルーチンは、標準の7セグメントLEDに非デコードモードで同じフォントを表示する値を探索します。
  10. 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をベースとしたアプリケーション開発においても利用することができます。