基于51单片机Proteus的8X8led点阵心滚动

基于51单片机Proteus的8X8led点阵心滚动


在这里插入图片描述

实例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# include <reg52.h>
#include<intrins.h>

typedef unsigned int u16;
typedef unsigned char u8;

sbit SER=P3^4; //p3.4串行数据输入 DS
sbit CLK=P3^5;//串行输入时钟,上升沿有效 SHCP 第11脚 数据输入时钟线
sbit SRCLK=P3^6;//串行寄存器时钟,上升沿有效 STCP 第12脚 输出存储器锁存时钟线

u8 code ledwidth[][8]= {
{0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00},
{0x30,0x78,0x3C,0x1E,0x3C,0x78,0x30,0x00},
{0x18,0x3C,0x1E,0x0F,0x1E,0x3C,0x18,0x00},
{0x00,0x18,0x3C,0x1E,0x0F,0x1E,0x3C,0x18},
{0x00,0x30,0x78,0x3C,0x1E,0x3C,0x78,0x30},
{0x00,0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60},

{0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00},
{0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00},
{0x30,0x78,0x3C,0x1E,0x3C,0x78,0x30,0x00},
{0x18,0x3C,0x1E,0x0F,0x1E,0x3C,0x18,0x00},
{0x00,0x18,0x3C,0x1E,0x0F,0x1E,0x3C,0x18},
{0x00,0x30,0x78,0x3C,0x1E,0x3C,0x78,0x30},
{0x00,0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60},

{0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00},
{0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00},
{0x30,0x78,0x3C,0x1E,0x3C,0x78,0x30,0x00},
{0x18,0x3C,0x1E,0x0F,0x1E,0x3C,0x18,0x00},
{0x00,0x18,0x3C,0x1E,0x0F,0x1E,0x3C,0x18},
{0x00,0x30,0x78,0x3C,0x1E,0x3C,0x78,0x30},
{0x00,0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60},

{0x60,0xF0,0x78,0x3C,0x78,0xF0,0x60,0x00}
};

u16 ledlength[]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};


void delay\_ms(u16 i)
{
while(i--);
}

void send(u8 n)
{
u8 i;
CLK=0;
SRCLK=0;
for(i=0; i<8; i++)
{
SER=n>>7;
n<<=1;
SRCLK=0;
SRCLK=1;

}
CLK=1;
}

int main()
{
u16 n,i,j=0;
while(1)
{
for(i=0; i<100; i++)
{
for(n=0; n<8; n++)
{

P1=ledlength[n];
send(ledwidth[j][n]);
delay\_ms(100);
P1=0xff;
send(0x00);

}
}
j++;
j%=21;
}
return 0;
}



注意事项

  • 首先确定8*8led点阵的阴极和阳极端。确定方法,可以参照我上面仿真图中上方的方式,我已经把Proteus里面不同颜色的led点阵模块的方向都已经列出来了,阴极端接单片机的IO口端,阳极端接74HC595端。