Arduino [7SEGX8] 七段顯示器x2 使用74HC164驅動




這是一塊2排4位數7段顯示器(共8位數)的板子,由2顆74HC164控制,它的線路非常的單純排除電源之外,就只有DATA和CLOCK兩個訊號源而已。
由於它是由74HC164組成,所以資料傳輸方式就是使用位元資料PUSH出去的方式:

shiftOut(data_pin, clk_pin, MSBFIRST, ~output[index]);
shiftOut(data_pin, clk_pin, MSBFIRST, 1<<index);
delayMicroseconds(delayTime);

從上面的範例有執行兩次shiftOut的動作
第一次是送顯示位元(bit)送出去
第二次是重送定位(Digit)第幾位數
第三行是delayMicroseconds是顯示停留時間
    顯示停留時間如果太短,你會幾乎看不到顯示的數字,顯示時間太久,你會看到一個數字一個數字的移動,因為這個設計一次只能顯示一個位置的一個數字,然後利用快速切換將每個位置的數字依序跑一遍。然後利用視覺暫留的時間讓你的眼睛看到該數字出現在那裏。

模組樣式

這個模組顯示方式從第 0 位置到 7 位置,從左上方開始,於右下方結束
0 →1→2→3
4→5→6→7

這次我們做個計數器來測試,接線方式如下:

程式碼如下:


#define data_pin  2
#define clk_pin   3

int16_t delayTime = 2500; // 顯示暫留時間
// 顯示七節字碼 [0,1,2,3,4,5,6,7,8,9,空]
// B00111111,B00000110,B01011011,B01001111,B01101101,B01111101,B00000111,B0111111,B01101111,B00000000
uint8_t seg7[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F , 0x00};
uint8_t output[8];
long count = 0;

void setup() {
  // 設定輸出
  pinMode(clk_pin, OUTPUT);
  pinMode(data_pin , OUTPUT);
  memset(output, seg7[10], 8); //清除所有顯示
  showDisplay();
}
void showDisplay(){
  for(int8_t index = 7 ; index >= 0 ; index --){
    
    // 想在第6位置上加上'.' , 就將高位元的第一碼轉成1
    if(index==6){
      output[index] |= 0x80;
    }

    // 利用位元推送將資料推出去,第一次推顯示位元,第二次推送位置
    shiftOut(data_pin, clk_pin, MSBFIRST, ~output[index]);
    shiftOut(data_pin, clk_pin, MSBFIRST, 1<<index);
    delayMicroseconds(delayTime);
  }
}
void loop() {
  // 顯示數字轉換成資料
  long dummy = count;
  uint8_t pos = 10;
  // 將數字拆解
  for (uint8_t digit = 7 ;digit > 0; digit --){
    if (dummy <= 0){
        output[digit] = seg7[10];
    }else{
      pos = dummy % 10;
      output[digit] = seg7[pos];
    }
    dummy /= 10;
  }

  showDisplay();
  
  count++;
  if (count > 99999999) count = 0;
}



執行結果:計數器會從 0 計到 99999999 然後從 0 開始。
由於數字是從左上方依序移位所以會產生殘影(即沒有發光的地方也會有微微發光現象)


留言

這個網誌中的熱門文章

【研究】列印的條碼為什麼很難刷(掃描)

C# 使用 Process.Start 執行外部程式

統一發票列印小程式