|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
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 ;FormatUTY CYCLE 19/32
LCALL _disp_in1
MOV R7,#0BH ;REGISTER:Scan Limit
MOV R5,#07H ;Formatisplay 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);
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=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();
} |
|