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

    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机中使用74HC595移位寄存器的方法详解

    发表评论