(1)8*8点阵原理:通过动态扫描方法,运用74HC595芯片进行操作。让74HC595的数据端输出想要的数据,通过P0口,进行点亮。
(2)原理图:
(3)源代码:
#include<reg51.h>
#include<intrins.h>
typedef unsigned char u8;
typedef unsigned int u16;
sbit RCLK=P3^5;
sbit SRCLK=P3^6;
sbit SER=P3^4;
u8 ledduan1 []={
0x00,0x00,0x41,0x7f,0x7f,0x41,0x00,0x00};
u8 ledwei1[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xff,0xff};
u8 ledduan2 []={
0x38,0x7c,0x7e,0x3f,0x3f,0x7e,0x7c,0x38};
u8 ledwei2[]={
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
u8 ledduan3 []={
0x00,0x7e,0x7f,0x01,0x01,0x7f,0x7e,0x00};
u8 ledwei3[]={
0xff,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xff};
void delay(u16 i)
{
while(i--);
}
void HC595SendByte(u8 dat)//可以直接调用
{
u8 i;
SRCLK=0;//上升沿,移位寄存器移位,保存在
//移位寄存器里面
RCLK=0;//
for(i=0;i<8;i++)
{
SER=dat>>7;//最先传送高位
dat<<=1;//次高位左移
SRCLK=1;
_nop_();
_nop_();//一个机器周期
SRCLK=0;//存储在存储寄存器
}
RCLK=1;
_nop_();
_nop_();//一个机器周期
RCLK=0;
}
void display()
{
u8 a;
for(a=0;a<8;a++)
{
P0=ledwei1[a];
HC595SendByte(ledduan1[a]);
delay(100);
HC595SendByte(0x00);
}
}
void displayl()
{
u8 b;
for(b=0;b<8;b++)
{
P0=ledwei2[b];
HC595SendByte(ledduan2[b]);
delay(100);
HC595SendByte(0x00);
}
}
void displayp()
{
u8 c;
for(c=0;c<8;c++)
{
P0=ledwei3[c];
HC595SendByte(ledduan3[c]);
delay(100);
HC595SendByte(0x00);
}
}
void main()
{
u8 h;
while(1)
{
for(h=0;h<3;h++)
{
display();
delay(65535);
displayl();
delay(65535);
displayp();
delay(65535);
}
}
}