请教MAX7219驱动8个LED显示全亮的问题!

magnwang 2009-09-22 11:17:35
关于max7219的显示
我是电子爱好者,近日有个MAX7219的片子,用89C2051 想编个程序显示看看,结果不可以,我感觉没有问题,但我要显示的8个led一上电就全亮,再就没有熄灭过,怎么回事呢,软件问题还是硬件问题,百思不得其解,请问哪位大虾给各指点,不胜感激!!!



下面是我们显示程序:
;max7219汇编测试程序

;**********************************************************
L0AD7219 BIT P1.0 ;MAX7219片选线引脚
CLK7219 BIT P1.1 ;MAX7219时钟线引脚
DIN7219 BIT P1.2 ;MAX7219数据线引脚
POWLED BIT P1.7 ;监视灯
;**********************************************************

DIG0 EQU 01H ;数据寄存器地址
DIG1 EQU 02H
DIG2 EQU 03H
DIG3 EQU 04H
DIG4 EQU 05H
DIG5 EQU 06H
DIG6 EQU 07H
DIG7 EQU 08H

DECMODE EQU 09H ;控制寄存器地址
INTENTY EQU 0AH
SCANLIM EQU 0BH
SHUTDOW EQU 0CH
DISTEST EQU 0FH


ORG 0000H
AJMP MAIN
ORG 0040H

MAIN:
MOV SP,#30H
CLR POWLED
LCALL INI7219
LCALL DELAY1S
CPL POWLED
LLLL:
LCALL SHOW7219
LJMP LLLL

RET
;//////////////////////////////////////////////////////
SHOW7219:
MOV A,#DIG0
MOV B,#00H
LCALL WRITE7219

MOV A,#DIG1
MOV B,#01H
LCALL WRITE7219

MOV A,#DIG2
MOV B,#02H
LCALL WRITE7219

MOV A,#DIG3
MOV B,#03H
LCALL WRITE7219

MOV A,#DIG4
MOV B,#04H
LCALL WRITE7219

MOV A,#DIG5
MOV B,#05H
LCALL WRITE7219

MOV A,#DIG6
MOV B,#06H
LCALL WRITE7219

MOV A,#DIG7
MOV B,#07H
LCALL WRITE7219


RET

;//////////////////////////////////////////////////////
INI7219:
MOV A,#SHUTDOW ;关机方式
MOV B,#00H
LCALL WRITE7219

MOV A,#DECMODE ;译码方式
MOV B,#0FFH
LCALL WRITE7219

MOV A,#INTENTY ;亮度15/32方式
MOV B,#07H
LCALL WRITE7219

MOV A,#SCANLIM ;显示8位LED
MOV B,#07H
LCALL WRITE7219

MOV A,#DISTEST ;正常显示
MOV B,#00H
LCALL WRITE7219

MOV A,#SHUTDOW ;开机方式
MOV B,#01H
LCALL WRITE7219

RET
;/////////////////////////////////////////////////////
WRITE7219:
NOP
CLR L0AD7219
LCALL SEND7219 ;先送控制寄存器的地址
MOV A,B ;B中为传送的命令字或待显的数据
LCALL SEND7219
NOP
SETB L0AD7219
RET
;////////////////////////////////////////////////////
SEND7219:
MOV R1,#08H
LOOPS:
NOP
CLR CLK7219
RLC A ;左移位送MSB
MOV DIN7219,C
NOP
SETB CLK7219
DJNZ R1,LOOPS
RET
;///////////////////////////////////////////////////

DELAY1S: MOV R7,#0AH ;延时1秒子程序(12M晶振)
LOOP6: MOV R5,#64H ;100ms循环
LOOP7: MOV R6,#64H
LOOP8: NOP ;1US
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R6,LOOP8 ;10US
DJNZ R5,LOOP7
DJNZ R7,LOOP6
RET

END

...全文
858 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
chqic 2011-01-11
  • 打赏
  • 举报
回复
dig0buf equ 40h
.
.
.
.
.
.
dig7buf equ 47h


SHOW7219:
MOV A,#DIG0
MOV B,dig0buf
LCALL WRITE7219

MOV A,#DIG1
MOV B,dig1buf
LCALL WRITE7219

MOV A,#DIG2
MOV B,dig2buf
LCALL WRITE7219

MOV A,#DIG3
MOV B,dig3buf
LCALL WRITE7219

MOV A,#DIG4
MOV B,dig4buf
LCALL WRITE7219

MOV A,#DIG5
MOV B,dig5buf
LCALL WRITE7219

MOV A,#DIG6
MOV B,dig6buf
LCALL WRITE7219

MOV A,#dig7
MOV B,dig7buf
LCALL WRITE7219
RET

把你要显示的数据放在相应缓冲区即可,0-9可以直接放入缓冲区,要显示字母就要按二进制与BCD转换回来。
希望对你有用
chqic 2011-01-11
  • 打赏
  • 举报
回复
小数点也可以了,#88H即显示是8后面有小数点。#8FH只显示小数点,#8XH就显示X后面有小数点。呵呵
chqic 2011-01-11
  • 打赏
  • 举报
回复
你要那位不显示,就在那一位的B中写#0FH即可,
比如:SHOW7219:
MOV A,#DIG0
MOV B,#00H
LCALL WRITE7219
以上语句把mov B,#00H改为mov B,#0fH,即DIG0位不显示
我倒是数字加小数点同显示不了。可能不可以用BCD码,直接查表输出应该功能强大点

skynet000 2009-10-01
  • 打赏
  • 举报
回复
大概看了一下,你的这个流程没什么问题。当然一些具体的汇编指令你自己确认是否正确。
1、因为你没有贴出你的原理图,没办法判断是否是你的硬件是好的。如果硬件出问题,软件没办法解。
2. 你是用SPI来发送cmd和data数据。那么请你确认这个Spi的timming是否是对的。你可以写一个间隔100ms循环发送一个固定数据,比如0x77,然后用示波器测量一下这三根线。是否波形时序是否正确(注意看SPI的clk速度是否符合MAX7219的要求,数据上面的电平的宽度是否符合,还有CS和第一个clk之间的间隔时间是否满足。)
3.检查你上面软体中定时1s是否正确。会不会是定时每可能只有几ms,这样不停刷新数据,你可能看到的都是FF。你可以不用循环显示这么多数0-8的数。一次只显示一个数据看看是否正确。

以上是一些建议,你可以从简单入手,比较容易澄清问题
LynnPan 2009-09-29
  • 打赏
  • 举报
回复
进位位应该每次要做清零的吧?
没怎么学汇编,看的有点费劲。呵呵。。。
magnwang 2009-09-24
  • 打赏
  • 举报
回复
??????????????????????????????
magnwang 2009-09-22
  • 打赏
  • 举报
回复
到底咋回事?
magnwang 2009-09-22
  • 打赏
  • 举报
回复
到底咋回事?
gooogleman 2009-09-22
  • 打赏
  • 举报
回复
好多年前做过这个东西,貌似要扫描的,不是同时亮的。

27,382

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