0 前言
本文主要介绍74HC595工作原理,根据工作原理实现简单控制功能,并给出示例代码。
1 74HC595工作原理
1.1 芯片引脚
引脚功能说明:
PIN14(SER):串行数据输入引脚
PIN13(OE):输出使能控制,低电平有效
PIN12(RCLK):存储器存储时钟输入引脚,上升沿,数据从移位寄存器转存到存储寄存器
PIN11(SRCLK):移位寄存器时钟输入引脚,上升沿,移位寄存器的bit数据整体后移,并接收新的bit(SER输入)
PIN9(QH):串行数据出口引脚,当移位寄存器中的数据大于8bit时,会把现有的bit“挤出去”,这样可以用于595级联
QA~QH:并行输出引脚
工作原理
74HC595两个重要的功能:串行输入、并行输出
74HC595两个重要的寄存器:移位寄存器、存储寄存器
74HC595的数据输入只有一个SER端口,一次只能输入一个bit,那么连续输入8次,就可以得到一个字节的数据
移位寄存器
在时钟脉冲上升沿,第1个输入的bit是并行输出的最后一个bit,即“先入后出”,类似数据入栈,经过8个时钟脉冲上升沿,1个字节数据就写入了移位寄存器(串行输入)
存储寄存器
因为移位寄存器和存储寄存器的引脚是相连的(从内部构造可知),所有在存储寄存器时钟的上升沿,移位寄存器的的数据转移到存储寄存器(形成并行输出)
1.2 内部构造
内部结构由RS触发器组成(根据时钟和数据输入,可以画出其时序图)
真值表
1.3 时序图
2 74HC595级联
2.1 级联接线
级联其实就是将第1级的QH‘输入到第2级的SER,RCLK和CLK共用
2.2 示例代码
对级联中的TEMP24_CS进行控制
uint8_t hc_ioset[2] = { 0xff, 0xff};
static void _delay( uint32_t count )
{
while( count > 0 )
{
count--;
}
}
void hc595_set()
{
uint8_t i, loop;
uint8_t data;
uint32_t delay = 0xff;
for ( loop = 0; loop < 2; loop ++ )
{
data = hc_ioset[loop];
for ( i = 0; i < 8; i++ )
{
// 从最高bit开始传输
if ( data & 0x80 )
{
CS_DATA_H();
}
else
{
CS_DATA_L();
}
CS_CLK_L();
_delay(delay);
CS_CLK_H();
_delay(delay);
data <<= 1;
}
}
// 进行存储
CS_RCLK_L();
_delay(delay);
CS_RCLK_H();
_delay(delay);
}
void hc595_set_pin( uint8_t pos )
{
uint8_t i, j;
if (pos > 15 )
{
return ;
}
i = (pos+1) / 8;
j = pos % 8;
hc_ioset[i] |= 0x01 << j;
}
void hc595_reset_pin( uint8_t pos )
{
uint8_t i, j;
if (pos > 15 )
{
return ;
}
i = (pos+1) / 8;
j = pos % 8;
hc_ioset[i] &= ~(0x01 << j);
}
void hc595_write_pin( uint8_t set, uint8_t pin )
{
if ( set )
{
// TEMP24_CS 输出高电平
hc595_set_pin(15);
}
else
{
// TEMP24_CS 输出低电平
hc595_reset_pin(15);
}
}