74HC595芯片——单芯片控制代码示例

1.关于74HC595

                                                                      

74HC595芯片——单芯片控制代码示例_第1张图片                         74HC595芯片——单芯片控制代码示例_第2张图片

                 芯片示意图                                                                  TSSOP封装

引脚说明

符号

引脚

描述

Q0--Q7

第15脚,第1-7脚

8位并行数据输出

GND

第8脚

Q7’

第9脚

串行数据输出

/MR

第10脚

主复位(低电平有效)

SH_CP

第11脚

数据输入时钟线

ST_CP

第12脚

输出存储器锁存时钟线

/OE

第13脚

输出有效(低电平有效)

DS

第14脚

串行数据输入

VCC

第16脚

电源

2.关于此芯片具体原理参考:

快速上手移位寄存器74HC595,并使用ATTiny13A的三个IO口驱动数码管【IC原来如此】 

3.代码示例

       关于芯片,我们关注的是SH、ST、DS引脚。所以代码主要从从这3个引脚的控制入手。

代码流程:一个字节(8个位)的数据写入BUFF数组→将数组的数据写入芯片缓存区→全部写入后发送到引脚→将BUFF数组全部清零→循环上述步骤

/*    编程平台:keil 5
      编程芯片:STC15W204S (89C51同样适用) 
*/

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;

sbit ST=P3^0;     //引脚映射
sbit SH=P3^1;
sbit DS=P3^2 ;

#define SH_L SH=0  //宏定义引脚高低电平
#define SH_H SH=1
#define ST_L ST=0
#define ST_H ST=1
#define DS_L DS=0
#define DS_H DS=1
/*ST_L  为ST引脚电平置低  
  ST_H  为ST引脚电平置高,DS_L/DS_L/SH_L/SH_H 同理  */

u8 BUFF[8] = {0};  //用于缓存发送数据的数组,一个595芯片一次可发送8个位

void Delay(u16 num);
void HC595_Init();
void HC595_Clear();
void HC595_control(u8 A);
void HC595_Sent(u8 BUFF[8]);
void DS_H_Sent();
void DS_L_Sent();



void Delay(u16 num)  //ms延时   @晶振35M
{
    unsigned char k, j;
    u16 n;
    for (n = 0; n < num; n++)
    {        
        k = 33;
        j = 66;
        do
        {
            while (--j)
                ;
        } while (--k);
    }
}

void HC595_Init()  //ST引脚一个上升沿将数据发送到引脚上,初始化将ST引脚模拟一个上升沿,                                   
                   //将原有数据发送出去  
{
    ST_L;            //ST引脚拉低
    Delay(10);    
    ST_H;             //ST引脚拉高,完成一个上升沿操作
    Delay(10);
    ST_L;            //之后将3个引脚全部拉低
    SH_L;
    DS_L;
    Delay(10);
}
void HC595_Clear()  //BUFF数组全部位清零
{
    u8 k;
    for (k = 0; k < 8; k++)
    {
        BUFF[k] = 0;
    }
}
void HC595_control(u8 A)    //将要发送的数据写入BUFF数组
{


    for (i = 0; i < 8; i++) 
    {
        if (A & 0x80)             //0X80==1000 0000  数据最高位和1相与
            BUFF[i] =1;           //最高位是1则写1进BUFF数组,若为0,因BUFF数组
                                  //本身开始时全部置零,故不用处理

        A <<= 1;                   //数据左移一位
    }
                                   //整个for循环完成了一个8位数据从高位到低位写入BUFF数组
  HC595_Sent(BUFF);                // 该函数如下↓↓↓
}


void HC595_Sent(u8 BUFF[8])   //将BUFF数组的数据写入芯片缓存区,发送完8位后,ST引脚完成一次上 
                              //升沿操作,将芯片内部缓存区的数据发送到对应引脚上面
{
    for (i = 0; i < 8; i++)
    {
        if (BUFF[7 - i] == 1)       
             DS_H_Sent( );
        else DS_L_Sent( ); 
    }

    ST_L;                //ST引脚的上升沿操作
    Delay(1);
    ST_H;
   HC595_Clear();       //完成一个字节数据发送后将BUFF数组清零
}
//以下2个函数完成了将数据发送到缓存区的操作
//数据位为1,则DS置1,然后SH引脚完成一个上升沿操作即可将数据位发送到内部缓存区
void DS_H_Sent()
{
    DS_H;
    SH_L;
    Delay(1);
    SH_H;
}
//数据位为0,则DS置0,然后SH引脚完成一个上升沿操作即可将数据位发送到内部缓存区
void DS_L_Sent()
{
    DS_L;
    SH_L;
    Delay(1);
    SH_H;
}


void main()
{
  HC595_Init() ;
  HC595_control(0x30);
}



注:上述代码需自行整理可用

调用函数HC595_control(u8 A)  即可完成芯片的控制

语句  HC595_control(0x30);达成的效果   

CH595引脚对应电平
Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7
0 0 1 1 0 0 0 0

可见,与0X30二进制展开  0b 0011 000 一一对应

你可能感兴趣的:(未分类内容,单片机,c语言,经验分享)