在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。
8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:
ORG 00H
START: NOP
MOV R3,#3
LOP2: MOV R4,#8
MOV R2,#0
LOP1: MOV P1,#0FFH
MOV DPTR,#TABA
MOV A,R2
MOVC A,@A+DPTR
MOV P3,A
INC R2
LCALL DELAY
DJNZ R4,LOP1
DJNZ R3,LOP2
MOV R3,#3
LOP4: MOV R4,#8
MOV R2,#7
LOP3: MOV P1,#0FFH
MOV DPTR,#TABA
MOV A,R2
MOVC A,@A+DPTR
MOV P3,A
DEC R2
LCALL DELAY
DJNZ R4,LOP3
DJNZ R3,LOP4
MOV R3,#3
LOP6: MOV R4,#8
MOV R2,#0
LOP5: MOV P3,#00H
MOV DPTR,#TABB
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A
INC R2
LCALL DELAY
DJNZ R4,LOP5
DJNZ R3,LOP6
MOV R3,#3
LOP8: MOV R4,#8
MOV R2,#7
LOP7: MOV P3,#00H
MOV DPTR,#TABB
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A
DEC R2
LCALL DELAY
DJNZ R4,LOP7
DJNZ R3,LOP8
LJMP START
DELAY: MOV R5,#10
D2: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
TABA: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH
TABB: DB 01H,02H,04H,08H,10H,20H,40H,80H
END
#include <reg51.h>
unsigned char code taba[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};
unsigned char code tabb[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
void delay(void)
{
unsigned char i, j;
for (i = 10; i > 0; i--)
for (j = 248; j > 0; j--);
}
void delay1(void)
{
unsigned char i, j, k;
for (k = 10; k > 0; k--)
for (i = 20; i > 0; i--)
for (j = 248; j > 0; j--);
}
void main(void)
{
unsigned char i, j;
while (1) {
for (j = 0; j < 3; j++) { //from left to right 3 time
for (i = 0; i < 8; i++) {
P3 = taba[i];
P1 = 0xff;
delay1();
}
}
for (j = 0; j < 3; j++) { //from right to left 3 time
for (i = 0; i < 8; i++) {
P3 = taba[7 - i];
P1 = 0xff;
delay1();
}
}
for (j = 0; j < 3; j++) { //from top to bottom 3 time
for (i = 0; i < 8; i++) {
P3 = 0x00;
P1 = tabb[7 - i];
delay1();
}
}
for (j = 0; j < 3; j++) { //from bottom to top 3 time
for (i = 0; i < 8; i++) {
P3 = 0x00;
P1 = tabb[i];
delay1();
}
}
}
}