上篇JIMI哥提到用8個GPIO控制7段顯示器的方法,優點是直覺方便,但就是占了太多腳位,這次就來講如果今天腳位數量有限制時,我們可以利用74HC595 這顆Shift IC的配套方案一樣來實現數字倒數功能。
參考連結:直接用8條IO控制7段顯示器的方法 (203-Arduino教學-7段顯示器-GPIO)
1. 74HC595 Shift IC原理
我們一樣可以在網路上搜尋{74HC595}這個關鍵字,就可以找到相關的使用手冊(datasheet),我們這邊用nexperia的74HC595來做解說(其實不同廠商做的74HC595規格都大同小異,做實驗時找個便宜的廠商即可),先來看腳位的分佈:
看上面這張圖,可能不是很清楚,沒關係,datasheet有另一張功能方塊圖更明白:
JIMI哥就來解釋一下上面這張功能方塊圖,大家可以想像一下在這個IC內部有2個水塔(Register)+1個流水總開關(3 state),在資料流動的過程中,會從最上面的水塔往下流動 (SHIFT REGISTERà STORAGE REGISTER),經過流水總開關決定是否輸出到Q0到Q7 ,所以:
- Q0到Q7 就是8個輸出,這是我們需要連接到7段顯示器的8腳位。
- OE是輸出啟動,就像是總開關一樣,決定資料可以不可以流出,因為我們沒有需求關閉,可以直接接到Low保持輸出即可(low-active)。
- STCP就是決定第1個水塔Shift Register的資料可不可以流到第2個水塔Storage Register存放著。
剩下的三個腳位DS+SHCP+MR就是決定第1個水塔怎麼工作的,我們用下圖來更清楚解釋做動原理。
DS就是我們接入資料流的地方,SHCP就是負責推入第一個水塔的加壓馬達。當SHCP=0時,DS就可以放入設定值,當SHCP=1時,DS的值就會被推入Shift Register中,所以我們就可以依序將DS的值推入第1個水塔中,最多可以推幾個值呢? 可以推8個進去,當第一個水塔滿了後,就可以用上面所提到的STCP將第1個水塔的資料流到Storage Register放著。
最後再提一下MR做甚麼用的呢? 就是清掉第一個水塔Shift Register的資料用的,這部分可以配合程式的動作搭配使用即可。在了解原理後,就可以來用電路接線實現我們的7段顯示器的倒數功能了。
2. 電路接法
因為這次我們只需要Arduino的3支腳位來控制74HC595,所以選擇編號2-4的數位腳位分別接到DS(IC PIN14)、SHCP(IC PIN11)、STCP(IC PIN12),74HC595的8個輸出記得要串一個限流電阻,Q0-Q7分別依序接入7段顯示器的ABCDEFG+DP,TinkerCad的接法如下:
小提醒:接線有點多,務必檢查一次。
3. 程式功能
這次要實現的功能跟上一篇一樣,讓7段顯示器倒數9-0即可,不同的是需要將資料用序列的方式傳入,這部分可以有兩種寫法,第一種為用arduino內建的shiftOut函數,第2種為土法煉鋼法,也就是將JIMI哥之前講的原理用程式一行一行寫出😆。這邊我們先來用方便的shiftOut函數。
完整程式碼如下:
#define data_pin 2
#define clk_pin 3
#define latch_pin 4
int seg_7[10]=
{
0xfc, //0 11111100
0x60, //1 01100000
0xda, //2 11011010
0xf2, //3 11110010
0x66, //4 01100110
0xb6, //5 10110110
0xbe, //6 10111110
0xe0, //7 11100000
0xfe, //8 11111110
0xf6 //9 11110110
};
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT); //data pin
pinMode(3,OUTPUT); //data clk
pinMode(4,OUTPUT); //sto clk
}
void loop() {
// put your main code here, to run repeatedly:
int j;
for(j=9;j>=0;j--)
{
digitalWrite(latch_pin,LOW);
shiftOut(data_pin,clk_pin,LSBFIRST,seg_7[j]);
digitalWrite(latch_pin,HIGH);
delay(400);
}
}
+ 程式講解
- 第1行–第3行:定義74HC595 跟Arduino連接的三隻腳位,分別為編號2、3、4。
- 第5行–第17行:由於後續要使用的shiftOut函數的參數無法輸入2進位數值,所以我們這邊把7段顯示器建立的0-9參數,改為16進位數值表示。
- 第19行–第23行:設定編號2、3、4腳位為數位輸出。
- 第28行–第34行:主要為執行顯示9-0的數字循環,其中關鍵的就是shiftOut函數用法,data-pin就是第一節所解釋的DS:clk-pin就是SHCP,將資料一個一個推入shift-register,latch-pin即STCP,將一整排資料放入Storage Register。
- 因shiftOut函數並未包含latch-pin的操作,所以我們在code就手動加入STCP功能(latch-pin)的LOW-HIGH動作,讓動作可以符合74595的規格要求。完整動作:STCP清為LOW à填入Q0-Q7的值STCP拉HIGH。
4. 小結&懶人包
這篇講的是當你沒有足夠腳位,需要用較少的腳位來實現數字顯示功能時,可以考慮的解決方案,目前的範例為1個7段顯示器,常見的為3個或4個數字顯示,線路接法與概念都與此篇雷同,有空時JIMI哥會在補充上去讓大家參考一下,最後附上這次74HC595的7段顯示器的懶人包連結(Arduino IDE ino檔)供大家下載: