在前一篇文章中,我們透過了7447以4個腳位的方式來控制1個七段顯示器,那麼如果需要使用2個7段顯示器的話,是否需要2顆7447以及2組電阻呢?答案是「不用」,只要多使用2條控制線,和多一個七段顯示器(好像是廢話),還有一些連接線就可以了。先來看看完成的成果:

看起來效果不錯吧!告訴你一個秘密,其實我們並不是同時點亮2個七段顯示器,而是一個時間只點亮一個,因為同一個時間只點亮一個,所以只要一顆7447和一組電阻就可以了。而因為我們是輪流點亮,中間的間隔只有5ms,基於眼睛的視覺暫留現象,所以完全看不出閃爍喔。連線的照片如下所示:

Arduino同樣地輸出5V的電源和GND(上圖下方),然後在上一篇文章中用來控制7447的資料輸入D1~D4仍然是接到PIN2~PIN5,另外,多接了2條線,分別是用來控制2顆七段顯示器的PIN6和PIN7。PIN6和PIN7如果輸出是0的話(因為是共陽),則會點亮該顆7段顯示器,如果是1的話,則不顯示。下圖是麵包板上的連接線:

留意到7447的7段顯示器輸出a~g先連線到220歐姆的電阻,然後電阻的另外一端,再分別並聯接到七段顯示器中。當然,七段顯示器的共陽端就是分別接到PIN6和PIN7,也別忘了7447本身也是需要電源的。都連好了之後,接下來就是最重要的程式:

byte bcd_code[10][4] = {
  {0,0,0,0},
  {0,0,0,1},
  {0,0,1,0},
  {0,0,1,1},
  {0,1,0,0},
  {0,1,0,1},
  {0,1,1,0},
  {0,1,1,1},
  {1,0,0,0},
  {1,0,0,1}
};
byte count = 0;
unsigned long time_prev = 0;
void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  time_prev = millis();
}

void disp(byte d) {
  for(byte i=0; i<4; i++) { digitalWrite(5-i, bcd_code[d][i]); } } void loop() { unsigned long time_now = millis(); if(time_now - time_prev > 500) {
    count ++;
    if(count>99) count=0;
    time_prev += 500;
  }
  digitalWrite(6, 1);
  digitalWrite(7, 0);
  disp(count%10);
  delay(5);
  digitalWrite(6, 0);  
  digitalWrite(7, 1);  
  disp(count/10);
  delay(5);
}

延續上一篇文章的程式我們做了一些修改。本電路的主要目的是要讓七段顯示器從00正數到99,每0.5秒切換一次。使用前一篇文章的disp()函式,但是在等待0.5這件事上,就不能使用之前的delay()函式,因為它在等待的時間沒有辦法顯示LED的內容,我們要做的是,持續地使用millis()函數取得時間,取得時間之後要做檢查,只有在差值超過500(ms)時才會切換要顯示的數字,否則就還是顯示一樣的數字。意思是說,不管目前數字如何,一定要一直做顯示的動作。

而在顯示時,使用整除和取餘數的方法,分別取得10位數和個位數再顯示之,而且顯示的時候要適當地切換要點亮的是哪一顆七段顯示器。最後,在切換之後要delay(5),做一點小小的延遲,切換LED才不會出問題。當然同樣的方法也可以繼續往下擴充:

影片如下:

程式如下:

byte bcd_code[10][4] = {
  {0,0,0,0},
  {0,0,0,1},
  {0,0,1,0},
  {0,0,1,1},
  {0,1,0,0},
  {0,1,0,1},
  {0,1,1,0},
  {0,1,1,1},
  {1,0,0,0},
  {1,0,0,1}
};
unsigned  count = 0;
unsigned long time_prev = 0;
void setup() {
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);

  time_prev = millis();
}

void disp(byte d) {
  for(byte i=0; i<4; i++) {
    digitalWrite(5-i, bcd_code[d][i]);
  }
}

void setLED(byte target) {
  for(byte i=6; i<=9; i++) { if(target+6==i) digitalWrite(i, 1); else digitalWrite(i, 0); } } void loop() { unsigned long time_now = millis(); if(time_now - time_prev > 200) {
    count ++;
    if(count>9999) count=0;
    time_prev += 200;
  }
  unsigned temp = count;
  for(byte t=0; t<4; t++) {
    unsigned d = temp /10;
    byte m = temp % 10;
    setLED(t);
    disp(m);
    temp = d;
    delay(1);
  }
}

挑戰看看吧!

(1374)