前几天说了74HC165驱动电路和级联电路,今天说下74HC595。其实它俩用法很像,前者是并入、串出,后者是串入、并出。等于是把前者的操作反着进行了一遍。
意义在哪?
只需要三个单片机的IO,就能控制8个LED或者信号的开关。如果使用级联方式,可以控制上百个。芯片外形与原理图如下:
管脚功能有哪些?放一个数据手册的截图:
VCC、GND就不用说了,MR用作复位,低电平有效,一般通过上拉电阻接到VCC。13脚OE输出使能,一般接GND。Q1~Q7是并行输出的数据,这些数据是从哪来的?
通过三个常用管脚:DS、SHCP、STCP。也就是数据、移位寄存器时钟、存储寄存器时钟。
数据好理解,串行输入数据。这两个时钟怎么理解?
先说移位寄存器时钟,串行数据每更新一个高低信号,移位时钟就要跳动一次。串行数据虽然送入到了74HC595里面,但不是立即显示在管脚上。什么时候显示?
当存储寄存器时钟跳动的时候,数据会按照送入74HC595的先后顺序,依次显示在它的8个管脚上。参考代码如下:
void HC595_WRITE(uint8_t dat)
{
uint8_t i;
for(i=0;i<8;i++)
{
if(dat & 0x01)
{
SER_H;
}
else
{
SER_L;
}
dat >>= 1;
SCK_L;
Delay_Us(1);
SCK_H;
Delay_Us(1);
}
RCK_L;
RCK_H;
}
其中,dat是数据,SCK是移位时钟,RCK是存储时钟。通过这种方式,可以控制8个LED。
如果要控制16或者24个,需要通过级联的方式。和74HC165类似,假设U1、U2两片74HC595级联,两片上的RCK和SCK都要接到单片机上。U1的DS接到单片机的管脚上,U2的DS接到U1的Q7S上。
通过这种方式,一次送入16bit的数据,然后RCK跳动一下,相应的高低信号即可更新到相关的管脚上。
595的话我记得我第一次用是在arduino里,用的shiftout,后来我看了底层发现代码很简单,然后用51和32复刻了shiftout用的595,老简单了。
是阿,本来就不难~~~