上一篇博文我們使用矩陣鍵盤時(shí)面臨的一個(gè)問(wèn)題就是占用的端口多,以前我們擴(kuò)展輸出端口使用了74hc595,那么這里我們面臨的是輸入端口少需要擴(kuò)展的問(wèn)題,那么可以使用什么芯片來(lái)完成了?有沒有直接可使用的芯片呢?
文章原出處: https://blog.csdn.net/haigear/article/details/130025987
一、使用74hc148芯片
1、148芯片的說(shuō)明
:74HC148是一個(gè)8位優(yōu)先編碼器,可以將多個(gè)輸入數(shù)據(jù)按照優(yōu)先級(jí)編碼輸出。A0-A3是編碼輸出端,,0-7是輸入數(shù)據(jù)線,管腳說(shuō)明如下:
管腳名 | 功能說(shuō)明 |
---|---|
A0~A2 | 編碼輸出端口,用于對(duì)0~7輸入8個(gè)數(shù)據(jù)線的信號(hào)進(jìn)行編碼。 |
0~7 | 輸入端口,不做特別說(shuō)明 |
VCC、GND | 電源端口。 |
EI | 編碼使能端口,低電平時(shí)編碼有效,否則無(wú)效,級(jí)聯(lián)時(shí)鏈接上一級(jí)的EO端 |
EO | 編碼狀態(tài)輸出端,有編碼時(shí)輸出時(shí),或說(shuō)正在編碼時(shí)其端口輸出為高電平,否則低電平 |
GS | 測(cè)試端口,用于檢測(cè)編碼器的工作狀態(tài)。處于編碼狀態(tài)時(shí),GS為低電平,否則為高電平 |
2、148芯片常見管腳圖
我們?cè)趐roteus中使用的默認(rèn)是沒有VCC和GND
2、74HC(LS)148的級(jí)聯(lián)
我們前面的博文曾經(jīng)介紹過(guò)74HC系列的串行輸入并行出處的芯片,這里我們采用8路并行輸入的芯片74HC148(arduino官網(wǎng)也有介紹可以參考),使用它可以輕易的將8路的輸入轉(zhuǎn)化為3路輸入(我們這里使用的是4x4的矩陣鍵盤,所以需要16路,所以就需要用148芯片進(jìn)行級(jí)聯(lián)了)。級(jí)聯(lián)電路如下:
很明顯,級(jí)聯(lián)采用的是將各個(gè)芯片的三個(gè)A0~A2管腳和GS管腳用與非門連接,其中第位的管腳來(lái)自于級(jí)聯(lián)初級(jí)的GS管腳,用兩個(gè)GS管腳通過(guò)與非門的輸出腳作為優(yōu)先級(jí)標(biāo)志位,從GS輸出。
我們知道EI管腳低電平時(shí)才可以編碼,而通過(guò)級(jí)聯(lián)后只要初級(jí)芯片有編碼輸出初級(jí)芯片的EO管腳就會(huì)被置為高電平,后級(jí)芯片EI管腳也就會(huì)被置為高電平,所以后級(jí)芯片就不能編碼了。
我們知道,與非門對(duì)低電平有效,當(dāng)初級(jí)芯片編碼時(shí)后級(jí)芯片EI為高電平,同時(shí)后級(jí)芯片所有的管腳輸出高電平,輸出到與非門的全為無(wú)效的高電平。這個(gè)時(shí)候,我們讀取的就是初級(jí)芯片的編碼信號(hào)。
二、在arduino實(shí)現(xiàn)矩陣簡(jiǎn)單中的應(yīng)用
1、電路及說(shuō)明
我們來(lái)看看,在鍵盤矩陣中的應(yīng)用,這里很顯然是采用了16路的按鈕來(lái)單獨(dú)輸入,每個(gè)按鈕的一端直接接的地。
這里我使用了兩個(gè)BCD數(shù)碼管,因?yàn)閯偤枚M(jìn)制的輸出剛好可以使用。不過(guò)信號(hào)要取反,因?yàn)锳0~A2輸出的都是低電平。第一個(gè)數(shù)碼管測(cè)試的是一個(gè)后級(jí)148芯片的輸出,在初級(jí)148芯片沒有編碼時(shí),后級(jí)是可以正常輸出的。
第二個(gè)數(shù)碼管則輸出的是級(jí)聯(lián)后的效果,也就是說(shuō),一旦啟動(dòng)了初級(jí)芯片后后級(jí)芯片就不能輸出了,這個(gè)時(shí)候第一個(gè)數(shù)碼管(左邊的那個(gè)數(shù)碼管)就只能顯示零了。
同時(shí),我們還采用了串口輸出到虛擬終端上,便于大家同步查看效果。
2、代碼如下:
這里的程序只為將我們得到的端口信號(hào)轉(zhuǎn)換為可以現(xiàn)在在虛擬終端顯示的數(shù)值。其實(shí)思路有兩種,一種是我在程序中注銷的部分,采用的思路就是2的平方和逐位累加實(shí)現(xiàn)數(shù)值,但我們得到的是一個(gè)double類型的,不太好看,所以我最終采用了位運(yùn)算和或運(yùn)算得到了一個(gè)二進(jìn)制的數(shù)值,還好Serial.println可以自動(dòng)將二進(jìn)制轉(zhuǎn)化為十進(jìn)制,所以剛好我們可以看到效果。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-766213.html
//定義輸入引腳
const int controlPins[] = {2, 3, 4, 5};
int n=0b0000;
void setup() {
for(int i=0;i<6;i++)
pinMode(controlPins[i], INPUT);
Serial.begin(9600);
}
void loop() {
n=0b0000;
for (int j = 5; j > 1; j--) {
int b=0b0001;
if(digitalRead(j))
{
//Serial.println(pow(2,j-2));
//n=n+pow(2,j-2);
//n+=exp((j-2)*log(2));
b=b<<(j-2); //哪一個(gè)端口檢測(cè)到高電平則移位對(duì)應(yīng)的位數(shù)
n=n|b; //和0進(jìn)行或運(yùn)算得到最終的數(shù)值
}
delay(100);
}
Serial.println(n);
}
3、運(yùn)行效果:
文章隨時(shí)可能更新,轉(zhuǎn)載請(qǐng)注明出文章原出處:https://blog.csdn.net/haigear/article/details/130025987文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-766213.html
到了這里,關(guān)于輸入端口少如何擴(kuò)展?74hc148或74ls148級(jí)聯(lián)在arduino中實(shí)現(xiàn)16轉(zhuǎn)4的應(yīng)用的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!