[转载]74HC595的使用
摘录自百度文库的免费文档以及网络上的分享
上图是用74HC595来驱动8个发光二极管,P1.0, P1.1, P1.2是接到单片机上的.
IC的部分引脚介绍:
OE: 输出使能,为H时,Q0~Q7为高阻态;
为L时,Q0~Q7正常输出. (使用的时候将该引脚接地即可)
SCLR: 移位寄存器清零端, 为H时,不清零,通常直接接到VCC。
主要控制的信号:
SER: 串行数据输入线(数据输入线)
SRCLK:数据输入时钟线(移位时钟脉冲)
上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;(Q0~Q7)
请参考D触发器和移位寄存器原理,第一个脉冲是送到QA的,所以共需要8个脉冲,才能送完8个数据。
RCLK: 输出存储器锁存:当输入的数据在传入寄存器后,只有供给一个锁存信号才能将移入的数据送QA~QH口输出。
注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。
74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态。
代码部分:
/*************************************************************
/* 74HC595 走马灯演示程序 *
/* 作者: gguoqing *
/* 时间: 2006/02/26 *
/*【声明】此程序仅用于学习与参考,引用请注明版权和作者信息! *
/************************************************************/
#include <reg51.h> //51芯片管脚定义头文件
#include < intrins.h> //内部包含延时函数 _nop_() ;
#define uchar unsigned char
#define uint unsigned int
uchar code DAT[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f} ;
sbit SDATA_595=P1^0 ; //串行数据输入
sbit SCLK_595 =P1^1 ; //移位时钟脉冲
sbit RCK_595 =P1^2 ; //输出锁存器控制脉冲
uchar temp ;
/********************************************************/
/* 延时子程序 */
/********************************************************/
void delay(int ms)
{
int k ;
while(ms--)
{
for(k=0 ; k< ;250 ; k++)
{
_nop_() ;
_nop_() ;
_nop_() ;
_nop_() ;
}
}
}
/********************************************************/
/*将显示数据送入74HC595内部移位寄存器 */
/********************************************************/
void WR_595(void)
{
uchar j ;
for (j=0 ;j<8 ;j++) //共有8个数据
{
temp=temp<<1 ; //向左移位,最高位被移入CY中
SDATA_595=CY ;
SCLK_595=1 ; //上升沿来到,数据进入移位寄存器
_nop_() ;
_nop_() ;
SCLK_595=0 ;
}
}
/*******************************************************/
/*将移位寄存器内的数据锁存到输出寄存器并显示 */
/********************************************************/
void OUT_595(void)
{
RCK_595=0 ;
_nop_() ;
_nop_() ;
RCK_595=1 ; //上升沿将数据送到输出锁存器
_nop_() ;
_nop_() ;
_nop_() ;
RCK_595=0 ;
}
/********************************************************
* *
* 主程序 *
* *
*********************************************************/
main()
{
SCLK_595=0 ; //移位时钟脉冲置低
RCK_595=1 ; //输出锁存器控制脉冲
while(1)
{
uchar i ;
for (i=0 ; i<8 ; i++)
{
temp=DAT[ i ] ; //取显示数据
WR_595() ;
OUT_595() ;
delay(100) ;
}
}
}
/************************************************************************
Function: Read_74HC595
Description: 读取n片74HC595的输入数据
Calls: HC595_delay;GPIO_ResetBits;GPIO_SetBits;
Data Accessed: 无
Data Updated: 无
Input:
HC595x:用户使用的595端口,类型定义在74HC595.h中
ChipNum: 用户使用的595端口上连接的芯片个数
Output:
DataBuf: 输出数据存放缓冲区
Return: 无
Others: 此模块为Stm32单片机中使用,调试时在72M系统时钟下
*************************************************************************/
void Write_74HC595(HC595 HC595x,unsigned char ChipNum,unsigned char *DataBuf)
{
unsigned char i = 0;
unsigned char DataBufTmp = 0;
GPIO_ResetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK为低电平,上升沿数据锁存
for(; ChipNum>0; ChipNum--)
{
DataBufTmp = *DataBuf;
for(i=0; i<8; i++)
{
GPIO_ResetBits(HC595x.Clk.Port, HC595x.Clk.Pin); //时钟低电平
if (DataBufTmp & 0x80)
{
GPIO_SetBits(HC595x.Data.Port, HC595x.Data.Pin); //输出1
}
else
{
GPIO_ResetBits(HC595x.Data.Port, HC595x.Data.Pin); //输出0
}
HC595_delay(5);
GPIO_SetBits(HC595x.Clk.Port, HC595x.Clk.Pin); //时钟高电平,上升沿数据移位
HC595_delay(5);
DataBufTmp = DataBufTmp << 1;
}
DataBuf++;
}
GPIO_SetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK为高电平,上升沿数据锁存
HC595_delay(10);
GPIO_ResetBits(HC595x.Lck.Port, HC595x.Lck.Pin); //设置LCK为低电平,上升沿数据锁存
}