☛ 功能說明

使用 Arduino 開發板控制四位七段顯示器上數計數並顯示 0000~9999 。 如下圖所示四位七段顯示器元件及正面接腳圖,各相同段連接在一起,並且以 D3~D0 來驅動,其中 D3 驅動最左邊顯示器,D0 驅動最右邊顯示器,因為是使用 PNP 電晶體,因此 Arduino 開發板輸出低電位可驅動電晶體導通。

為了減少七段顯示器的功率消耗,經常使用多工掃描的方法來驅動。 如下圖所示四位七段顯示器驅動電路,使用共陽極七段顯示器。 以顯示數值 1234 為例,第一次掃描輸出資料 abcdefgp=10011111B,致能 Q3 導通。 第二次掃描輸出資料 abcdefgp=00100101B,致能 Q2 導通。 第三次掃描輸出資料 abcdefgp=00001101B,致能 Q1 導通。 第四次掃描輸出資料 abcdefgp=10011001B,致能 Q0 導通。 因為人類的視覺暫留現象,畫面停留在視網膜的時間平均為 1/16 秒,因此只要掃描時間遠小於視覺暫留時間,人眼就會感覺同時看到四個數值顯示,一般選擇 2ms~5ms 的掃描時間即可得到不錯的效果。

☛ 使用材料

Arduino UNO R3 開發板 × 1、電阻 220Ω × 8、電阻 10KΩ × 4、PNP電晶體 2N3906 × 4、四位共陽極七段顯示器 SH5461BS × 1。

☛ 電路圖及麵包板接線圖

☛ 程式碼

int i,j;                                                 //索引值
int count=0;                                             //0000~9999 顯示值
int number;                                              //0000~9999 顯示值
unsigned long time=0;                                    //計時
const byte num[10]=                                      //0~9 顯示碼
      { B11000000, B11111001, B10100100, B10110000, B10011001,
        B10010010, B10000010, B11111000, B10000000, B10010000 };
const int seg[]={ 2,3,4,5,6,7,8,9 };                     //abcdefgp
const int digit[]={ 10,11,12,13 };                       //D1~D4

void setup()
{
     for(i=0;i<8;i++)
         pinMode(seg[i],OUTPUT);                         //設定數位接腳 2~9 為輸出模式
     for(i=0;i<4;i++)
     {
         pinMode(digit[i],OUTPUT);                       //設定數位接腳 10~13 為輸出模式
         digitalWrite(digit[i],HIGH);                    //掃描信號初值
     }
}

void loop()
{
     number=count; 
     for(i=3;i>=0;i--)                                   //四位數 D1~D4
     {
         for(j=0;j<8;j++)                                //八位元顯示碼 abcdefgp
         {
             if(bitRead(num[number%10],j))               //讀取目前七段顯示器掃描位元數位元 j
                digitalWrite(seg[j],HIGH);               //若位元為 1 則 LED 狀態為 HIGH
             else
                digitalWrite(seg[j],LOW);                //若位元為 0 則 LED 狀態為 LOW
         }
         digitalWrite(digit[i],LOW);                     //掃描第 i 行顯示器
         delay(5);                                       //掃描時間 5ms
         digitalWrite(digit[i],HIGH);                    //關閉掃描第 i 行顯示器,消除顯示鬼影
         number=number/10;                               //掃描下一位數
         if(millis()-time>=1000)                         //已經過了 1 秒?
         {
            time=millis();                               //記錄時間
            count++;                                     //顯示值上數加 1
            if(count>9999)                               //已經計數至 9999
               count=0;                                  //清除顯示值為 0000
         }
     }
}

 

☛ 練習

⑴ 設計 Arduino 程式,控制四位七段顯示器下數計數並顯示 9999~0000 變化。

int i,j;                                                 //索引值
int count=9999;                                          //9999~0000 顯示值
int number;                                              //9999~0000 顯示值
unsigned long time=0;                                    //計時
const byte num[10]=                                      //0~9 顯示碼
      { B11000000, B11111001, B10100100, B10110000, B10011001,
        B10010010, B10000010, B11111000, B10000000, B10010000 };
