51单片机-74HC595移位寄存器

目录

1.74HC595芯片介绍 

1.1.引脚定义

1.2.工作原理

2.实际应用

2.1.控制数码管

2.2.点阵屏显示图形

2.3.点阵屏显示动画

3.知识点

3.1.位变量(sbit/bit)

3.2.字模提取


1.74HC595芯片介绍 

        74HC595芯片是一个串行输入,并行输出设备。其内部包括一个8位移位寄存器、一个存储器以及三态输出门电路,其中移位寄存器和存储器都有相互独立的时钟,每当移位寄存器输入时钟SHCP上升沿来临之时,数据被移出。

1.1.引脚定义

        引脚定义,怎么命名,并没有个统一的规则,所以每个人在绘制芯片引脚图时,根据个人习惯命名可能都不一样(如:14号引脚(DS/SER),10号引脚(MR/SCLR),11号引脚(SHCP/SCK),12号引脚(STCP/RCK)等);虽然命名可能不一样,但引脚的功能确是一样;

1.2.工作原理

工作方式1:将DS的数据,通过SHCP产生上升沿,一位位的移入移位寄存器;然后再有STCP产生一个上升沿,将移位寄存器的数据送入存储寄存器;再通过OE低电平使能,将对应的数据给到工作引脚;这,只是74HC595常见的工作方式之一,也是本篇的重点;

  • 数据输入:串行数据从DS口输入,要将DS上的数据移入移位寄存器,需要时钟驱动,即SHCP每产生一个上升沿,DS上的数据往移位寄存器送入一位,先送低位,后送高位,经过8个上升沿后,8bit全部送入移位寄存器;
  • 数据锁存:就是要将移位寄存器里边的数据,送入存储寄存器,即时钟信号STCP产生一个上升沿,就可完成此操作;
  • 数据输出:使能信号OE为低电平,存储寄存器的8bit数据(一个字节)就在Q7-Q0并行输出,并输出的数据会被锁存起来

功能汇总:除了以上介绍的方式1之外,74HC595芯片的功能有以下

2.实际应用

2.1.控制数码管

功能需求:通过74HC595控制P2口(前提:可以通过移位寄存器控制P2口)

程序设计:根据74HC595芯片的工作原理,我们知道,最关键的引脚其实只有三个,分别是串行数据输入引脚DS、移位寄存器时钟输入引脚SHCP、储存寄存器时钟输入引脚STCP;所以代码怎么写,无非就是配置这几个引脚,定义串行数据输入的子函数,以及运行所需要的主函数;

#include <REGX52.H>

//*配置引脚,根据原理图
sbit STCP=P3^5;//储存寄存器时钟输入引脚配置
sbit SHCP=P3^6;//移位寄存器时钟输入引脚配置
sbit DS=P3^4;  //串行数据输入引脚配置

//*子函数,定义需要输入的串行数据
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)      //当i>8时,跳出循环,即次函数循环8次(8位移位寄存器)
	{
		DS=Byte&(0x80>>i);//非0即1,每运行1次,数据整体右移一位
		SHCP=1;           //SHCP上升沿时,DS的数据写入移位寄存器
		SHCP=0;
	}
	STCP=1;               //STCP上升沿时,数据从移位寄存器转存储存寄存器
	STCP=0;
}

//*主函数
void main()
{
	SHCP=0;                  //移位寄存器时钟信号初始化
	STCP=0;                  //储存寄存器时钟信号初始化
	_74HC595_WriteByte(0x48);//74HC595写入0x48(0100 1000)
	while(1)
	{
	
	}
}

2.2.点阵屏显示图形

功能需求:通过74HC595芯片,控制LED点阵屏,显示所需静态画面

硬件电路:从原理图可以看出,点阵屏的电路,也是个矩阵电路;想点亮其中哪颗或哪几颗灯,其实就是段选和位选的过程;

程序设计:相比上一个用例,点阵屏的驱动,其实就是增加了点阵LED灯的段选和位选子函数;

#include <REGX52.H>
#include "Delay.h"

//*配置引脚,根据原理图
sbit STCP=P3^5;//储存寄存器时钟输入引脚配置
sbit SHCP=P3^6;//移位寄存器时钟输入引脚配置
sbit DS=P3^4;  //串行数据输入引脚配置

//*子函数,定义需要输入的串行数据
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)      //当i>8时,跳出循环,即次函数循环8次(8位移位寄存器)
	{
		DS=Byte&(0x80>>i);//非0即1,每运行1次,数据整体右移一位
		SHCP=1;           //SHCP上升沿时,DS的数据写入移位寄存器
		SHCP=0;
	}
	STCP=1;               //STCP上升沿时,数据从移位寄存器转存储存寄存器
	STCP=0;
}

