基于51单片机Proteus的8X8led点阵滚动显示图形

基于51单片机Proteus的8X8led点阵滚动显示图形


在这里插入图片描述

  • 器件材料:74HC595AT89C51
  • Proteus仿真

实例代码

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
88
89
90
91
92
93
94
95
#include<reg52.h>
#include<intrins.h>

//intrins.h函数,一般出现在C51单片机编程中,一般程序中需要使用到空指令\_nop\_();字符循环移位指令\_crol\_等时使用
//OE 第13脚 输出有效(低电平)
//MR 第10脚 主复位(低电平)

typedef unsigned char uchar;
typedef unsigned int uint;


/\*\*\*\*\*\*\*\*\*\*管脚说明\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
#define P P1 //define 不用加;

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

/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

/\*\*\*\*\*\*\*\*\*\*函数声明\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
void SendTo595(uchar byteData);
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/

/\*\*\*\*\*\*\*\*\*\*全局参数声明\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
char shu=0xFE;
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/


void delay(unsigned int n)//延时函数
{
unsigned int i=0,j=0;
for(i=0;i<n;i++)
for(j=0;j<123;j++);
}

void hang()//行扫描
{
P=shu;
shu=\_crol\_(shu,1);
}

char code a[32]={0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,
0x00,0x66,0x99,0x81,0x42,0x24,0x18,0x00,
0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void main()
{
int i,b=0;
while(1)
{
int num=12;
while(num--)
{
for(i=0;i<8;i++)
{
hang(); //先位选再段选
SendTo595(a[i+b]);
delay(2);
}
//P=0xFF;
//SendTo595(0x00);
}
b++;
if(b>=24)b=0;
//P=0xFF;
}
}



//发送一个字节数据给595再并行输出
void SendTo595(uchar Data)
{
int j=0;
for(j;j<8;j++)
{
SCK = 0;
SER=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
Data=\_crol\_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么\_crol\_(1) 为10101010
SCK = 1; //上升沿让串行输入时钟变成高电平 并延时两个时钟周期
\_nop\_();
\_nop\_();
}

/\*位移寄存器完毕,转移到存储寄存器\*/


RCK = 0;
RCK = 1; //上升沿,存储寄存器变为高电平 延迟两个时钟周期
\_nop\_();
RCK = 0;

}

注意事项

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