--- /dev/null
+#define DATA1_PIN 2
+#define DATA2_PIN 5
+#define DATA3_PIN 4
+#define DATA4_PIN 3
+#define LATCH1_PIN 9
+#define LATCH2_PIN 8
+#define LATCH3_PIN 7
+#define LATCH4_PIN 6
+#define BLANKING_PIN 10
+
+#define BRIGHTNESS 200 // Maximum 255
+
+int print_digit(uint8_t position, uint8_t digit);
+void pulse_pin(uint8_t pin);
+
+const uint8_t data_pins[4] = {DATA1_PIN, DATA2_PIN, DATA3_PIN, DATA4_PIN};
+const uint8_t latch_pins[4] = {LATCH1_PIN, LATCH2_PIN, LATCH3_PIN, LATCH4_PIN};
+
+void setup()
+{
+ for (uint8_t i = 0; i < 4; i++)
+ {
+ pinMode(data_pins[i], OUTPUT);
+ digitalWrite(data_pins[i], LOW);
+ pinMode(latch_pins[i], OUTPUT);
+ digitalWrite(latch_pins[i], HIGH);
+ }
+ pinMode(BLANKING_PIN, OUTPUT);
+ analogWrite(BLANKING_PIN, BRIGHTNESS);
+}
+
+void loop()
+{
+ print_digit(0, 7);
+ print_digit(1, 7);
+ print_digit(2, 3);
+ print_digit(3, 4);
+ delay(1000);
+}
+
+int print_digit(uint8_t position, uint8_t digit)
+{
+ if (position > 3 || digit > 15)
+ {
+ return -1;
+ }
+
+ // Encode the digit on the four data signals to the drivers
+ for (uint8_t i = 0; i < 4; i++)
+ {
+ digitalWrite(data_pins[i], digit & (1 << i));
+ }
+ // Latch the data
+ pulse_pin(latch_pins[position]);
+
+ return 0;
+}
+
+void pulse_pin(uint8_t pin)
+{
+ // The delay from calling digitalWrite() is enough to satisfy the
+ // setup and hold times of CD5411 but we delay some more for good measure.
+ delayMicroseconds(5);
+ digitalWrite(pin, LOW);
+ delayMicroseconds(5);
+ digitalWrite(pin, HIGH);
+}
const uint8_t segment_map[16] =
{
// A B C D E F G DP
- 0b00000011, // 0
- 0b10011111, // 1
- 0b00100101, // 2
- 0b00001101, // 3
+ 0b00000011, // 0
+ 0b10011111, // 1
+ 0b00100101, // 2
+ 0b00001101, // 3
0b10011001, // 4
0b01001001, // 5
0b01000001, // 6
void setup()
{
- pinMode(A_PIN, OUTPUT);
- pinMode(B_PIN, OUTPUT);
- pinMode(C_PIN, OUTPUT);
- pinMode(D_PIN, OUTPUT);
- pinMode(E_PIN, OUTPUT);
- pinMode(F_PIN, OUTPUT);
- pinMode(G_PIN, OUTPUT);
- pinMode(DP_PIN, OUTPUT);
- digitalWrite(A_PIN, HIGH);
- digitalWrite(B_PIN, HIGH);
- digitalWrite(C_PIN, HIGH);
- digitalWrite(D_PIN, HIGH);
- digitalWrite(E_PIN, HIGH);
- digitalWrite(F_PIN, HIGH);
- digitalWrite(G_PIN, HIGH);
- digitalWrite(DP_PIN, HIGH);
+ for (uint8_t i = 0; i < 8; i++)
+ {
+ pinMode(pins[i], OUTPUT);
+ digitalWrite(pins[i], HIGH);
+ }
}
void loop()
{
for (uint8_t cnt = 0; cnt < 16; cnt++)
- {
- print_digit(cnt);
- delay(1000);
- }
+ {
+ print_digit(cnt);
+ delay(1000);
+ }
}
int print_digit(uint8_t digit)
{
- if (digit > 15)
- {
+ if (digit > 15)
+ {
return -1;
}
- for (uint8_t i = 0; i < 8; i++)
- {
+ for (uint8_t i = 0; i < 8; i++)
+ {
digitalWrite(pins[i], segment_map[digit] & (128 >> i));
}
-
+
return 0;
}
print_digit(3, 9);
}
-/* Write a decimal number between 0 and 9 to one of the 4 digits of the display */
+// Write a decimal number between 0 and 9 to one of the 4 digits of the display
int print_digit(uint8_t segment, uint8_t value)
{
if (value > 15 || segment > 3)