一、74HC165 的基本使用步骤
74HC165 是个并行输入串行输出的逻辑芯片,了解一款芯片都是从它的 datasheet 开始,下面以 NXP 公司 74HC165 为例进行介绍。
先看下该芯片 datasheet 的总体描述:
74HC165/74HCT165 是一个 8 位串行或并行输入,串行输出的移位寄存器。具有一个串行输入(DS 引脚),8 个并行数据输入(D0 到 D7)和两个互补串行输出的功能。当 PL 引脚为低时,D0-D7 端的数据进入移位寄存器。当 PL 引脚为高时,数据从 DS 引脚串行进入寄存器。当 CE 引脚为低时,使能时钟,数据在时钟 CP 上升时数据进行移位。当 CE 引脚为高时,失能时钟,时钟输入无效
我们再结合芯片的功能框图来理解工作过程:
从上图可以看出,PL 引脚控制并行数据的获取,低电平有效,数据进入 8 位移位寄存器,再由 CP 和 CE 两个引脚配合控制移位寄存器里的数据从 Q7 引脚串行输出。
再看看芯片真值表:
第一个红色框是并行加载数据的,只要 PL 为低电平即可;
第二个蓝色框是串行移位,此时要求 PL 为高电平,CE 为低电平,Q0~Q6 在 CP 每来一个上升沿时依次往 Q7 移位;
第三个紫色框是保持当前状态输出。
芯片时序图:
还有一个重要的信息,就是芯片的引脚定义:
从芯片的描述,我们可能还不是很清楚具体的工作原理以及过程,下面图文并茂为大家详细讲述下。
最后对如何驱动 74HC165 总结几个步骤:
1、引脚 1(PL)为低电平,获取并行数据输入,数据移入移位寄存器;
2、将引脚 1 置为高电平,停止并行数据输入;
3、引脚 15(OE)为低电平,使能时钟输入;
4、时钟 CP 每产生一个上升沿,移位寄存器中的数据从高位(Q6)到低位(Q0)依次移出到 Q7。
二、74HC165 的级联
74HC165 其实和 74HC595 一样,也有级联功能,74HC595 相关知识在之前文章中有整理过,详见(数字电路 - 芯片 -74HC595,数字电路 - 芯片 -74HC595)这里说下 74HC165 的级联。
前面基础篇也讲到 74HC165 是个并行输入转串行输出的逻辑芯片,该芯片除了串行输出外还有一个串行输入引脚,74HC165 的级联功能就使用到这个串行输入引脚,也就是引脚 10(DS):
下面就讲下 74HC165 级联的原理:
从前面的两篇 74HC165 文章知道,74HC165 并行转串行是通过移位寄存器实现的,当 PL 为低电平时,并行数据(8bit)进入移位寄存器,当 PL 为高时,进入移位寄存器的数据就从 DS 引脚进入寄存器,然后在每个时钟的上升沿往输出引脚 Q7 移一位。根据这个原理,只要把输出 Q7(引脚 9)连到下一级 74HC165 的 DS 引脚(引脚 10)即可实现级联功能,如下图:
最后再以图文并茂的方式总结下 74HC165 级联后的工作过程,如下图:
三、74HC165 级联编程
前面的文章已详细讲述了 74HC165 级联的原理和工作过程,下面以两片 74HC165 级联来检测 16 个轻触按键的状态为例,当按键被按下时点亮对应的 LED。
级联电路如下:
直接贴出代码,相应的语句已做好注释:
/*** 74hc165.h ***/
#ifndef _74HC165_H
#define _74HC165_H
#include "allhead.h"
sbit HC165_PL = P2^5; //PL 并行数据输入使能,低电平有效
sbit HC165_CLK = P2^7;//CP 时钟,上升沿触发
sbit HC165_OUT = P2^4; //Q7 串行数据输出
sbit HC165_CE = P2^6;//CE 时钟使能,低电平有效
void _74hc165_init(void);
void _74hc165_read_2byte(uchar date[2]);
#endif
/*** 74hc165.c ***/
#include "74hc165.h"// 初始化
74hc165void _74hc165_init(void){
HC165_CE = 0; // 初始化使能时钟,后面就不需再使能
HC165_PL = 1; //PL 拉高,不读取按键状态
HC165_CLK = 1; // 时钟拉高,便于产生上升沿}
// 读取两个 74HC165 级联
void _74hc165_read_2byte(uchar date[2])
{ uchar i;
uint temp = 0;
HC165_PL = 0; //PL 拉低,读取按键状态
HC165_PL = 1; //PL 拉高,停止按键读取
if(HC165_OUT == 1) // 等于 1 即并行输入 D7 引脚的按键被按下
temp |= 0x01; // 最低位置 1 表示按键被按下,反之则没按键被按下
for(i = 0; i < 15; i ++) // 因为最高位不用移位即可读取,故循环(16-1)次,依次把次高位移到最高位,第一级 74HC165 优先读取
{
temp = temp << 1;
HC165_CLK = 0; //HC165_CLK = 0 ——> HC165_CLK = 1 产生上升沿,次高位 D(n-1)移到高位 D(n) _nop_(); _nop_(); HC165_CLK = 1;
if(HC165_OUT == 1)
temp |= 0x01;
}// 将 16 位数据分离为两个 8 位数据
date[0] = (uchar)(temp & 0x00ff);// 第二级 74HC165 的数据
date[1] = (uchar)((temp >> 8) & 0x00ff);// 第一级 74HC165 的数据}
四、74HC165、74HC164、74HC595 简单对比
74HC164、74HC595 这两款芯片都具有串行输入,并行输出的功能,最大的不同点在于 74HC164 没有锁存功能。因此,在做数码管的输出显示的时候 74HC164 会出现拖影的想象,在设计此电路时要注意考虑此情况。另外 74HC165 与 74HC164 型号上十分相似,但是两者功能相反,74HC165 主要是并行输入,串行输出的功能。