74HC595实现串连驱动

发布于 2024-04-27  73 次阅读


74HC595是一个8位串行输入、并行输出的位移缓存器。

一般多用于IO口拓展的使用场景,先了解以下引脚定义:

符号引脚描述
QA--QH第15脚,第1-7脚8位并行数据输出
GND第8脚
QH’第9脚串行数据输出
/SRCLR(/MR)第10脚主复位(低电平有效)
SRCLK(SH_CP)第11脚数据输入时钟线
RCLK(ST_CP)第12脚输出存储器锁存时钟线
/OE第13脚输出有效(低电平有效)
SER(DS)第14脚串行数据输入
VCC第16脚电源

工作流程:

  • 1:SER设置输入电平
  • 2:SRCLK上升沿触发,将SER的电平状态存入位移寄存器,SRCLK每来一个上升沿,位移寄存器里面数据就位移一位,将新数据存入。QH’输出位移寄存器溢出的数据
  • 3:RCLK上升沿触发,将位移寄存器里面的数据存入输出锁存器,8位并行数据输出脚开始输出,

电路仿真图

用3个io口实现了16路输出

代码

//实现74HC595多级串联输出,*_595_data数据数组指针,data_size 74HC595个数
void _74HC595_SET_DATA(uint8_t *_595_data,uint8_t data_size)
{
     HAL_GPIO_WritePin(SET_DATA_GPIO_Port,SET_DATA_Pin,GPIO_PIN_RESET);
    for (uint8_t k = 0; k < data_size; k++)
    {
      uint8_t _595_data_temp;
      _595_data_temp = _595_data[k];
      
      for (uint8_t i = 0; i < 8; i++)
      {
        HAL_GPIO_WritePin(DATA_CLOCK_GPIO_Port,DATA_CLOCK_Pin,GPIO_PIN_RESET);
        if(_595_data_temp & 0x80)
        {
          HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_SET);
        }else
        {
          HAL_GPIO_WritePin(DATA_GPIO_Port,DATA_Pin,GPIO_PIN_RESET);
        }
        _595_data_temp <<= 1;
        HAL_GPIO_WritePin(DATA_CLOCK_GPIO_Port,DATA_CLOCK_Pin,GPIO_PIN_SET);
        /* code */
      }
      
    }
    HAL_GPIO_WritePin(SET_DATA_GPIO_Port,SET_DATA_Pin,GPIO_PIN_SET);
}

//输出实现
    _595_set_data[0] = 0x55;
    _595_set_data[1] = 0xaa;
    _74HC595_SET_DATA(_595_set_data,2);
    HAL_Delay(100);
    _595_set_data[0] = 0xaa;
    _595_set_data[1] = 0x55;
    _74HC595_SET_DATA(_595_set_data,2);
    HAL_Delay(100);
  • alipay_img
  • wechat_img
想法不去做终究就只是想法
最后更新于 2024-04-27