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点阵屏显示动画的字模内容;