51单片机LED点阵控制原理、74HC595工作原理和字母和滚动显示实验代码

目录

1. 74HC595工作原理图解

 2.LED点阵控制原理

3.点阵LED实验

3.1 配置74HC595代码

3.2 D点阵LED显示H 

 3.3 滚动LED 

(1) 滚动扫描图示

 (2)程序代码

4.遇到奇怪的bug


1. 74HC595工作原理图解

 

  •  \overline{OE}:        输出使能,输入低电平允许输出,因此需要用接线帽j24让oe和地短接。(但是我普中A2的板子,不管oe接vcc还是gnd都能输出,奇了怪了,不知道是不是个例)
  • \overline{SRCLK}:低点平时将移位寄存器的数据清零,因此常接高电平VCC
  • SRCLK:上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH(如果有扩                         展,还会移到QH'),下降沿移位寄存器数据不变
  • SER:     串行数据输入端 
  • RCLK:  上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
  • QA--QH:   八位并行输出端。
  • QH':         级联输出端。将它接下一个 595 的 SER 端。 

         要输入的数据串行的从 SER 输入移位寄存器,当SRCLK 上升沿,比特数据在移位寄存器中移动(往高地址)。当 RCLK 上升沿时移位寄存器的数据进入数据存储寄存器,最终并行的发送出Q1-QH口。

        如果你需要级联(可能为了扩展更多IO口),当移位寄存器继续移位,最高位会溢出通过下一个595芯片SER进入其移位寄存器。

 2.LED点阵控制原理

 

         LED点阵排列呈矩阵状排布,P35,P34,P36通过74HC595芯片控制每一行LED正极,P00~P07连接每一列阴极。这样连接一方面也因为该单片机芯片是弱上拉,强下拉。

        一行,一列可以确定一个LED,一个时刻只能操作一行或一列上的LED,有关显示图形的(涉及多行多列’同时‘显示),可以类似数码管显示多位,在LED点阵上逐行或逐列扫描,利用电子电路的快,骗过眼睛。

3.点阵LED实验

3.1 配置74HC595代码

        因为RCLK与头文件<REGX52.H>中RCLK重名,我们换一个位变量名RCK

 

sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;
//sbit只能在外部定义全局变量,是SFR(特殊功能寄存器)的bit

3.2 D点阵LED显示H 

#include <REGX52.H>
#include <Delay1ms.H>

sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;

/*74HC595输出byte*/
void _74Hc595_WriteByte(unsigned char byte) {
	unsigned int i;

//将形参byte从高位到低位输入移位寄存器
	for(i=0;i<8;i++)
	{
		SER = byte&(0x80>>i);
		SRCLK = 1;//上升沿接收SER并移位
		SRCLK = 0;//复位
	}
	RCK = 1;//将移位寄存器并行发送到数据寄存器最终输出
	RCK =0;//复位
}	

/*选择在led点阵上第0列到第7列(共8列)上第Column列,根据Data二进制0/1显示led*/
void MatrixLed_ShowColumn(unsigned char Column,Data) {
	_74Hc595_WriteByte(Data);
	P0 = ~(0x80>>Column);//P0控制着选择第几列被选中
	Delay1ms(1);//太快切换会暗
	P0 = 0xFF;//消影
}
int main()
{
	SRCLK = 0;
	RCK = 0;

	while(1)
	{
        //快速的依次在八列上显示
		MatrixLed_ShowColumn(0,0x00);
		MatrixLed_ShowColumn(1,0xFF);
		MatrixLed_ShowColumn(2,0x10);
		MatrixLed_ShowColumn(3,0x10);
		MatrixLed_ShowColumn(4,0x10);
		MatrixLed_ShowColumn(5,0x10);
		MatrixLed_ShowColumn(6,0xFF);
		MatrixLed_ShowColumn(7,0x00);

	}
	
}

 3.3 滚动LED 

(1) 滚动扫描图示

 ………………移动  \rightarrow \rightarrow \rightarrow \rightarrow \rightarrow

         接下来,重新回到,同时因为前后的空白,能够不至于滚动到E后突然跳到L,而是跳到L前面空白,让滚动更平滑。

 (2)程序代码

#include <REGX52.H>
#include <Delay1ms.H>

sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;

//存放要滚动字母形的每一列74HC595输出二进制状态,如上图0x行所写
unsigned char Scroll_letter[44] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x01,0x01,0x3c,0x42,0x81,0x81,0x42,0x3c,0x00,0x80,0x60,0x18,0x06,0x01,0x06,0x18,0x60,0x80,0x00,0xff,0x91,0x91,0x91,0x91,0x91,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//可以unsigned char code Scroll_letter[44] 将该数组放到flash程序存储空间里,不占用RAM,但是这样无法更改数组
void _74Hc595_WriteByte(unsigned char byte) {
	unsigned int i;

	for(i=0;i<8;i++)
	{
		SER = byte&(0x80>>i);
		SRCLK = 1;
		SRCLK = 0;
	}
	RCK = 1;
	RCK =0;
}	

void MatrixLed_ShowColumn(unsigned char Column,Data) {
	_74Hc595_WriteByte(Data);
	P0 = ~(0x80>>Column);
	Delay1ms(1);
	P0 = 0xFF;
}
int main()
{
    //偏移量,led最多显示8列,而偏移量决定显示从Scroll_letter数组那一列开始的八列
	unsigned char start_col = 0;
    //i决定显示led中八列中任何一列
    //count也是为了保证滚动平滑型
	unsigned char i,count=0;
	SRCLK = 0;
	RCK = 0;

	
	
	while(1)
	{

		for(i=0;i<8;i++)
		{
			MatrixLed_ShowColumn(i,Scroll_letter[start_col+i]);
		}
		count++;
        //让每八列停留10个count自加时间(也可以用定时器)
		if(count>10)
		{
			count = 0;
			start_col++;
		}
        //当偏移量走到能和i能把最后一个字母E都显示完,则重新滚动
		if(start_col==36)
			start_col=0;

			

	}
	
}

4.遇到奇怪的bug

 /* 将第一行第一列灯点亮 */

#include <REGX52.H>
sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;

void Column1_74Hc595_WriteByte(unsigned char byte) {
	unsigned char i;
	
	P0_7 = 0;//第一列被选中,阴极赋低电平
	for(i=0;i<8;i++)
	{
		SER = byte&(0x80>>i);// 当byte=0x80 即 1000 0000 ,则第一行赋高电平
		SRCLK = 1;
		SRCLK = 0;
	}
	RCK = 1;
	RCK =0;
}	
int main()
{
	SRCLK = 0;
	RCK = 0;
    
    //将第一行第一列灯点亮
	Column1_74Hc595_WriteByte(0x80);
	while(1)
	{
	}
	
}

 点亮了:

复位后,灭了:

 

 /* 将第一列灯点亮 */

#include <REGX52.H>
sbit RCK = P3^5;
sbit SRCLK = P3^6;
sbit SER = P3^4;

void Column1_74Hc595_WriteByte(unsigned char byte) {
	unsigned char i;
	
	P0_7 = 0;//第一列被选中,阴极赋低电平
	for(i=0;i<8;i++)
	{
		SER = byte&(0x80>>i);// 当byte=0xff 即 1111 1111 ,则八行都赋高电平
		SRCLK = 1;
		SRCLK = 0;
	}
	RCK = 1;
	RCK =0;
}	
int main()
{
	SRCLK = 0;
	RCK = 0;
    
    //将第一列灯点亮
	Column1_74Hc595_WriteByte(0xff);
	while(1)
	{
	}
	
}

点亮了:

复位后,还是点亮了:

 

 

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值