| Arduino教學 | 7段顯示器- 74HC595| 204 |

上篇JIMI哥提到用8GPIO控制7段顯示器的方法,優點是直覺方便,但就是占了太多腳位,這次就來講如果今天腳位數量有限制時,我們可以利用74HC595 這顆Shift IC的配套方案一樣來實現數字倒數功能。

參考連結:直接用8條IO控制7段顯示器的方法  (203-Arduino教學-7段顯示器-GPIO)

1. 74HC595 Shift IC原理

我們一樣可以在網路上搜尋{74HC595}這個關鍵字,就可以找到相關的使用手冊(datasheet),我們這邊用nexperia74HC595來做解說(其實不同廠商做的74HC595規格都大同小異,做實驗時找個便宜的廠商即可),先來看腳位的分佈:

看上面這張圖,可能不是很清楚,沒關係,datasheet有另一張功能方塊圖更明白:

JIMI哥就來解釋一下上面這張功能方塊圖,大家可以想像一下在這個IC內部有2個水塔(Register)+1個流水總開關(3 state),在資料流動的過程中,會從最上面的水塔往下流動 (SHIFT REGISTERà STORAGE REGISTER),經過流水總開關決定是否輸出到Q0Q7 ,所以:

  1. Q0Q7 就是8個輸出,這是我們需要連接到7段顯示器的8腳位。
  2. OE是輸出啟動,就像是總開關一樣,決定資料可以不可以流出,因為我們沒有需求關閉,可以直接接到Low保持輸出即可(low-active)
  3. STCP就是決定第1個水塔Shift Register的資料可不可以流到第2個水塔Storage Register存放著。

剩下的三個腳位DS+SHCP+MR就是決定第1個水塔怎麼工作的,我們用下圖來更清楚解釋做動原理。

74HC595

DS就是我們接入資料流的地方,SHCP就是負責推入第一個水塔的加壓馬達。當SHCP=0時,DS就可以放入設定值,當SHCP=1時,DS的值就會被推入Shift Register中,所以我們就可以依序將DS的值推入第1個水塔中,最多可以推幾個值呢? 可以推8個進去,當第一個水塔滿了後,就可以用上面所提到的STCP將第1個水塔的資料流到Storage Register放著。

最後再提一下MR做甚麼用的呢? 就是清掉第一個水塔Shift Register的資料用的,這部分可以配合程式的動作搭配使用即可。在了解原理後,就可以來用電路接線實現我們的7段顯示器的倒數功能了。

2. 電路接法

因為這次我們只需要Arduino3支腳位來控制74HC595,所以選擇編號2-4的數位腳位分別接到DS(IC PIN14)SHCP(IC PIN11)STCP(IC PIN12)74HC5958個輸出記得要串一個限流電阻,Q0-Q7分別依序接入7段顯示器的ABCDEFG+DPTinkerCad的接法如下:

小提醒:接線有點多,務必檢查一次

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. 13行:定義74HC595 Arduino連接的三隻腳位,分別為編號234
  2. 517行:由於後續要使用的shiftOut函數的參數無法輸入2進位數值,所以我們這邊把7段顯示器建立的0-9參數,改為16進位數值表示。
  3. 1923行:設定編號234腳位為數位輸出。
  4. 2834行:主要為執行顯示9-0的數字循環,其中關鍵的就是shiftOut函數用法,data-pin就是第一節所解釋的DSclk-pin就是SHCP,將資料一個一個推入shift-registerlatch-pinSTCP,將一整排資料放入Storage Register
  5. shiftOut函數並未包含latch-pin的操作,所以我們在code就手動加入STCP功能(latch-pin)LOW-HIGH動作,讓動作可以符合74595的規格要求。完整動作:STCP清為LOW à填入Q0-Q7的值STCP拉HIGH

4. 小結&懶人包

這篇講的是當你沒有足夠腳位,需要用較少的腳位來實現數字顯示功能時,可以考慮的解決方案,目前的範例為17段顯示器,常見的為3個或4個數字顯示,線路接法與概念都與此篇雷同,有空時JIMI哥會在補充上去讓大家參考一下,最後附上這次74HC5957段顯示器的懶人包連結(Arduino IDE ino)供大家下載:

204-7SEG-74HC595.ino

發佈留言

Close Menu