【單片機】LED16*16點陣顯示實驗
- 一、操作目的
- 二、操作内容
- 三、接線圖
- 四、程式清單
- 五、代碼詳解
一、操作目的
- 利用單片機并行控制LED點陣顯示。
- 掌握單片機與LED點陣塊之間接口電路設計及程式設計。
- 利用取模軟體建立标準字庫,編制程式實作點陣循環左移顯示漢字。
二、操作内容
三、接線圖
四、程式清單
;L-SAO-1,CTL-MODE:BING XIN KO
XPB EQU 0FF29H ;L-SAO-2
;---------------------------------------------------------------
XPC EQU 0FF2AH ;H-CODE-2
XPCTL EQU 0FF2BH
START: MOV DPTR,#XPCTL ;THIS IS A PROGRAM OF L-MOVE-WORD
MOV A,#80H
MOVX @DPTR,A ;WR-CTL
CALL OFFLED ;OFFLED
CLR 00H
MOV R6,#28H
MOV R7,#0FFH
;----------------------------------------
X0: MOV R0,#00H ;ONE-WORD-FIRST-NUM
X1: CALL DEL1 ;QI
INC R0 ;RL-1-BIT
mov a,r0
anl a,#0fh
cjne a,#00h,l2
mov a,#10h
add a,r0
mov r0,a
l2: CJNE R0,#00H,X1
SJMP X0
;---------------------------------------------------------------
DISPW: PUSH 00H ;DISP-ONE-WORD
MOV R1,#01H ;L-NUM
CLR C
DISP1: MOV A,R0 ;BH1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#XPC
MOVX @DPTR,A
;-------------------------------------------
mov a,#10h
add a,r0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P1,A
INC R0 ;BH2
;-------------------------------------------
mov a,r0
anl a,#0fh
cjne a,#00h,l1
mov a,#10h
add a,r0
mov r0,a
clr c ;!!!!!
l1: MOV DPL,R6 ;XPA/XPB
MOV DPH,R7
MOV A,R1 ;L0----L7
CPL A
MOVX @DPTR,A
mov r3,#80h
djnz r3,$
CALL OFFLED
MOV A,R1
RLC A
MOV R1,A
JNC DISP1
JB 00H,EXIT
;----------------------------------
SETB 00H
CLR C
MOV R1,#01H
MOV R6,#29H
MOV R7,#0FFH
AJMP DISP1
EXIT: MOV R6,#28H
MOV R7,#0ffH
CLR 00H
POP 00H
RET
;---------------------------------------------------------------
DEL1: MOV R2,#05H
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H
DEL4: DJNZ R2,DEL4
CALL DISPW
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
;---------------------------------------------------------
OFFLED: MOV DPTR,#XPA
MOV A,#0FFH
MOVX @DPTR,A
MOV DPTR,#XPB
五、代碼詳解
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define com8255 XBYTE[0xff2b]//宏定義口位址
#define pa8255 XBYTE[0xff28]
#define pb8255 XBYTE[0xff29]
#define pc8255 XBYTE[0xff2a]
/*-- 文字: 張 --*/
/*-- 宋體12; 此字型下對應的點陣為:寬x高=16x16 --*/
/*-- 0x01,0x00,0xF9,0x08,0x09,0x08,0x09,0x10,0x09,0x20,0x79,0x40,0x41,0x00,0x47,0xFE,
0x41,0x40,0x79,0x20,0x09,0x20,0x09,0x10,0x09,0x08,0x09,0x44,0x51,0x82,0x21,0x00 --*/
/*-- 文字: 三 --*/
/*-- 宋體12; 此字型下對應的點陣為:寬x高=16x16 --*/
/*-- 0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00 --*/
uchar code zhang[35] = {0x01,0x00,0xF9,0x08,0x09,0x08,0x09,0x10,0x09,0x20,0x79,0x40,0x41,0x00,0x47,0xFE, 0x41,0x40,0x79,0x20,0x09,0x20,0x09,0x10,0x09,0x08,0x09,0x44,0x51,0x82,0x21,0x00};
uchar code san[35] = {0x00,0x00,0x00,0x00,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00};
void main(void)
{
com8255 = 0x80; //控制口指派
while (1)
{
unsigned int i = 0, j = 0, k = 0, nn = 0;
unsigned int x = 0, y = 0;
unsigned int tag = 0;
//張
while (1)
{
for (i = 0; i < 32; i = i + 2)
{
x = 0, y = 0;
j = 1 << (15 - i / 2);
pc8255 = j >> 8;
P1 = j - ((j >> 8) << 8);
k = ((zhang[i]) << 8) + (zhang[i + 1]);
for (nn = 0; nn < 8; nn++)
{
if (k >> nn & 1)
x = (x << 1) + 1;
else
x = x << 1;
}
for (nn = 8; nn < 16; nn++)
{
if (k >> nn & 1)
y = (y << 1) + 1;
else
y = y << 1;
}
pb8255 = ~x;
pa8255 = ~y;
}
tag++;
if (tag == 50)
break;
}
tag = 0;
//三
while (1)
{
for (i = 0; i < 32; i = i + 2)
{
x = 0, y = 0;
j = 1 << (15 - i / 2);
pc8255 = j >> 8;
P1 = j - ((j >> 8) << 8);
k = ((san[i]) << 8) + (san[i + 1]);
for (nn = 0; nn < 8; nn++)
{
if (k >> nn & 1)
x = (x << 1) + 1;
else
x = x << 1;
}
for (nn = 8; nn < 16; nn++)
{
if (k >> nn & 1)
y = (y << 1) + 1;
else
y = y << 1;
}
pb8255 = ~x;
pa8255 = ~y;
}
tag++;
if (tag == 50)
break;
}
tag = 0;
}
}