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);
Comments NOTHING