MAX6951/MAX6950 LED顯示驅動器與MAXQ2

                        作者:fanxiaoxi 時間:2022-12-09

                      摘要:本應用筆記說明MAX6951/MAX6950 LED驅動器和MAXQ2000的SPI外設通信的匯編程序設計。

                      引言

                      MAX6950和MAX6951分別為5位和8位共陰極LED顯示驅動器,通過高速SPI 接口控制。這兩款器件采用獨特的復用結構,大大減少了LED驅動器與LED面板的連線。MAXQ2000是一款高性能、16位RISC微控制器,集成了SPI模塊,簡化了LED驅動器與微控制器的連接。本應用筆記提供了MAXQ?匯編程序范例,說明MAXQ2000 SPI模塊與MAX6951/MAX6950的配合使用。

                      硬件和軟件需求

                      為了實現本應用筆記的接口試驗,需要MAX6951評估板(EV kit)、MAXQ2000評估板(包括MAX-IDE軟件)、科提供最小200mA電流的+5V電源和具備一個可用串口的PC機。

                      硬件設置

                      1. MAX6951評估板跳線設置
                        去掉JU2、JU3和JU4引腳1與引腳2之間的跳線,斷開/CS\、DIN和SCLK信號與評估板上電平轉換器的連接。

                      2. MAXQ2000評估板跳線和DIP開關設置
                        開關SW3的1-8引腳置于off位置
                        JU1:連接引腳1和引腳2
                        JU2:連接引腳1和引腳2
                        JU3:連接引腳1和引腳2
                        JU4:開路
                        JU10:開路
                        JU11:接通(MAXQ2000評估板由一塊JTAG接口板供電,電源為+5V。)

                      3. 按圖1所示連接兩塊評估板。


                      圖1. MAX6951評估板與MAXQ2000評估板的連接圖

                      固件說明

                      可從Maxim網站下載本項目的完整固件文件,通過Maxim提供的集成開發環境和調試環境,用于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. 跳動循環,該程序在LED兩個邊沿之間跳動顯示文本信息:HELLO。

                      9. 計時循環,這個程序說明在16進制譯碼方式和非譯碼方式下,如何設計顯示毫秒級計時。

                      max2000ev_6951.asm文件
                      該文件包含所有用于MAX6951評估板與MAXQ2000微控制器之間通信的功能函數。其主要函數有:

                      1. max6951_init:該函數正確地設置MAXQ2000的SPI模式,實現與MAX6951的連接。使能SPI,并初始化MAX6951,在顯示板上顯示八個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 HZMOVE    A[1], #00F4HMOVE    A[2], #4240H			
                        ; DESIRED BAUD RATE IS 1,000,000 HZ MOVE    A[3], #000FHCALL    SPI_SETBAUDRATE
                        ; SET THE APPROPRIATE MODES FOR THE 6951MOVE    C, #SPI_IDLE_LOW		
                        ; IDLE = LOWCALL    SPI_SETCLOCKPOLARITYMOVE    C, #SPI_ACTIVE_EDGE		
                        ; ACTIVE = RISING EDGECALL    SPI_SETCLOCKPHASEMOVE    C, #SPI_LENGTH_16		
                        ; ALWAYS TRANSFER 16 BITSCALL    SPI_SETCHARACTERLENGTHMOVE    C, #SPI_MASTER_MODE	
                        ; MAXQ2000 IS THE MASTER, MAX6951 IS THE SLAVECALL    SPI_SETMODE
                        ; ENABLE SPIMOVE    C, #1CALL    SPI_ENABLE
                        ; SHUTDOWN MAX6951 DISPLAY FIRSTCALL    MAX6951_SHUTDOWN
                        ; SET MAX6951 IN HEXADECIMAL DECODE MODEMOVE    
                        ACC, #MAX6951REG_DECODESLA4SLA4OR      #0FFH				
                        ; HEXADECIMAL DECODECALL    MAX6951_TRANSMIT
                        ; SET DISPLAY INTENSITY = 16/16MOVE    
                        ACC, #MAX6951REG_INTENSITYSLA4SLA4OR      #0FH				
                        ; INTENSITY = 16/16CALL    MAX6951_TRANSMIT
                        ; SCAN LIMIT = 7MOVE    
                        ACC, #MAX6951REG_SCANLIMITSLA4SLA4OR      #07H				
                        ; SCAN LIMIT = 7 CALL    MAX6951_TRANSMITRET
                      2. max6951_transmit:該函數向Max6951發送一個寄存器地址和數據字節(16位)。

                      3. max6951_set_all_n:這些函數將一位數字寄存器的P0級和P1級設置為數字“n”。所有函數具備16進制譯碼和非譯碼模式。

                      4. max6951_e_d_s_d:該函數先使能MAX6951顯示,然后延遲半秒,關斷顯示,再延遲100ms。

                      5. max6951_screenshot:這些函數在8位數字LED面板的八個不同位置處顯示HELLO。

                      6. max6951_scroll_R_to_L:以不同順序顯示,該函數以非譯碼方式從右至左滾動顯示HELLO。

                      7. max6951_scroll_L_to_R:以不同順序顯示,該函數以非譯碼方式從左至右滾動顯示HELLO。

                      8. max6951_bouncing:該函數在LED的兩個邊沿之間跳動顯示HELLO。

                      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_SHUTDOWNCALL	MAX6951_SET_ALL_0	
                        ; SET ALL BITS OF DATA REGISTERS TO 0MOVE   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 0MOVE	A[2], #0			
                        ; A[2] => DIGIT 1MOVE	A[3], #0			
                        ; A[3] => DIGIT 2MOVE	A[4], #0			
                        ; A[4] => DIGIT 3COUNT_LOOP:	INCREASE_DIGIT3:MOVE	ACC, A[4]			
                        ; PROCESS DIGIT 3  	SUB	#9JUMP	Z, INCREASE_DIGIT2		
                        ; DIGIT 3 = 9, THERE IS CARRY OVERMOVE	ACC, A[4]			
                        ; DIGIT 3 < 9, CONTINUEADD	#1MOVE	A[4], ACCCALL	FONT_LOOKUP			
                        ; LOOK UP THE VALUE FOR THIS FONT
                        ; STORE IT IN A[9], KEEP ACC UNCHANGED OR	#6300HCALL	MAX6951_TRANSMIT 		
                        ; NO CARRY OVER, WRITE DIGIT 3 NEW VALUEMOVE	ACC, A[9]			
                        ; WRITE THE NO DECODE VALUE TO DIGIT 7 OR     
                        #6700HCALL	MAX6951_TRANSMITJUMP	DISPLAY_NUMBERINCREASE_DIGIT2:OR	
                        #6300HCALL	MAX6951_TRANSMIT		
                        ; WRITE 0 TO DIGIT 3 REGISTER FIRSTMOVE	A[4], #0			
                        ; SET DIGIT 3 BACK TO 0MOVE	ACC, #677EH			
                        ; NO DECODE VALUE FOR FONT '0' IS "7EH"CALL 	MAX6951_TRANSMIT 		
                        ; WRITE 7EH TO DIGIT 7 REGISTERMOVE	ACC, A[3]			
                        ; PROCESS DIGIT 2SUB	#9JUMP	Z, INCREASE_DIGIT1		
                        ; DIGIT 2 = 9, THERE IS CARRY OVERMOVE	ACC, A[3]			
                        ; DIGIT 2 < 9, CONTINUEADD	#1MOVE	A[3], ACCCALL	FONT_LOOKUP			
                        ; LOOK UP THE VALUE FOR THIS FONT
                        ; STORE IT IN A[9], KEEP ACC UNCHANGED OR	#6200HCALL	MAX6951_TRANSMIT		
                        ; NO CARRY OVER, WRITE DIGIT 2 NEW VALUEMOVE	ACC, A[9]			
                        ; WRITE THE NO DECODE VALUE TO DIGIT 6 OR     
                        #6600HCALL	MAX6951_TRANSMITJUMP	DISPLAY_NUMBERINCREASE_DIGIT1:OR	
                        #6200HCALL	MAX6951_TRANSMIT		
                        ; WRITE 0 TO DIGIT 2 REGISTER FIRSTMOVE	A[3], #0			
                        ; SET DIGIT 2 BACK TO 0MOVE	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 1SUB	#9JUMP	Z, INCREASE_DIGIT0		
                        ; DIGIT 1 = 9, THERE IS CARRY OVERMOVE	ACC, A[2]			
                        ; DIGIT 1 < 9, CONTINUEADD	#1MOVE	A[2], ACCCALL	FONT_LOOKUP			
                        ; LOOK UP THE VALUE FOR THIS FONT
                        ; STORE IT IN A[9], KEEP ACC UNCHANGED OR	#6100HCALL	MAX6951_TRANSMIT		
                        ; NO CARRY OVER, WRITE DIGIT 1 NEW VALUEMOVE	ACC, A[9]			
                        ; WRITE THE NO DECODE VALUE TO DIGIT 5 OR     
                        #6500HCALL	MAX6951_TRANSMITJUMP	DISPLAY_NUMBERINCREASE_DIGIT0:OR	
                        #6100HCALL	MAX6951_TRANSMIT		
                        ; WRITE 0 TO DIGIT 1 REGISTER FIRSTMOVE	A[2], #0			
                        ; SET DIGIT 1 BACK TO 0MOVE	ACC, #657EH			
                        ; NO DECODE VALUE FOR FONT '0' IS "7EH"CALL 	MAX6951_TRANSMIT 		
                        ; WIRTE 7EH TO DIGIT 5 REGISTERMOVE	ACC, A[1]			
                        ; PROCESS DIGIT 0SUB	#9JUMP	Z, COUNT_COMPLETE		
                        ; DIGIT 0 = 9, COUNTING IS OVERMOVE	ACC, A[1]			
                        ; DIGIT 0 < 9, CONTINUEADD	#1MOVE	A[1], ACCCALL	FONT_LOOKUP			
                        ; LOOK UP THE VALUE FOR THIS FONT
                        ; STORE IT IN A[9], KEEP ACC UNCHANGED OR	#6000HCALL	MAX6951_TRANSMIT		
                        ; NO CARRY OVER, WRITE DIGIT 0 NEW VALUEMOVE	ACC, A[9]			
                        ; WRITE THE NO DECODE VALUE TO DIGIT 4 OR     #6400HCALL	MAX6951_TRANSMITDISPLAY_NUMBER:		
                        ; DISPLAY DIGIT 3-0 IN HEXADECIMAL DECODE MODE
                        ; DIEPLAY DIGIT 7-4 IN NO DECODE MODECALL	
                        MAX6951_ENABLECALL	MAX6951_10MS_DELAYJUMP 	COUNT_LOOPCOUNT_COMPLETE:RET

                      maxq2000_spi.asm文件:該文件用于配置、使用MAXQ2000 SPI模塊。集成在MAX-IDE,用戶無需修改即可使用。

                      divide32.asm文件:這是MAX-IDE軟件提供的32位除法程序。

                      maxq2000.inc、maxq2000_spi.inc和max2000ev_6951.inc文件:這些是MAXQ2000引腳定義和MAX6951寄存器定義的嵌套文件。

                      結論

                      MAX6951/MAX6950 SPI LED驅動器簡單易用的共陰極顯示器驅動器,通過SPI串行接口連接微控制器。MAXQ系列微控制器集成了SPI模塊,可通過SPI接口與LED驅動器通信。這里介紹的例程有助于用戶理解MAX6951的LED驅動功能。也可將該例程應用到類似的MAXQ2000系統開發中。


                      關鍵詞: 微控制器

                      加入微信
                      獲取電子行業最新資訊
                      搜索微信公眾號:電子產品世界

                      或用微信掃描左側二維碼

                      相關電路


                      外围体育