在8X8点阵式LED显示“★”、“●”和心形图,通过按键来选择要显示的图形。

(1).把“单片机系统”区域中的P1端口用8芯排芯连接到“点阵模块”区域中的“DR1-DR8”端口上;
(2).把“单片机系统”区域中的P3端口用8芯排芯连接到“点阵模块”区域中的“DC1-DC8”端口上;
(3).把“单片机系统”区域中的P2.0/A8端子用导线连接到“独立式键盘”区域中的SP1端子上;
(1).“★”在8X8LED点阵上显示图如下图所示
| ● | |||||||
| ● | |||||||
| ● | ● | ● | |||||
| ● | ● | ● | ● | ● | ● | ● | |
| ● | ● | ● | |||||
| ● | ● | ● | ● | ||||
| ● | ● | ||||||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
12H,14H,3CH,48H,3CH,14H,12H,00H
(2).“●”在8X8LED点阵上显示图如下图所示
| ● | ● | ● | |||||
| ● | ● | ||||||
| ● | ● | ||||||
| ● | ● | ||||||
| ● | ● | ● | |||||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
00H,00H,38H,44H,44H,44H,38H,00H
(3).心形图在8X8LED点阵上显示图如下图所示
| ● | ● | ● | ● | ||||
| ● | ● | ● | |||||
| ● | ● | ||||||
| ● | ● | ||||||
| ● | ● | ||||||
| ● | |||||||
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
30H,48H,44H,22H,44H,48H,30H,00H
CNTA EQU 30H
COUNT EQU 31H
ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CNTA,#00H
MOV COUNT,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000) / 256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: JB P2.0,WT
MOV R6,#5
MOV R7,#248
D1: DJNZ R7,$
DJNZ R6,D1
JB P2.0,WT
INC COUNT
MOV A,COUNT
CJNE A,#03H,NEXT
MOV COUNT,#00H
NEXT: JNB P2.0,$
SJMP WT
T0X: NOP
MOV TH0,#(65536-4000) / 256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#TAB
MOV A,CNTA
MOVC A,@A+DPTR
MOV P3,A
MOV DPTR,#GRAPH
MOV A,COUNT
MOV B,#8
MUL AB
ADD A,CNTA
MOVC A,@A+DPTR
MOV P1,A
INC CNTA
MOV A,CNTA
CJNE A,#8,NEX
MOV CNTA,#00H
NEX: RETI
TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
GRAPH: DB 12H,14H,3CH,48H,3CH,14H,12H,00H
DB 00H,00H,38H,44H,44H,44H,38H,00H
DB 30H,48H,44H,22H,44H,48H,30H,00H
END
6.C语言源程序
#include <AT89X51.H>
unsigned char code tab[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
unsigned char code graph[3][8] = {{0x12, 0x14, 0x3c, 0x48, 0x3c, 0x14, 0x12, 0x00},
{0x00, 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, 0x00},
{0x30, 0x48, 0x44, 0x22, 0x44, 0x48, 0x30, 0x00}
};
unsigned char count;
unsigned char cnta;
void main(void)
{
unsigned char i, j;
TMOD = 0x01;
TH0 = (65536 - 4000) / 256;
TL0 = (65536 - 4000) % 6;
TR0 = 1;
ET0 = 1;
EA = 1;
while (1) {
if (P2_0 == 0) {
for (i = 5; i > 0; i--)
for (j = 248; j > 0; j--);
if (P2_0 == 0) {
count++;
if (count == 3) {
count = 0;
}
while (P2_0 == 0);
}
}
}
}
void t0(void) interrupt 1 using 0
{
TH0 = (65536 - 4000) / 256;
TL0 = (65536 - 4000) % 6;
P3 = tab[cnta];
P1 = graph[count][cnta];
cnta++;
if (cnta == 8) {
cnta = 0;
}
}