📄 两片max7219的串联.txt
字号:
用【 小 | 中 | 大 】字体浏览
C51编程:经过两天的努力,终于调通了两片max7219的串联,贴上程序,请多指点! [z931zwl] [77次] 01-10-13 11:47:24
我在昨天发的贴子:<a href=http://www.c51bbs.com/c51bbs/moredata.asp?id=5942&syid=55208 target=_blank>http://www.c51bbs.com/c51bbs/moredata.asp?id=5942&syid=55208</a>
经过这两天的努力,终于调通了两片max7219的串联编程,程序如下:
;*********************************************
; Max7219 最底层调用函数
; UPDATA:2001.10.13
;*********************************************
NAME DISP
?PR?CLR_DISP?DISP SEGMENT CODE
?PR?CSH_DISP?DISP SEGMENT CODE
?PR?DISP_IN1?DISP SEGMENT CODE
?PR?DISP_IN2?DISP SEGMENT CODE
PUBLIC CLR_DISP,CSH_DISP,_DISP_IN1,_DISP_IN2
PCLK bit P1.7
PLD bit P1.5
PIN bit P1.6
;*********************************************
; 函数名: CLR_DISP
; 功 能: CLEAR DISPLAY
;*********************************************
RSEG ?PR?CLR_DISP?DISP
CLR_DISP: MOV R7,#8 ;8 digits
CLR_DISP0: MOV R5,#0FH ;blank
LCALL _disp_in1 ;主max7219
DJNZ R7,CLR_DISP0
MOV R7,#8 ;8
digits
CLR_DISP1: MOV R5,#0FH ;blank
LCALL _disp_in2 ;从max7219
DJNZ R7,CLR_DISP1
RET
;*********************************************
; 函数名: CSH_DISP
; 功 能: 初始化7219各个寄存器
;*********************************************
RSEG ?PR?CSH_DISP?DISP
CSH_DISP: CLR PLD
MOV R1,#50 ;delay 100us
DJNZ R1,$
SETB PLD
MOV R1,#50
DJNZ R1,$
;初始化主max7219各个寄存器
MOV R7,#0CH ;Shutdown
MOV R5,#1 ;Normal Operation 1
LCALL _disp_in1
MOV R7,#0FH ;Display Test
MOV R5,#01H ;1: display 8.
LCALL _disp_in1
MOV R1,#50
DJNZ R1,$
MOV R7,#09H ;Decode-Mode
MOV R5,#0FFH ;8 digits Code B Font
LCALL _disp_in1
MOV R7,#0AH ;REGISTER:Intensity
MOV R5,#9 ;Format:DUTY CYCLE 19/32
LCALL _disp_in1
MOV R7,#0BH ;REGISTER:Scan Limit
MOV R5,#07H ;Format:Display didits 0-7
LCALL _disp_in1
MOV R7,#0FH ;Display Test
MOV R5,#00H ;0: Normal Operation
LCALL _disp_in1
CLR PLD
MOV R1,#50
DJNZ R1,$
SETB PLD
MOV R1,#50
DJNZ R1,$
;初始化从max7219各个寄存器
;命令字和格式同上
MOV R7,#0CH
MOV R5,#01H
LCALL _disp_in2
MOV R7,#0FH
MOV R5,#01H
LCALL _disp_in2
MOV R1,#50
DJNZ R1,$
MOV R7,#09H
MOV R5,#0FFH
LCALL _disp_in2
MOV R7,#0AH
MOV R5,#9
LCALL _disp_in2
MOV R7,#0BH
MOV R5,#07H
LCALL _disp_in2
MOV R7,#0FH
MOV R5,#00H
LCALL _disp_in2
RET
;*********************************************
; 函数名: _disp_in1
; 功 能: 将16位数据送入主max7219寄存器
; 输 入: R7 寄存器,地址
; R5 寄存器,数据
;*********************************************
RSEG ?PR?disp_in1?DISP
_disp_in1: CLR PLD ;LOAD=0
MOV R6,#16
MOV A,#0
DIN_LP0: CLR PCLK
RLC A ;带进位C的循环
MOV PIN,C
SETB PCLK
DJNZ R6,DIN_LP0
;通过16个CLK,将16个0通过DOUT送入从max7219的DIN
;也可以不需要这16个循环,只是为了同从max7219的程序区别起见
MOV R6,#8
MOV A,R7 ;将第一个字节的8位送入
DIN_LP1: CLR PCLK ;寄存器,地址
RLC A
MOV PIN,C
SETB PCLK
DJNZ R6,DIN_LP1
MOV R6,#8
MOV A,R5 ;将第二个字节的8位送入
DIN_LP2: CLR PCLK ;寄存器,数据
RLC A
MOV PIN,C
SETB PCLK
DJNZ R6,DIN_LP2
SETB PLD ;LOAD 上升沿
RET
;*********************************************
; 函数名: _disp_in2
; 功 能: 将16位数据送入从max7219寄存器
; 输 入: R7 寄存器,地址
; R5 寄存器,数据
;*********************************************
RSEG ?PR?disp_in2?DISP
_DISP_IN2: CLR PLD
MOV R6,#08H
MOV A,R7 ;R7 第一个字节8位
DIN_LP3: CLR PCLK
RLC A
MOV PIN,C
SETB PCLK
DJNZ R6,DIN_LP3
MOV R6,#08H
MOV A,R5 ;R5 第二个字节8位
DIN_LP4: CLR PCLK
RLC A
MOV PIN,C
SETB PCLK
DJNZ R6,DIN_LP4
MOV R6,#16
MOV A,#0
DIN_LP5: CLR PCLK
RLC A
MOV PIN,C
SETB PCLK
DJNZ R6,DIN_LP5
;通过16个clk,将R7,R5的16位数据通过DOUT送入从max7219的DIN
SETB PLD ;LOAD 上升沿
RET
END
测试程序:
#include <string.h>
#include <max7219.h>
#include <delay.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
uchar led_buf[17];
extern void led_printf();
extern void show_int(bit mode,ulong n);
void main()
{
csh_disp();
clr_disp();
memset(led_buf,15,16); // 初始化缓冲区
的内容,不显示
while(1)
{
show_int(0,12345678); // 主max7219显示12345678
show_int(1,98765432); // 从max7219显示98765432
delay_10ms(100);
clr_disp();
delay_10ms(100);
}
}
void led_printf()
{
uchar i;
for(i=0;i<8;i++)
{
disp_in1(i+1,led_buf[i]);
disp_in2(i+1,led_buf[8+i]);
}
}
void show_int(bit mode,ulong n)
{
ulong temp;
uchar i=0;
temp=n;
if(!mode)
{
for(i=0;i<7;i++)
led_buf[i]=15;
led_buf[7]=0;
i=0;
while(temp>0)
{
led_buf[7-i]=temp%10;
temp/=10;
i++;
}
}
else
{
for(i=0;i<7;i++)
led_buf[8+i]=15;
led_buf[15]=0;
i=0;
while(temp>0)
{
led_buf[15-i]=temp%10;
temp/=10;
i++;
}
}
led_printf();
}
我用的是KEIL 6.20,双龙的SL-K51L仿真器(ETOOL的杰作),单步仿真,运行都没有问题!
程序有不足之处,请多多指点!
是不是7219已经过时了? [dk-boy] [13次] 01-10-13 11:49:48
是谁说的,我觉得用它的人还是很多! [z931zwl] [11次] 01-10-13 11:51:04
补充一点:两片MAX7219的CLK,LOAD连在一起,主的DOUT--从的DIN [z931zwl] [17次] 01-10-13 11:58:23
价格太贵!不是吗?? [dk-boy] [13次] 01-10-13 12:00:13
但是它的连接和编程简单好用! [z931zwl] [11次] 01-10-13 13:27:55
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2002
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -