From: vl_garistov Date: Wed, 10 Feb 2021 00:29:49 +0000 (+0200) Subject: Added a third 7-segment example - with driver X-Git-Url: https://kolegite.com/gitweb/?a=commitdiff_plain;h=3d925ebee6af2cbc7ec1d03268844f661395a7df;p=vmks.git Added a third 7-segment example - with driver --- diff --git a/Datasheets/CD4511BC.pdf b/Datasheets/CD4511BC.pdf new file mode 100644 index 0000000..5dda8a5 Binary files /dev/null and b/Datasheets/CD4511BC.pdf differ diff --git a/Examples/7-segm_driver/7-segm_driver.ino b/Examples/7-segm_driver/7-segm_driver.ino new file mode 100644 index 0000000..bbff548 --- /dev/null +++ b/Examples/7-segm_driver/7-segm_driver.ino @@ -0,0 +1,67 @@ +#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); +} diff --git a/Examples/7-segm_driver/7-segm_driver.png b/Examples/7-segm_driver/7-segm_driver.png new file mode 100644 index 0000000..e543614 Binary files /dev/null and b/Examples/7-segm_driver/7-segm_driver.png differ diff --git a/Examples/7-segm_raw/7-segm_raw.ino b/Examples/7-segm_raw/7-segm_raw.ino index 28913f8..a0d0057 100644 --- a/Examples/7-segm_raw/7-segm_raw.ino +++ b/Examples/7-segm_raw/7-segm_raw.ino @@ -14,10 +14,10 @@ const uint8_t pins[8] = {A_PIN, B_PIN, C_PIN, D_PIN, E_PIN, F_PIN, G_PIN, DP_PIN 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 @@ -34,44 +34,33 @@ const uint8_t segment_map[16] = 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; } diff --git a/Examples/7-segm_shield/7-segm_shield.ino b/Examples/7-segm_shield/7-segm_shield.ino index e9b8b02..fbd78c6 100644 --- a/Examples/7-segm_shield/7-segm_shield.ino +++ b/Examples/7-segm_shield/7-segm_shield.ino @@ -27,7 +27,7 @@ void loop() 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)