本以為左只是七段顯示器由 1支電源引腳 控制 對應 1位數字 ,增加至 4支電源引腳 只是控制對應 4位數字
但當實際測試時,原理是完全不同
四位七段顯示器 的外觀
四位七段顯示器 共有 12支引腳
電子迴路元件圖示
引腳編排及用途
後 | 引腳4 | 引腳H | 引腳G | 引腳3 | 引腳2 | 引腳F |
---|---|---|---|---|---|---|
用途 | 右4電源 | 上 | 左上 | 右3電源 | 右2電源 | 右上 |
左下 | 下 | 點 | 右下 | 中 | 右1電源 | |
正(有字印刷) | 引腳A | 引腳B | 引腳C | 引腳D | 引腳E | 引腳1 |
引腳編號 | 用途 |
---|---|
A | 左下 LED 接地線 |
B | 下 LED 接地線 |
C | 點 LED 接地線 |
D | 右下 LED 接地線 |
E | 中 LED 接地線 |
1 | 右1 電源線 |
F | 右上 LED 接地線 |
2 | 右2 電源線 |
3 | 右3 電源線 |
G | 左上 LED 接地線 |
H | 上 LED 接地線 |
4 | 右4 電源線 |
LED 位置 (模擬及示範效果)
接駁
同樣接通線路前必須先接駁電阻,否則 LED 會燒毀基本的接駁方法
在下的接駁方法
四位七段顯示器 的正面、前方、右側
四位七段顯示器 的正面、前方、左側
四位七段顯示器 的正面、後方、右側
跳線 接駁至 Arduino 2號 至 13號 引腳
四位七段顯示器 接駁至 麵包板 上,通過 跳線 接駁至 Arduino
四位七段顯示器 可以當作將 4個七段顯示器 連接在一齊
其中 8支引腳 與 七段顯示器 相同,都是控制 七段顯示器 的 8個LED ,而且連接所有對應位置的 LED 貫通四位
另外 4支引腳 就是控制對應位置的數字
將12支引腳接駁正確,當然是四位七段顯示器所有 LED 都著亮,但這會導致四位都著亮相同 LED
要讓四位都亮著不同 LED ,不能讓 LED 持續接通電源
需要 不斷接通與切斷對應位置及 LED 的電源
只要 接通與切斷電源的時間比人類視覺更新時間少,在人類視覺上便不會發生 LED 有切斷感覺
例如
- 右1位 亮著 第1段 LED
- 右2位 亮著 第2段 LED
- 右3位 亮著 第3段 LED
- 右4位 亮著 第4段 LED
測試
const byte SEGMENT_PINS[4] = {9, 8, 7, 6}; const byte POWER_PINS[4] = {10, 11, 12, 13}; const byte SEGMENT_LENGTH = sizeof(SEGMENT_PINS) / sizeof(byte); const byte POWER_LENGTH = sizeof(POWER_PINS) / sizeof(byte); void setup() { for (byte segmentPin : SEGMENT_PINS) { pinMode(segmentPin, OUTPUT); digitalWrite(segmentPin, HIGH); } for (byte powerPin : POWER_PINS) { pinMode(powerPin, OUTPUT); digitalWrite(powerPin, LOW); } } void loop() { setLED(POWER_PINS[0], SEGMENT_PINS[0]); setLED(POWER_PINS[1], SEGMENT_PINS[1]); setLED(POWER_PINS[2], SEGMENT_PINS[2]); setLED(POWER_PINS[3], SEGMENT_PINS[3]); } void setLED(byte powerPin, byte segmentPin, bool enabled) { digitalWrite(powerPin, enabled ? HIGH : LOW); digitalWrite(segmentPin, enabled ? LOW : HIGH); delay(1); } void setLED(byte powerPin, byte segmentPin) { setLED(powerPin, segmentPin, true); setLED(powerPin, segmentPin, false); }
效果
延遲時間為 千分之1秒,不會有閃動感覺
延遲時間很短,一般攝影裝置都不會拍攝到有閃動情況
延遲時間為 千分之40秒 (25 FPS , PAL 制式),會有明顯閃動感覺
計時器示範
const byte SEGMENT_PINS[8] = {9, 8, 7, 6, 2, 3, 4, 5}; const byte POWER_PINS[4] = {10, 11, 12, 13}; const byte SEGMENT_LENGTH = sizeof(SEGMENT_PINS) / sizeof(byte); const byte POWER_LENGTH = sizeof(POWER_PINS) / sizeof(byte); const unsigned int SEGMENTS[8] = { // middle 1 << 0, // top left 1 << 1, // top 1 << 2, // top right 1 << 3, // dot 1 << 4, // bottom right 1 << 5, // bottom 1 << 6, // bottom left 1 << 7 }; const unsigned int DIGITS[10] = { // 0 (SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6] | SEGMENTS[7]), // 1 (SEGMENTS[3] | SEGMENTS[5]), // 2 (SEGMENTS[0] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[6] | SEGMENTS[7]), // 3 (SEGMENTS[0] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6]), // 4 (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[3] | SEGMENTS[5]), // 5 (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[5] | SEGMENTS[6]), // 6 (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[5] | SEGMENTS[6] | SEGMENTS[7]), // 7 (SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5]), // 8 (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6] | SEGMENTS[7]), // 9 (SEGMENTS[0] | SEGMENTS[1] | SEGMENTS[2] | SEGMENTS[3] | SEGMENTS[5] | SEGMENTS[6]) }; unsigned int x = 0; void setup() { for (byte segmentPin : SEGMENT_PINS) { pinMode(segmentPin, OUTPUT); digitalWrite(segmentPin, HIGH); } for (byte powerPin : POWER_PINS) { pinMode(powerPin, OUTPUT); digitalWrite(powerPin, LOW); } } void loop() { x %= 10000; // loop 4 digits for assigning the dot for (byte k = 0; k < POWER_LENGTH; k++) { for (byte j = 0; j < (100 / POWER_LENGTH); j++) { // loop 4 digits unsigned int y = 1; for (byte i = 0; i < POWER_LENGTH; i++) { y *= 10; // set segments to the digit // assign the dot to the digit each 250ms setLED(POWER_PINS[i], DIGITS[(x / (y / 10)) % 10] | ((k == i) ? SEGMENTS[4] : 0)); } // total delay 8ms 4 digits // delay extra 2ms to be 10ms in a period delay(2); } } x++; } void setLED(byte powerPin, unsigned int segmentValue, bool enabled) { digitalWrite(powerPin, enabled ? HIGH : LOW); for (byte i = 0; i < SEGMENT_LENGTH; i++) { if ((segmentValue & SEGMENTS[i]) > 0) { digitalWrite(SEGMENT_PINS[i], enabled ? LOW : HIGH); } } delay(1); } void setLED(byte powerPin, unsigned int segmentValue) { setLED(powerPin, segmentValue, true); setLED(powerPin, segmentValue, false); }
計時器效果
在無外光情況下,會有些微閃動情況
總結
因為 LED 不斷亮著及熄滅,所以 光度會比較暗如果獨立接駁 4個七段顯示器 亮著 LED ,則可以保持亮度
但 1個七段顯示器 需要用 9支引腳 , 4個七段顯示器便要使用 36支引腳,路線便會非常複雜
而且 Arduino UNO Rev 3 亦沒有 36支引腳可以使用,要使用 Arduino Mega 才足夠
在下使用 電腦時間 及 多部電話計時器 測試,全部計時速度都比在下的 Arduino 計時器快
計時器使用 delay ,雖然 delay 是延遲 千分秒,但可能操作程序太複雜
導致 計時器 好像並不是確切的 千分秒 運作,顯示器顯示的時間好似不太準確
雖然本文的章是以四位七段顯示器測試
但在下認為凡是多位七段顯示器是以這種方式製作,操作方式都是相同,只是增加電源引腳即可
沒有留言 :
張貼留言