⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 max7219的串联编程.txt

📁 c51经典子程序代码全集
💻 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 + -