本以為左只是七段顯示器由 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 是延遲 千分秒,但可能操作程序太複雜
導致 計時器 好像並不是確切的 千分秒 運作,顯示器顯示的時間好似不太準確
雖然本文的章是以四位七段顯示器測試
但在下認為凡是多位七段顯示器是以這種方式製作,操作方式都是相同,只是增加電源引腳即可
沒有留言 :
張貼留言