单片机第1季:零基础学51单片机-LED点阵

本文介绍了使用74HC595D芯片控制LED点阵的基础知识及编程方法,包括串行数据传输过程、实现LED全亮及显示特定图案的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习目标:

1.原理图
2.LED点阵介绍
3.LED点阵编程实践
4.LED字模


学习内容:

LED


596D

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值