STC89C52控制MAX7219驱动数码管无法正常显示
做毕业设计,卡住了,两个礼拜了还解决不了,救救我啊。用max7219驱动3个七端数码管,上电全显示8.程序在Proteus中仿真时正常,用示波器检测,7219输出到数码管...
做毕业设计,卡住了,两个礼拜了还解决不了,救救我啊。用max7219驱动3个七端数码管,上电全显示8. 程序在Proteus中仿真时正常,用示波器检测,7219输出到数码管的DIG0.1.2公共端均有电平变化,制的板应该没有问题,查过2遍,板也做了2块了。求各位高手帮忙解决问题。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 ;显示520
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 ;显示520
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个回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询