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,B00000000uint8_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 開始。
由於數字是從左上方依序移位所以會產生殘影(即沒有發光的地方也會有微微發光現象)
留言