阅读:1347回复:0
有谁用过MAX7219,最好是用51或是AVR单片机控制的?
我用AVR单片机编了一个用一般的三个口线串行驱动Max7219的程序,可是我软件仿真多次,都没有问题,可是Max7219就是不工作。请高手们指教。源程序如下:
.include\"8515def.inc\" .equ ADDR=$0060 ;内部寄存器地址暂存 .equ DBUF=$0061 ;显示内容暂存 .equ PNUM=$0062 ;移位计数暂存 .equ DG1=$0068 ;显示缓冲区 .equ DG2=$0069 ; . .equ DG3=$006a ; . .equ DG4=$006b ; . .equ DG5=$006c ; . .equ DG6=$006d ; . .equ DG7=$006e ; . .equ DG8=$006f ;显示缓冲区 .cseg .org $000 ;复位向量 rjmp RESET .org $010 RESET: ldi r16,$02 out SPH,r16 ldi r16,$5f out SPL,r16 ;设堆栈为0X025 rcall DP_EQ ;调用显示赋值子程序 rcall DP_INIT ;调用max7219显示初始化 rcall DP_MAIN ;调用显示主程序 ret ;显示初始化程序 DP_INIT:ldi r16,$07 out DDRB,r16 ;B口前三位设定为输出 ldi r16,$16 sts PNUM,r16 ;装入计数值 cbi PORTB,0 ;CLK信号 cbi PORTB,1 ;LOAD信号 cbi PORTB,2 ;DIN信号 lds r19,PNUM ;装入计数值 ldi r16,$0c ;关断7219 sts ADDR,r16 ldi r16,$00 sts DBUF,r16 rcall DISP ldi r16,$0d ;延时1ms rcall DELAY ldi r16,$0c ;退出关断 sts ADDR,r16 ldi r16,$0 sts DBUF,r16 rcall DISP ldi r16,$0b ;8位显示 sts ADDR,r16 ldi r16,$7 sts DBUF,r16 rcall DISP ldi r16,$09 ;decode-b模式 sts ADDR,r16 ldi r16,$0ff sts DBUF,r16 rcall DISP ldi r16,$0a ;最亮模式 sts ADDR,r16 ldi r16,$0f sts DBUF,r16 rcall DISP ldi r16,$0f ;测试模式 sts ADDR,r16 ldi r16,$01 sts DBUF,r16 rcall DISP ldi r16,$83 ;delay 5s rcall DELAY ldi r16,$0f ;关闭测试 sts ADDR,r16 ldi r16,$00 sts DBUF,r16 rcall DISP ret ;显示赋值子程序,显示缓冲区赋值 DP_EQ: ldi r16,$01 sts DG1,r16 ldi r16,$02 sts DG2,r16 ldi r16,$03 sts DG3,r16 ldi r16,$04 sts DG4,r16 ldi r16,$05 sts DG5,r16 ldi r16,$06 sts DG6,r16 ldi r16,$07 sts DG7,r16 ldi r16,$08 sts DG8,r16 ret DP_MAIN:ldi r16,$8 ;显示八位计数 ;clr r29 ;Y高字节清零 ;ldi r28,$6f ;6F送Y的低字节 LP: sts ADDR,r16 ;内部寄存器地址赋值 lds r17,DG8 sts DBUF,r17 ;显示内容赋值 rcall DISP dec r17 ;cpi r16,0 brne LP ret ;串行移位送数子程序(16位) DISP: lds r19,PNUM ;push SREG clc ;SREG的C位清零 cbi PORTB,1 ;LOAD=0 nop nop nop nop sbi PORTB,1 ;LOAD=1 LOP: nop nop cbi PORTB,0 ;clk=0 lds r18,DBUF rol r18 sts DBUF,r18 lds r18,ADDR rol r18 sts ADDR,r18 brcs SET1 cbi PORTB,2 ;新的一位=>DIN rjmp SET2 SET1: sbi PORTB,2 ;新的一位=>DIN SET2: sbi PORTB,0 ;Clk=1 dec r19 cpi r19,0 brne LOP cbi PORTB,1 nop nop nop nop sbi PORTB,1 nop nop nop ;pop SREG ret ; 通用延时子程序 DELAY: push r16 ;进栈需2t L0: push r16 ;进栈需2t L1: push r16 ;进栈需2t L2: push r16 ;进栈需2t L3: dec r16 ; -1 需1t brne L3 ;不为0 转,为0 顺执, 需1t/2t pop r16 ;出栈需2t dec r16 ;-1 需1t brne L2 ; 不为0 转,为0 顺执,需1t/2t pop r16 ; 出栈需2t dec r16 ; -1 需1t brne L1 ; 不为0 转,为0 顺执,需1t/2t pop r16 ; 出栈需2t dec r16 ;-1 需1t brne L0 ; 不为0 转,为0 顺执,需1T/2T pop r16 ; 出栈需2t ret ; 子程序返回需4t [编辑 - 4/11/03 by rocer] |
|
|