[转载]74HC595的使用

[转载]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口输出。

 

   注:7416474595功能相仿,都是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:    读取n74HC595的输入数据
  Calls:            HC595_delayGPIO_ResetBitsGPIO_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为低电平,上升沿数据锁存


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值