74HC165、74HC595、ULN2003被很多工程师成为电子设计的“吉祥三宝”!今天,咱们看下74HC165的用法。
它是一个并入、串出的芯片,工作电压2V~6V。但看这个说明,你可能看不懂它是做什么的,换句话说:它可以检测外部的高低电平,常用于多个按键的检测。
传统单片机检测按键,一般使用IO扫描或者IO外部中断。但这种方式非常浪费单片机的IO,一个IO只能检测一个按键。即便使用4X4矩阵键盘的方式,8个IO也只能检测16个按键。但使用74HC165,只需要3个IO,你就能检测100多个按键。
管脚功能有哪些?放一个数据手册的截图:
D0~D7是要检测的信号接口,VCC、GND就不用说了。CE是时钟输入有效管脚,一般接GND。
常用管脚一般是三个:PL、CP、Q7。
PL:异步并行载入使能。低电平时D0~D7采集高低电平信号,高电平时内部锁住信号值。
CP:时钟输入,CLK信号从这里输入。
Q7:串行数据输出。D0~D7的数据以串行的形式,从这里输出,从高到低。
通过这种方式,只要三个IO即可检测8个按键。如果要检测16个或者24个,怎么办?很简单,要借助另一个管脚:DS。
假设单片机要检测16个按键,那么需要用到两片74HC165。接线如下:
这两个芯片上的PL和CP都要接到单片机IO上,确保时钟和锁存信号同步。只有U1的Q7接到了单片机上,U2的Q7接到了U1的DS上。通过这种方式,进而实现多个74HC165的级联,可以检测几十个按键。STM32下的参考代码如下:
uint8_t ReadByte_165(void)
{
u8 i,dat=0;
CLK_H;
SL_H;
for(i=0;i<8;i++)
{
dat=dat<<1;
if(DAT==1)
dat=dat+1;
CLK_L;
Delay_Us(1);
CLK_H;
}
sw_buf = dat;
for(i=0;i<8;i++)
{
dat=dat<<1;
if(DAT==1)
dat=dat+1;
CLK_L;
Delay_Us(1);
CLK_H;
}
in_buf = dat;
CLK_L;
SL_L;
return dat;
}
其中,CLK是CP,SL是PL,DAT是Q7。
如果有问题,欢迎留言,或者关注公众号:单片机爱好者,交流!