changeset 1:1928b20a7094

Basic counter and display code
author Radomir Dopieralski <sheep-devel@sheep.art.pl>
date Mon, 24 Aug 2015 23:33:02 +0200
parents 1c847afac1cd
children 13a554ba5332
files voter.ino
diffstat 1 files changed, 87 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/voter.ino	Mon Aug 24 23:33:02 2015 +0200
@@ -0,0 +1,87 @@
+const int GND_PINS[] = {9, 11, 12, A1};
+const int VCC_PINS[] = {A0, 10, 7, 5, 4, 13, 8, 6};
+const unsigned char DIGITS[] = {
+    0b00111111,
+    0b00000110,
+    0b01011011,
+    0b01001111,
+    0b01100110,
+    0b01101101,
+    0b01111101,
+    0b00000111,
+    0b01111111,
+    0b01101111,
+};
+const unsigned char SYMBOLS[] = {
+    0b01011111,
+    0b01111100,
+    0b01011000,
+};
+const int BUTTON_PINS[] = {2, 3, A2};
+
+
+int counts[] = {0, 0, 0};
+
+
+void show7seg(int number, int symbol) {
+    unsigned char digit;
+    div_t result;
+
+    for (int d = 0; d < 3; ++d) {
+        result = div(number, 10);
+        digit = DIGITS[result.rem % 10];
+        number = result.quot;
+        for (int s = 0; s < 8; ++s) {
+            digitalWrite(VCC_PINS[s], digit & (1 << s));
+        }
+        pinMode(GND_PINS[d], OUTPUT);
+        digitalWrite(GND_PINS[d], LOW);
+        delay(2);
+        pinMode(GND_PINS[d], INPUT);
+    }
+    for (int s = 0; s < 8; ++s) {
+        digitalWrite(VCC_PINS[s], SYMBOLS[symbol] & (1 << s));
+    }
+    pinMode(GND_PINS[3], OUTPUT);
+    digitalWrite(GND_PINS[3], LOW);
+    delay(2);
+    pinMode(GND_PINS[3], INPUT);
+}
+
+
+void handle_buttons() {
+    static long int last = 0;
+    long int now = millis();
+
+    if (now - last < 300) {
+        // Debouncing.
+        return;
+    }
+    last = now;
+
+    for (int b = 0; b < 3; ++b) {
+        if (!digitalRead(BUTTON_PINS[b])) {
+            counts[b] += 1;
+        }
+    }
+}
+
+
+void setup() {
+    for (int s = 0; s < 8; ++s) {
+        pinMode(VCC_PINS[s], OUTPUT);
+    }
+    for (int d = 0; d < 4; ++d) {
+        pinMode(GND_PINS[d], INPUT);
+    }
+    for (int b = 0; b < 3; ++b) {
+        pinMode(BUTTON_PINS[b], INPUT_PULLUP);
+    }
+}
+
+
+void loop() {
+    int counter = (millis() / 2000) % 3;
+    show7seg(counts[counter], counter);
+    handle_buttons();
+}