应用笔记 3729

MAX6951/MAX6950 LED显示驱动器与MAXQ2000微控制器的通信


摘要 : 本应用笔记说明MAX6951/MAX6950 LED驱动器和MAXQ2000的SPI外设通信的汇编程序设计。

引言

MAX6950MAX6951分别为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评估板的连接图
图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 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显示,然后延迟半秒,关断显示,再延迟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_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位除法程序。

maxq2000.inc、maxq2000_spi.inc和max2000ev_6951.inc文件:这些是MAXQ2000引脚定义和MAX6951寄存器定义的嵌套文件。

结论

MAX6951/MAX6950 SPI LED驱动器简单易用的共阴极显示器驱动器,通过SPI串行接口连接微控制器。MAXQ系列微控制器集成了SPI模块,可通过SPI接口与LED驱动器通信。这里介绍的例程有助于用户理解MAX6951的LED驱动功能。也可将该例程应用到类似的MAXQ2000系统开发中。
下一步
EE-Mail 订阅EE-Mail,接收关于您感兴趣的新文档的自动通知。
© , Maxim Integrated Products, Inc.
The content on this webpage is protected by copyright laws of the United States and of foreign countries. For requests to copy this content, contact us.
APP 3729:
应用笔记 3729,AN3729, AN 3729, APP3729, Appnote3729, Appnote 3729