MAX7219驱动数码管显示完全不对
做毕业设计,卡了2礼拜了,求救。用max7219驱动3个七端数码管,上电全显示8.用了示波器测试,链接数码管公共端的三个脚均有电平变化。制板了2次,应该不会有问题,程序在...
做毕业设计,卡了2礼拜了,求救。用max7219驱动3个七端数码管,上电全显示8. 用了示波器测试,链接数码管公共端的三个脚均有电平变化。制板了2次,应该不会有问题,程序在Proteus中仿真时完全正常显示520,求各位高手帮忙解决问题。汇编程序和PROTEL图如下:
;单片机与HD7279接口定义
CLK EQU P1.0
DIN EQU P1.1
LOAD EQU P1.2
ORG 0000H
LJMP DISP
ORG 0090H ;
;7219初始化
DISP:
MOV A,#09H ;置译码器方式寄存器地址
MOV R7,#0FFH ;选择译码方式
LCALL MAX7219 ;写入
MOV A,#0AH ;置亮度寄存器地址
MOV R7,#05H ;选择占空比
LCALL MAX7219 ;写入
MOV A,#0BH ;置MAX7219显示扫描位数寄存器地址
MOV R7,#02H ;选择3位显示方式
LCALL MAX7219 ;写入
MOV A,#0CH ;置关闭显示寄存器地址
MOV R7,#01H ;选择进入正常工作,00H表示关闭
LCALL MAX7219 ;写入
;显示数据
MOV 30H,#05H
MOV 31H,#02H
MOV 32H,#00H
MAIN: MOV R0,#30H
CLR P1.2 ;
MOV R1,#01H ;指向第0位LED
MOV R3,#03H ;显示器个数
LOOP: MOV A,@R0 ;取显示缓冲区数据
MOV R7,A ;显示2
MOV A,R1 ;LED显示的位地址给A
LCALL MAX7219 ;
INC R0 ;指向下一个显示数据
INC R1 ;指向下一位LED
DJNZ R3,LOOP ;
SJMP MAIN
;MAX7219子程序
MAX7219:
CLR P1.2 ;将LOAD信号拉低
LCALL XH1 ;一位字节送入7219
MOV A,R7 ;
LCALL XH1 ;
NOP
NOP
SETB P1.2 ;产生LOAD上升沿,锁存数据
RET
XH1: MOV R2,#08H ;总共有8位,移8次
NEXT: CLR P1.0 ;将CLK拉低
RLC A ;A中值左移入进位累加器C中
MOV P1.1,C ;给DIN口
NOP
SETB P1.0 ;CLK上升沿,移入数据
NOP
DJNZ R2,NEXT ;没完成则继续
RET
SHORT_DELAY:
MOV 10H,#40 ;10ms
DEL1: MOV 11H,#125
DEL2: DJNZ 11H,DEL2 ;125*2us=0.25ms
DJNZ 10H,DEL1 ;0.25ms*40=10ms
RET
END 展开
;单片机与HD7279接口定义
CLK EQU P1.0
DIN EQU P1.1
LOAD EQU P1.2
ORG 0000H
LJMP DISP
ORG 0090H ;
;7219初始化
DISP:
MOV A,#09H ;置译码器方式寄存器地址
MOV R7,#0FFH ;选择译码方式
LCALL MAX7219 ;写入
MOV A,#0AH ;置亮度寄存器地址
MOV R7,#05H ;选择占空比
LCALL MAX7219 ;写入
MOV A,#0BH ;置MAX7219显示扫描位数寄存器地址
MOV R7,#02H ;选择3位显示方式
LCALL MAX7219 ;写入
MOV A,#0CH ;置关闭显示寄存器地址
MOV R7,#01H ;选择进入正常工作,00H表示关闭
LCALL MAX7219 ;写入
;显示数据
MOV 30H,#05H
MOV 31H,#02H
MOV 32H,#00H
MAIN: MOV R0,#30H
CLR P1.2 ;
MOV R1,#01H ;指向第0位LED
MOV R3,#03H ;显示器个数
LOOP: MOV A,@R0 ;取显示缓冲区数据
MOV R7,A ;显示2
MOV A,R1 ;LED显示的位地址给A
LCALL MAX7219 ;
INC R0 ;指向下一个显示数据
INC R1 ;指向下一位LED
DJNZ R3,LOOP ;
SJMP MAIN
;MAX7219子程序
MAX7219:
CLR P1.2 ;将LOAD信号拉低
LCALL XH1 ;一位字节送入7219
MOV A,R7 ;
LCALL XH1 ;
NOP
NOP
SETB P1.2 ;产生LOAD上升沿,锁存数据
RET
XH1: MOV R2,#08H ;总共有8位,移8次
NEXT: CLR P1.0 ;将CLK拉低
RLC A ;A中值左移入进位累加器C中
MOV P1.1,C ;给DIN口
NOP
SETB P1.0 ;CLK上升沿,移入数据
NOP
DJNZ R2,NEXT ;没完成则继续
RET
SHORT_DELAY:
MOV 10H,#40 ;10ms
DEL1: MOV 11H,#125
DEL2: DJNZ 11H,DEL2 ;125*2us=0.25ms
DJNZ 10H,DEL1 ;0.25ms*40=10ms
RET
END 展开
若以下回答无法解决问题,邀请你更新回答
1个回答
2010-12-05
展开全部
把复位电路改一下吧。。。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询