一、74HC165 的基本使用步驟
74HC165 是個并行輸入串行輸出的邏輯芯片,了解一款芯片都是從它的 datasheet 開始,下面以 NXP 公司 74HC165 為例進行介紹。
先看下該芯片 datasheet 的總體描述:
74HC165/74HCT165 是一個 8 位串行或并行輸入,串行輸出的移位寄存器。具有一個串行輸入(DS 引腳),8 個并行數(shù)據(jù)輸入(D0 到 D7)和兩個互補串行輸出的功能。當(dāng) PL 引腳為低時,D0-D7 端的數(shù)據(jù)進入移位寄存器。當(dāng) PL 引腳為高時,數(shù)據(jù)從 DS 引腳串行進入寄存器。當(dāng) CE 引腳為低時,使能時鐘,數(shù)據(jù)在時鐘 CP 上升時數(shù)據(jù)進行移位。當(dāng) CE 引腳為高時,失能時鐘,時鐘輸入無效
我們再結(jié)合芯片的功能框圖來理解工作過程:
從上圖可以看出,PL 引腳控制并行數(shù)據(jù)的獲取,低電平有效,數(shù)據(jù)進入 8 位移位寄存器,再由 CP 和 CE 兩個引腳配合控制移位寄存器里的數(shù)據(jù)從 Q7 引腳串行輸出。
再看看芯片真值表:
第一個紅色框是并行加載數(shù)據(jù)的,只要 PL 為低電平即可;
第二個藍色框是串行移位,此時要求 PL 為高電平,CE 為低電平,Q0~Q6 在 CP 每來一個上升沿時依次往 Q7 移位;
第三個紫色框是保持當(dāng)前狀態(tài)輸出。
芯片時序圖:
還有一個重要的信息,就是芯片的引腳定義:
從芯片的描述,我們可能還不是很清楚具體的工作原理以及過程,下面圖文并茂為大家詳細(xì)講述下。
最后對如何驅(qū)動 74HC165 總結(jié)幾個步驟:
1、引腳 1(PL)為低電平,獲取并行數(shù)據(jù)輸入,數(shù)據(jù)移入移位寄存器;
2、將引腳 1 置為高電平,停止并行數(shù)據(jù)輸入;
3、引腳 15(OE)為低電平,使能時鐘輸入;
4、時鐘 CP 每產(chǎn)生一個上升沿,移位寄存器中的數(shù)據(jù)從高位(Q6)到低位(Q0)依次移出到 Q7。
二、74HC165 的級聯(lián)
74HC165 其實和 74HC595 一樣,也有級聯(lián)功能,74HC595 相關(guān)知識在之前文章中有整理過,詳見(數(shù)字電路 - 芯片 -74HC595,數(shù)字電路 - 芯片 -74HC595)這里說下 74HC165 的級聯(lián)。
前面基礎(chǔ)篇也講到 74HC165 是個并行輸入轉(zhuǎn)串行輸出的邏輯芯片,該芯片除了串行輸出外還有一個串行輸入引腳,74HC165 的級聯(lián)功能就使用到這個串行輸入引腳,也就是引腳 10(DS):
下面就講下 74HC165 級聯(lián)的原理:
從前面的兩篇 74HC165 文章知道,74HC165 并行轉(zhuǎn)串行是通過移位寄存器實現(xiàn)的,當(dāng) PL 為低電平時,并行數(shù)據(jù)(8bit)進入移位寄存器,當(dāng) PL 為高時,進入移位寄存器的數(shù)據(jù)就從 DS 引腳進入寄存器,然后在每個時鐘的上升沿往輸出引腳 Q7 移一位。根據(jù)這個原理,只要把輸出 Q7(引腳 9)連到下一級 74HC165 的 DS 引腳(引腳 10)即可實現(xiàn)級聯(lián)功能,如下圖:
最后再以圖文并茂的方式總結(jié)下 74HC165 級聯(lián)后的工作過程,如下圖:
三、74HC165 級聯(lián)編程
前面的文章已詳細(xì)講述了 74HC165 級聯(lián)的原理和工作過程,下面以兩片 74HC165 級聯(lián)來檢測 16 個輕觸按鍵的狀態(tài)為例,當(dāng)按鍵被按下時點亮對應(yīng)的 LED。
級聯(lián)電路如下:
? 直接貼出代碼,相應(yīng)的語句已做好注釋:
/*** 74hc165.h ***/
#ifndef _74HC165_H
#define _74HC165_H
#include "allhead.h"
sbit HC165_PL = P2^5; //PL 并行數(shù)據(jù)輸入使能,低電平有效
sbit HC165_CLK = P2^7;//CP 時鐘,上升沿觸發(fā)
sbit HC165_OUT = P2^4; //Q7 串行數(shù)據(jù)輸出
sbit HC165_CE = P2^6;//CE 時鐘使能,低電平有效
void _74hc165_init(void);
void _74hc165_read_2byte(uchar date[2]);
#endif
/*** 74hc165.c ***/
#include "74hc165.h"http:// 初始化
74hc165void _74hc165_init(void){
HC165_CE = 0; // 初始化使能時鐘,后面就不需再使能
HC165_PL = 1; //PL 拉高,不讀取按鍵狀態(tài)
HC165_CLK = 1; // 時鐘拉高,便于產(chǎn)生上升沿}
// 讀取兩個 74HC165 級聯(lián)
void _74hc165_read_2byte(uchar date[2])
{ ?uchar i;
uint temp = 0;
HC165_PL = 0; //PL 拉低,讀取按鍵狀態(tài)
HC165_PL = 1; //PL 拉高,停止按鍵讀取
if(HC165_OUT == 1) ? ? ? ?// 等于 1 即并行輸入 D7 引腳的按鍵被按下
temp |= 0x01; ? ? ? ? // 最低位置 1 表示按鍵被按下,反之則沒按鍵被按下
for(i = 0; i < 15; i ++) ?// 因為最高位不用移位即可讀取,故循環(huán)(16-1)次,依次把次高位移到最高位,第一級 74HC165 優(yōu)先讀取
{
temp = temp << 1;
HC165_CLK = 0; //HC165_CLK = 0 ——> HC165_CLK = 1 產(chǎn)生上升沿,次高位 D(n-1)移到高位 D(n) ? ?_nop_(); ? ?_nop_(); ? ?HC165_CLK = 1;
if(HC165_OUT == 1)
temp |= 0x01;
}// 將 16 位數(shù)據(jù)分離為兩個 8 位數(shù)據(jù)
date[0] = (uchar)(temp & 0x00ff);// 第二級 74HC165 的數(shù)據(jù)
date[1] = (uchar)((temp >> 8) & 0x00ff);// 第一級 74HC165 的數(shù)據(jù)}
四、74HC165、74HC164、74HC595 簡單對比
74HC164、74HC595 這兩款芯片都具有串行輸入,并行輸出的功能,最大的不同點在于 74HC164 沒有鎖存功能。因此,在做數(shù)碼管的輸出顯示的時候 74HC164 會出現(xiàn)拖影的想象,在設(shè)計此電路時要注意考慮此情況。另外 74HC165 與 74HC164 型號上十分相似,但是兩者功能相反,74HC165 主要是并行輸入,串行輸出的功能。