//*子函数,通过控制点阵屏的段选和位选,来控制想要的图形
void MatrixLED_ShowColumn(unsigned char Column,Data)//定义变量列(位选)和行(段选)
{
	_74HC595_WriteByte(Data);//段选,通过74HC595的串行数据输入口DS控制
	P0=~(0x80>>Column);      //位选,通过向右移一位的方式,去控制点阵屏的8列
	Delay(1);                //延时1ms
	P0=0xFF;                 //消影,P0口置高电平
}

//*主函数
void main()
{
	SHCP=0;
	STCP=0;
	while(1)
	{
		MatrixLED_ShowColumn(0,0x80);//位选第1列,段选显示0x80
		MatrixLED_ShowColumn(1,0xF0);//位选第2列,段选显示0xF0
		MatrixLED_ShowColumn(2,0x48);//位选第3列,段选显示0x48
		MatrixLED_ShowColumn(3,0x66);//位选第4列,段选显示0x66
	}
}

2.3.点阵屏显示动画

功能需求:通过74HC595芯片,控制LED点阵屏,显示所需静态画面

硬件电路:从原理图可以看出,点阵屏的电路,也是个矩阵电路;想点亮其中哪颗或哪几颗灯,其实就是段选和位选的过程;

#include <REGX52.H>
#include "Delay.h"

//*配置引脚,根据原理图
sbit STCP=P3^5;//储存寄存器时钟输入引脚配置
sbit SHCP=P3^6;//移位寄存器时钟输入引脚配置
sbit DS=P3^4;  //串行数据输入引脚配置

//*子函数,定义需要输入的串行数据
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)      //当i>8时,跳出循环,即次函数循环8次(8位移位寄存器)
	{
		DS=Byte&(0x80>>i);//非0即1,每运行1次,数据整体右移一位
		SHCP=1;           //SHCP上升沿时,DS的数据写入移位寄存器
		SHCP=0;
	}
	STCP=1;               //STCP上升沿时,数据从移位寄存器转存储存寄存器
	STCP=0;
}

//*子函数,通过控制点阵屏的段选和位选,来控制想要的图形
void MatrixLED_ShowColumn(unsigned char Column,Data)//定义变量列(位选)和行(段选)
{
	_74HC595_WriteByte(Data);//段选,通过74HC595的串行数据输入口DS控制
	P0=~(0x80>>Column);      //位选,通过向右移一位的方式,去控制点阵屏的8列
	Delay(1);                //延时1ms
	P0=0xFF;                 //消影,P0口置高电平
}

//*数组,编辑需要显示的图形文字
unsigned char Animation[]={
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x80,0x40,0x20,0x1F,0x20,0x40,0x80,0x00,
	0x2F,0x00,0x80,0x40,0x20,0x1F,0x20,0x40,
	0x80,0x00,0x2F,0x00,0x30,0x48,0x84,0x42,
	0x21,0x42,0x84,0x48,0x30,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

//*主函数
void main()
{
    //*定义所需变量
	unsigned char i,Offset,Count;
	SHCP=0;                  //移位寄存器时钟信号初始化
	STCP=0;                  //储存寄存器时钟信号初始化
	while(1)
	{
		for(i=0;i<8;i++)
		{
			MatrixLED_ShowColumn(i,Animation[i+Offset]);
		}
		Count++;
        //*相当于有一个延时,扫描10遍,当Count>10的时候,Offset++,偏移一位
        //*那这能不能用Delay函数代替呢???
		if(Count>10)
		{
			Count=0;
			Offset++;
			if(Offset>32)//Offset可以偏移多少位,根据实际显示的内容设置,因为我们需要显示的内容是8*32的,所以当Offset>32的时候,回到第1位
			{
				Offset=0;
			}
		}
	}
}

3.知识点

3.1.位变量(sbit/bit)

        在 C51 中,允许用户通过位类型符定义位变量。位类型符有两个:bit 和 sbit;可以定义两种位变量

bit 位类型符:用于定义一般的可位处理位变量;它的格式如下:

bit 位变量名;

sbit 位类型符:用于定义在可位寻址字节或特殊功能寄存器中的位,定义时须指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号;格式如下:

sbit 位变量名=位地址;
  • 如位地址为位直接地址,其取值范围为 0x00~0xff;
  • 如位地址是可位寻址变量带位号或特殊功能寄存器名带位号,则在它前面须对可位寻址变量或特殊功能寄存器进行定义;字节地址与位号之间、特殊功能寄存器与位号之间一般用“^”作间隔;如74H595的引脚配置:
//*配置引脚,根据原理图
sbit STCP=P3^5;//储存寄存器时钟输入引脚配置
sbit SHCP=P3^6;//移位寄存器时钟输入引脚配置
sbit DS=P3^4;  //串行数据输入引脚配置

3.2.字模提取

        针对点阵屏要显示的内容,我们可以通过一些辅助的手段,提取所需字模,简单有效;如下就是2.3点阵屏显示动画的字模内容;

  • 27
    点赞
  • 181
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李十懿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值