学习目标:
1.原理图
2.LED点阵介绍
3.LED点阵编程实践
4.LED字模
学习内容:
74HC595D:
SER(10101100)串行输入端,在时钟信号的作用下把,把一个字节数据一位一位传入内部寄存器
QH’ 串行输出端,可以接下一个595D的 SER 串行输入端
SCLK 移位时钟 从低电平到高电平上升沿对SER上的数据采一次样
RCLK 锁存时钟 QA-QH在RCLK一次上升验进行输出更新
QA 1 //QA-QH同时在不同引脚输出,并行输出端
QB 0
QC 1
QD 0
QE 1
QF 1
QG 0
QH 0
(1)主函数版本
#include<reg51.h>
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SCLK=P3^6;
void main()
{
unsigned char i=0;
unsigned char d1,d2,d3,d4; //传入的数据
d1 = 0;
d2 = 0;
d3 = 0xff;
d4 = 0xff;
SCLK=0;
RCLK=0;
for(i=0;i<8;i++)
{
SER = d1>>7; //将d1的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d1 = d1<<1;
}
//至此已经在8个SCLK上升沿吧d1的8位依次全部发出去了
for(i=0;i<8;i++)
{
SER = d2>>7; //将d2的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d2 = d2<<1;
}
for(i=0;i<8;i++)
{
SER = d3>>7; //将d3的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d3 = d3<<1;
}
for(i=0;i<8;i++)
{
SER = d4>>7; //将d4的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d4 = d4<<1;
}
/////4个595D同时锁存
RCLK=0;
RCLK=1;
}
(2)子函数板
#include<reg51.h>
#define uchar unsigned char
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SCLK=P3^6;
void SendData(uchar d1,uchar d2,uchar d3,uchar d4)
{
unsigned char i=0;
SCLK=0;
RCLK=0;
for(i=0;i<8;i++)
{
SER = d1>>7; //将d1的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d1 = d1<<1;
}
//至此已经在8个SCLK上升沿吧d1的8位依次全部发出去了
for(i=0;i<8;i++)
{
SER = d2>>7; //将d2的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d2 = d2<<1;
}
for(i=0;i<8;i++)
{
SER = d3>>7; //将d3的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d3 = d3<<1;
}
for(i=0;i<8;i++)
{
SER = d4>>7; //将d4的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d4 = d4<<1;
}
/////4个595D同时锁存
RCLK=0;
RCLK=1;
}
void main()
{
//595 d1 d2对应负极, d3 d4对应正极
// d1 d3对应9-16 d2 d4对应1-8
SendData(0x00,0x00,0xff,0xff); //全亮
SendData(0x00,0x00,0x00,0xff);
}
(3)LED字模
#include<reg51.h>
#define uchar unsigned char
sbit SER=P3^4;
sbit RCLK=P3^5;
sbit SCLK=P3^6;
void SendData(uchar d1,uchar d2,uchar d3,uchar d4);
void Display(uchar zimu[32],uchar hang[32]);
uchar zhao[32]={0x10,0x00,0x10,0x20,0x10,0x21,0x7E,0x22,
0x10,0x14,0x10,0x14,0x7F,0x08,0x10,0x08,
0x14,0x14,0x14,0x14,0x74,0x22,0x14,0x21,
0x14,0x00,0x1A,0x00,0xF2,0x7F,0x01,0x00};
uchar hang[32]={0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,
0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,
0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,
0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
};
void SendData(uchar d1,uchar d2,uchar d3,uchar d4)
{
unsigned char i=0;
SCLK=0;
RCLK=0;
for(i=0;i<8;i++)
{
SER = d1>>7; //将d1的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d1 = d1<<1;
}
//至此已经在8个SCLK上升沿吧d1的8位依次全部发出去了
for(i=0;i<8;i++)
{
SER = d2>>7; //将d2的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d2 = d2<<1;
}
for(i=0;i<8;i++)
{
SER = d3>>7; //将d3的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d3 = d3<<1;
}
for(i=0;i<8;i++)
{
SER = d4>>7; //将d4的最高bit取出来给SER
SCLK = 0;
SCLK = 1;
d4 = d4<<1;
}
/////4个595D同时锁存
RCLK=0;
RCLK=1;
}
void Display(uchar zimu[32],uchar hang[32])
{
uchar i = 0;
for(i=0;i<8;i++)
{
SendData(~zimu[2*i+1],~zimu[2*i],hang[2*i],hang[2*i+1]);
}
}
void main()
{
//595 d1 d2对应负极, d3 d4对应正极
// d1 d3对应9-16 d2 d4对应1-8
////////////////上一半///////////////
// SendData(~0x00,~0x10,0x00,0x01); //d3 d4选择哪一行 d1 d2选择哪一列
// SendData(~0x20,~0x10,0x00,0x02);
// SendData(~0x21,~0x10,0x00,0x04);
// SendData(~0x22,~0x7e,0x00,0x08);
// SendData(~0x14,~0x10,0x00,0x10);
// SendData(~0x14,~0x10,0x00,0x20);
// SendData(~0x08,~0x7f,0x00,0x40);
// SendData(~0x08,~0x10,0x00,0x80);
////////////////////////////////////////
Display(zhao,hang);
}