【74HC595芯片】核心驱动代码

介绍

74HC595是一个8位串行输入、并行输出的位移缓存器:并行输出为三态输出。
在SCK 的上升沿,串行数据由SDL输入到内部的8位位移缓存器,并由Q7’输出,而并行输出则是在LCK的上升沿将在8位位移缓存器的数据存入到8位并行输出缓存器。当串行数据输入端OE的控制信号为低使能时,并行输出端的输出值等于并行输出缓存器所存储的值。

引脚说明

在这里插入图片描述

74HC595是3态高速位移寄存器,串行输入,并行输出的锁存器。

DS:14脚,串行数据输入引脚,级联的话接上一级的Q7’。
OE:13脚,输出使能控制脚,它是低电才使能输出,所以接GND
ST_CP:12脚,存储寄存器时钟输入引脚。上升沿时,数据从移位寄存器转存带存储寄存器。
SH_CP:11脚,移位寄存器时钟引脚,上升沿时,移位寄存器中的数据整体后移,并接受新 的数据(从 DS输入)。
MR:10脚,低电平时,清空移位寄存器中已有的数据,一般不用,接高电平即可。
Q7’:9脚,串行数据输出引脚。当移位寄存器中的数据多于8位时,会把已有的位“挤出 去”,就是从这里出去的。用于595的级联,将它接下一个74HC595的DS端。
Q1-Q7:1到7脚,并行输出引脚

核心工作原理:

OE:13脚接GND使能
DS:14脚,串行输入数据原理如下图(高位给完,到低位,一位一位时钟传)
SH_CP:11脚 给个上升沿,移位寄存器
ST_CP:12脚,存储寄存器时钟输。上升沿时,数据从移位寄存器转存带存储寄存器。而已一直保存

在这里插入图片描述
在这里插入图片描述

时序图:

在这里插入图片描述

74HC595.c 代码文件


//这里使用的是74HC595  级联的方式,单联也是差不多


#include "74HC595.h"


/*******************************************************************************
* 函 数 名       : delay_10us
* 函数功能	  	 : 延时函数,ten_us=1时,大约延时10us
* 输    入       : ten_us
* 输    出    	 : 无
*******************************************************************************/
void delay_10us(unsigned int ten_us)
{
	while(ten_us--);	
}

/*******************************************************************************
* 函 数 名       : delay_ms
* 函数功能		   : ms延时函数,ms=1时,大约延时1ms
* 输    入       : ten_us
* 输    出    	 : 无
*******************************************************************************/
void delay_ms(unsigned int ms)
{
	unsigned int i,j;
	for(i=ms;i>0;i--)
		for(j=110;j>0;j--);
}

/*******************************************************************************
* 函 数 名         : hc595_write_data(unsigned char dat)
* 函数功能		     : 向74HC595写入4个字节的数据
* 输    入         : 
					 dat1:对应74HC595(A)输出第1行-第8行
					 dat2:对应74HC595(B)输出第9行-第16行
					 dat3:对应74HC595(C)输出第1列-第8列
					 dat4:对应74HC595(D)输出第9列-第16列
* 输    出         : 无
*******************************************************************************/
void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4)
{
	unsigned char i=0;
	
	for(i=0;i<8;i++)//循环8次即可将一个字节写入寄存器中
	{
		HC595_SER=dat4>>7;//优先传输一个字节中的高位
		dat4<<=1;//将低位移动到高位
		HC595_SRCLK=0;
		delay_10us(1);
		HC595_SRCLK=1;
		delay_10us(1);//移位寄存器时钟上升沿将端口数据送入寄存器中	
	}
	
	for(i=0;i<8;i++)
	{
		HC595_SER=dat3>>7;
		dat3<<=1;
		HC595_SRCLK=0;
		delay_10us(1);
		HC595_SRCLK=1;
		delay_10us(1);	
	}

	for(i=0;i<8;i++)
	{
		HC595_SER=dat2>>7;
		dat2<<=1;
		HC595_SRCLK=0;
		delay_10us(1);
		HC595_SRCLK=1;
		delay_10us(1);	
	}

	for(i=0;i<8;i++)
	{
		HC595_SER=dat1>>7;
		dat1<<=1;
		HC595_SRCLK=0;
		delay_10us(1);
		HC595_SRCLK=1;
		delay_10us(1);	
	}

	RCLK=0;
	delay_10us(1);
	RCLK=1;//存储寄存器时钟  上升沿将前面写入到寄存器的数据输出	
}


/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/

/**********************************mian.c列子*********************************************

unsigned char ghc595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

void main()
{	
	unsigned char i=0;

	while(1)
	{		
		for(i=0;i<8;i++)
		{	
			hc595_write_data(ghc595_buf[i],0,0,0);//使74HC595(A)输出
			delay_ms(500);//延时500ms	
		}
		for(i=0;i<8;i++)
		{	
			hc595_write_data(0,ghc595_buf[i],0,0);//使74HC595(B)输出
			delay_ms(500);//延时500ms	
		}									
	}		
}

************************************************************************************/

74HC595.H 代码文件

#ifndef _74HC595_H
#define _74HC595_H
#include "reg52.h"

//定义74HC595控制管脚  ==>HC595 内部结构有两个寄存器。1.移位寄存器 2.存储寄存器
sbit HC595_SRCLK=P3^6;	//移位寄存器 时钟输入
sbit HC595_RCLK=P3^5;		//存储寄存器 时钟输入
sbit HC595_SER=P3^4; 		//串行数据 输入

void delay_10us(unsigned int ten_us);
void delay_ms(unsigned int ms);
void hc595_write_data(unsigned char dat1,unsigned char dat2,unsigned char dat3,unsigned char dat4);


#endif
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值