MAX6950和MAX6951分別為5位和8位共陰極LED顯示驅(qū)動器,通過高速SPI 接口控制。這兩款器件采用獨特的復(fù)用結(jié)構(gòu),大大減少了LED驅(qū)動器與LED面板的連線。MAXQ2000是一款高性能、16位RISC微控制器,集成了SPI模塊,簡化了LED驅(qū)動器與微控制器的連接。本應(yīng)用筆記提供了MAXQ?匯編程序范例,說明MAXQ2000 SPI模塊與MAX6951/MAX6950的配合使用。
硬件和軟件需求
為了實現(xiàn)本應(yīng)用筆記的接口試驗,需要MAX6951評估板(EV kit)、MAXQ2000評估板(包括MAX-IDE軟件)、科提供最小200mA電流的+5V電源和具備一個可用串口的PC機。
硬件設(shè)置
-
MAX6951評估板跳線設(shè)置
去掉JU2、JU3和JU4引腳1與引腳2之間的跳線,斷開/CS\\、DIN和SCLK信號與評估板上電平轉(zhuǎn)換器的連接。
-
MAXQ2000評估板跳線和DIP開關(guān)設(shè)置
開關(guān)SW3的1-8引腳置于off位置
JU1:連接引腳1和引腳2
JU2:連接引腳1和引腳2
JU3:連接引腳1和引腳2
JU4:開路
JU10:開路
JU11:接通(MAXQ2000評估板由一塊JTAG接口板供電,電源為+5V。)
-
按圖1所示連接兩塊評估板。
圖1. MAX6951評估板與MAXQ2000評估板的連接圖
固件說明
可從Maxim網(wǎng)站下載本項目的完整固件文件,通過Maxim提供的集成開發(fā)環(huán)境和調(diào)試環(huán)境,用于MAXQ系列微控制器的MAX-IDE,進行編譯。
下載:完整的固件(ZIP, 18.8k)
main.asm文件
該文件為本項目的主循環(huán)程序,它通過調(diào)用不同的子程序演示正確寫入MAX6951寄存器的數(shù)據(jù)。固件演示MAX6951的以下功能:
-
MAX6951 SPI接口初始化。
-
在16進制譯碼方式下,對MAX6951所有數(shù)字的P0和P1級寫入并顯示0、1、2、...、A、B、C、D、E、F和8個小數(shù)位(如,點亮所有LED字段)。
-
在非譯碼方式下,寫入并顯示上述字母和其它用戶內(nèi)建字符,如H、L、P、Q、Y等。
-
LED亮度調(diào)節(jié),該程序說明如何設(shè)置MAX6951亮度寄存器,測試數(shù)字亮度控制功能。
-
掃描限制循環(huán)程序。該程序用相同亮度循環(huán)顯示第1位到第8位數(shù)字。
注 :監(jiān)控進程,以確認掃描限制提高時,降低亮度。
-
閃爍控制,該程序?qū)⒉煌瑪?shù)值寫入每位數(shù)據(jù)的P0級和P1級。還可采用快速閃爍方式來演示段閃爍控制功能,可同步多個LED驅(qū)動器。
-
滾動循環(huán),該程序從左到右、從右到左滾動顯示文本信息:HELLO。
-
跳動循環(huán),該程序在LED兩個邊沿之間跳動顯示文本信息:HELLO。
-
計時循環(huán),這個程序說明在16進制譯碼方式和非譯碼方式下,如何設(shè)計顯示毫秒級計時。
max2000ev_6951.asm文件
該文件包含所有用于MAX6951評估板與MAXQ2000微控制器之間通信的功能函數(shù)。其主要函數(shù)有:
- max6951_init :該函數(shù)正確地設(shè)置MAXQ2000的SPI模式,實現(xiàn)與MAX6951的連接。使能SPI,并初始化MAX6951,在顯示板上顯示八個0。列表1為該函數(shù)的詳細代碼。
列表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 :該函數(shù)向Max6951發(fā)送一個寄存器地址和數(shù)據(jù)字節(jié)(16位)。
- max6951_set_all_n :這些函數(shù)將一位數(shù)字寄存器的P0級和P1級設(shè)置為數(shù)字“n”。所有函數(shù)具備16進制譯碼和非譯碼模式。
- max6951_e_d_s_d :該函數(shù)先使能MAX6951顯示,然后延遲半秒,關(guān)斷顯示,再延遲100ms。
- max6951_screenshot :這些函數(shù)在8位數(shù)字LED面板的八個不同位置處顯示HELLO。
- max6951_scroll_R_to_L :以不同順序顯示,該函數(shù)以非譯碼方式從右至左滾動顯示HELLO。
- max6951_scroll_L_to_R :以不同順序顯示,該函數(shù)以非譯碼方式從左至右滾動顯示HELLO。
- max6951_bouncing :該函數(shù)在LED的兩個邊沿之間跳動顯示HELLO。
- font_lookup :給定一個16進制數(shù),該函數(shù)查詢在標準7段LED上以非譯碼方式顯示的相同字符。
- max6951_counting :該函數(shù)用于顯示毫秒計時,精確度為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