const int seg[]={ 2,3,4,5,6,7,8,9 };                     //abcdefgp
const int digit[]={ 10,11,12,13 };                       //D1~D4

void setup()
{
     for(i=0;i<8;i++)
         pinMode(seg[i],OUTPUT);                         //設定數位接腳 2~9 為輸出模式
     for(i=0;i<4;i++)
     {
         pinMode(digit[i],OUTPUT);                       //設定數位接腳 10~13 為輸出模式
         digitalWrite(digit[i],HIGH);                    //掃描信號初值
     }
}

void loop()
{
     number=count; 
     for(i=3;i>=0;i--)                                   //四位數 D1~D4
     {
         for(j=0;j<8;j++)                                //八位元顯示碼 abcdefgp
         {
             if(bitRead(num[number%10],j))               //讀取目前七段顯示器掃描位元數位元 j
                digitalWrite(seg[j],HIGH);               //若位元為 1 則 LED 狀態為 HIGH
             else
                digitalWrite(seg[j],LOW);                //若位元為 0 則 LED 狀態為 LOW
         }
         digitalWrite(digit[i],LOW);                     //掃描第 i 行顯示器
         delay(5);                                       //掃描時間 5ms
         digitalWrite(digit[i],HIGH);                    //關閉掃描第 i 行顯示器,消除顯示鬼影
         number=number/10;                               //掃描下一位數
         if(millis()-time>=1000)                         //已經過了 1 秒?
         {
            time=millis();                               //記錄時間
            count--;                                     //顯示值下數減 1
            if(count<0)                                  //已經計數至 0
               count=9999;                               //清除顯示值為 9999
         }
     }
}

 

⑵ 設計 Arduino 程式,控制四位七段顯示器閃爍上數計數並顯示 0000~9999 變化。

int i,j;                                            //索引值
int count=0;                                        //0000~9999 顯示值
int number;                                         //0000~9999 顯示值
unsigned long time=0;                               //計時
const byte num[10]=                                 //0~9 顯示碼
      { B11000000, B11111001, B10100100, B10110000, B10011001,
        B10010010, B10000010, B11111000, B10000000, B10010000 };
const int seg[]={ 2,3,4,5,6,7,8,9 };                //abcdefgp
const int digit[]={ 10,11,12,13 };                  //D1~D4

void setup()
{
     for(i=0;i<8;i++)
         pinMode(seg[i],OUTPUT);                    //設定數位接腳 2~9 為輸出模式
     for(i=0;i<4;i++)
     {
         pinMode(digit[i],OUTPUT);                  //設定數位接腳 10~13 為輸出模式
         digitalWrite(digit[i],HIGH);               //掃描信號初值
     }
}

void loop()
{
     number=count; 
     numDisplay();                                  //顯示計數數值
     if(millis()-time>=1000)                        //已經過了 1 秒?
     {
        time=millis();                              //記錄時間
        count++;                                    //顯示值下數減 1
        if(count>9999)                              //已經計數至 9999
           count=0;                                 //清除顯示值為 0000
    }
}

void numDisplay()                                   //顯示計數數值副程式
{
     for(i=3;i>=0;i--)                              //四位數 D1~D4
     {
         for(j=0;j<8;j++)                           //八位元顯示碼 abcdefgp
         {
             if(bitRead(num[number%10],j))          //讀取目前七段顯示器掃描位元數位元 j
                digitalWrite(seg[j],HIGH);          //若位元為 1 則 LED 狀態為 HIGH
             else
                digitalWrite(seg[j],LOW);           //若位元為 0 則 LED 狀態為 LOW
         }
         digitalWrite(digit[i],LOW);                //掃描第 i 行顯示器
         delay(5);                                  //掃描時間 5ms
         digitalWrite(digit[i],HIGH);               //關閉掃描第 i 行顯示器,消除顯示鬼影
         number=number/10;                          //掃描下一位數
     } 
     if(millis()-time>=250)                         //數值顯示超過 250ms
     {
        closeDisplay();                             //關閉四位七段顯示器
        delay(250);                                 //延遲 250ms
     } 
}

void closeDisplay()                                 //關閉四位七段顯示器副程式
{
     for(i=0;i<4;i++)
         digitalWrite(digit[i],HIGH);
}