?? 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 + -