rocer
驱动牛犊
驱动牛犊
  • 注册日期2002-01-21
  • 最后登录2003-04-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1303回复:0

有谁用过MAX7219,最好是用51或是AVR单片机控制的?

楼主#
更多 发布于:2003-04-11 01:07
我用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]
日日学习,天天向上!
游客

返回顶部