51单片机8*8点阵LED显示原理及程序
2012-06-02
标签: LED

在8X8点阵LED上显示柱形,让其先从左到右平滑移动三次,其次从右到左平滑移动三次,再次从上到下平滑移动三次,最后从下到上平滑移动三次,如此循环下去。

1. 程序设计内容

8X8点阵LED工作原理说明 :8X8点阵共需要64个发光二极管组成,且每个发光二极管是放置在行线和列线的交叉点上,当对应的某一列置1电平,某一行置0电平,则相应的二极管就亮;因此要实现一根柱形的亮法,如图49所示,对应的一列为一根竖柱,或者对应的一行为一根横柱,因此实现柱的亮的方法如下所述:

  • 一根竖柱:对应的列置1,而行则采用扫描的方法来实现。
  • 一根横柱:对应的行置0,而列则采用扫描的方法来实现。

2. 硬件电路

3.汇编源程序

        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


4.C51语言源程序

#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();
            }
        }
    }
}


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号