1.1 --- a/Alphanumeric.cpp Sun Jan 10 00:30:41 2016 +0100
1.2 +++ b/Alphanumeric.cpp Sun Jan 10 22:58:17 2016 +0100
1.3 @@ -18,13 +18,47 @@
1.4 */
1.5
1.6 #include <Wire.h>
1.7 +#include "shapes.h"
1.8 +
1.9 +/* Multiplexer circuit definitions. */
1.10 +
1.11 +const uint8_t MUX_S = 3,
1.12 + D0 = 4, D1 = 5, D2 = 6, D3 = 7,
1.13 + D4 = 8, D5 = 9, D6 = 10, D7 = 11;
1.14 +
1.15 +const uint8_t datapins[8] = {D7, D6, D5, D4, D3, D2, D1, D0};
1.16 +
1.17 +const uint16_t digits[] = {
1.18 + OUTER_FRAME,
1.19 + RIGHT_EDGE,
1.20 + HORIZONTALS | UPPER_RIGHT_VERTICAL | LOWER_LEFT_VERTICAL,
1.21 + HORIZONTALS | RIGHT_EDGE,
1.22 + UPPER_LEFT_VERTICAL | MIDDLE_ELEMENTS | RIGHT_EDGE,
1.23 + HORIZONTALS | UPPER_LEFT_VERTICAL | LOWER_RIGHT_VERTICAL,
1.24 + HORIZONTALS | LEFT_EDGE | LOWER_RIGHT_VERTICAL,
1.25 + TOP_EDGE | UPPER_RIGHT_DIAGONAL | LOWER_LEFT_DIAGONAL,
1.26 + OUTER_FRAME | MIDDLE_ELEMENTS,
1.27 + HORIZONTALS | RIGHT_EDGE | UPPER_LEFT_VERTICAL,
1.28 + HORIZONTALS | RIGHT_EDGE | LOWER_LEFT_VERTICAL,
1.29 + LEFT_EDGE | MIDDLE_ELEMENTS | BOTTOM_EDGE | LOWER_RIGHT_VERTICAL,
1.30 + MIDDLE_ELEMENTS | BOTTOM_EDGE | LOWER_LEFT_VERTICAL,
1.31 + RIGHT_EDGE | MIDDLE_ELEMENTS | BOTTOM_EDGE | LOWER_LEFT_VERTICAL,
1.32 + HORIZONTALS | LEFT_EDGE | UPPER_RIGHT_VERTICAL,
1.33 + LEFT_EDGE | TOP_EDGE | MIDDLE_ELEMENTS
1.34 + };
1.35 +
1.36 +/* Serial communications definitions. */
1.37
1.38 const int BUFSIZE = 17;
1.39 char inbuffer[BUFSIZE];
1.40 uint8_t nread = 0;
1.41
1.42 +/* Display memory buffer. */
1.43 +
1.44 uint8_t data[8] = {0, 0, 0, 0, 0, 0, 0, 0};
1.45
1.46 +/* Display operations. */
1.47 +
1.48 void enable_clock()
1.49 {
1.50 Wire.beginTransmission(0x70);
1.51 @@ -117,7 +151,50 @@
1.52 }
1.53 }
1.54
1.55 -void setup()
1.56 +/* Data sampling functions. */
1.57 +
1.58 +uint8_t sample_value(uint8_t start, uint8_t end)
1.59 +{
1.60 + uint8_t bit, value;
1.61 +
1.62 + value = 0;
1.63 +
1.64 + for (bit = start; bit < end; bit++)
1.65 + {
1.66 + value = (value << 1) | digitalRead(datapins[bit]);
1.67 + }
1.68 +
1.69 + return value;
1.70 +}
1.71 +
1.72 +void sample_data(uint8_t data[], uint8_t start, uint8_t end)
1.73 +{
1.74 + uint8_t low, high, value;
1.75 + uint16_t digit_value;
1.76 +
1.77 + value = sample_value(start, end);
1.78 + digit_value = digits[value];
1.79 +
1.80 + /* Switch to little-endian. */
1.81 +
1.82 + data[0] = (uint8_t) (digit_value & 0xff);
1.83 + data[1] = (uint8_t) (digit_value >> 8);
1.84 +}
1.85 +
1.86 +void scan_inputs(uint8_t data[])
1.87 +{
1.88 + digitalWrite(MUX_S, 0);
1.89 + sample_data(&data[2], 4, 8); /* bits 3..0 */
1.90 + sample_data(&data[0], 0, 4); /* bits 7..4 */
1.91 +
1.92 + digitalWrite(MUX_S, 1);
1.93 + sample_data(&data[6], 4, 8);
1.94 + sample_data(&data[4], 0, 4);
1.95 +}
1.96 +
1.97 +/* Main functions. */
1.98 +
1.99 +void client_setup()
1.100 {
1.101 Wire.begin();
1.102 Serial.begin(115200);
1.103 @@ -131,7 +208,39 @@
1.104 Serial.println("?");
1.105 }
1.106
1.107 -void loop()
1.108 +void sample_setup()
1.109 +{
1.110 + Wire.begin();
1.111 +
1.112 + pinMode(MUX_S, OUTPUT);
1.113 + pinMode(D0, INPUT);
1.114 + pinMode(D1, INPUT);
1.115 + pinMode(D2, INPUT);
1.116 + pinMode(D3, INPUT);
1.117 + pinMode(D4, INPUT);
1.118 + pinMode(D5, INPUT);
1.119 + pinMode(D6, INPUT);
1.120 + pinMode(D7, INPUT);
1.121 +
1.122 + init_alphanumeric();
1.123 + write_digits(data, 8);
1.124 + enable_display();
1.125 +}
1.126 +
1.127 +void setup()
1.128 +{
1.129 + /* client_setup(); */
1.130 + sample_setup();
1.131 +}
1.132 +
1.133 +void sample_loop()
1.134 +{
1.135 + scan_inputs(data);
1.136 + write_digits(data, 8);
1.137 + delay(250);
1.138 +}
1.139 +
1.140 +void client_loop()
1.141 {
1.142 /* Read bytes, obtaining the number read excluding any newline terminator. */
1.143
1.144 @@ -156,6 +265,12 @@
1.145 }
1.146 }
1.147
1.148 +void loop()
1.149 +{
1.150 + /* client_loop(); */
1.151 + sample_loop();
1.152 +}
1.153 +
1.154 extern "C" void __cxa_pure_virtual(void) {
1.155 while(1);
1.156 }