移位寄存器74HC164多用于扩展IO口,下面是我使用时的心得:
74HC164的几点说明:
1.74HC164是串行输入,并行输出的;
2.它的并行输出其实是有延时的,只是延时时间小,可以认为是并行输出;
74hc164封装和真值表:
真值表中文解释说明
H-高电平 L
-低电平 X -任意电平
↑-低到高电平跳变(上升沿有效)
QA0,QB0,QH0 -规定的稳态条件建立前的电平
QAn,QGn -时钟最近的↑前的电平
看真值表的第三条和第五条:就可以知道,在保持clear为 H,
clock为↑状态下,AB都为H时,移位寄存器移入H,而当移位寄存器移入L时,必须令B为L,而A不受约束。所以可以把AB断相连再接入单片机数据端口。还有一种是A脚直接接高电平,B脚连入单片机数据端(P2_7)
时序图:
1. 首先区分输入输出信号。这里CLEAR、A、B、CLOCK是输入信号,Qa~Qh是输出信号;
2. 拿尺子开始扫描……
2.1.
首先可以看到CLEAR的下降沿后输出全部置低电平。结合后面的一个CLEAR下降沿,可以得出结论:当CLEAR输入下降沿时,无论A、B、CLOCK状态为何,输出全部拉低;
2.2.
尺子向右移动……找到Qa的第一个上升沿,可以看到这个上升沿是与CLOCK的上升沿对齐的,可以得出结论:输出在逻辑上与上升沿同步。此时将会注意到在此之前已经有3个上升沿但输出始终为低电平,尺子移动分别比较这3个上升沿,其A、B输入分别为10、01,于是可以得出结论:Qa
= A · B。
2.3.
尺子继续向右移动……可以分别看出在随后的CLOCK上升沿处,Qa全部按照A与B进行输出,从而验证以上结论。此外Qb~Qh的波形为Qa波形依次移位得到。
使用它的通用驱动C语言源代码:
//在每一个上升沿输出脚SDO状态移一位,CLK为时钟输入脚,CLK为输入脚,
//一般同连一脚,保持相同电平状态,与运算之后仍为该状态
void ind_light_disp(uint ind_num)//点亮哪一位,就置1
{
uint i,j;
i = 0x80;
for(j=0; j<8; j++)
{
if((i&ind_num) == i)
{
CLK = 0; //此处与下面的CLK = 1结合产生一个上升沿
SDO = 0;
CLK = 1;
}
else
{
CLK = 0;
SDO = 1;
CLK = 1;
}
i >>= 1;
}
delay(10000);//此处延时很重要,不延时可能会出现闪烁现象
}
一个使用电路图(点亮一些灯):