Augur rain MASTER

Dependencies:   mbed

Fork of 1A_PROJECT_DIGITAL by Jakkapan Keawsalak

Committer:
gamezajad
Date:
Tue Dec 08 19:25:47 2015 +0000
Revision:
0:ede9cc7e508b
1A

Who changed what in which revision?

UserRevisionLine numberNew contents of line
gamezajad 0:ede9cc7e508b 1 /* The library of Grove - 4 Digit Display
gamezajad 0:ede9cc7e508b 2 *
gamezajad 0:ede9cc7e508b 3 * \author Yihui Xiong
gamezajad 0:ede9cc7e508b 4 * \date 2014/2/8
gamezajad 0:ede9cc7e508b 5 *
gamezajad 0:ede9cc7e508b 6 * The MIT License (MIT)
gamezajad 0:ede9cc7e508b 7 *
gamezajad 0:ede9cc7e508b 8 * Copyright (c) 2014 Seeed Technology Inc.
gamezajad 0:ede9cc7e508b 9 *
gamezajad 0:ede9cc7e508b 10 * Permission is hereby granted, free of charge, to any person obtaining a copy
gamezajad 0:ede9cc7e508b 11 * of this software and associated documentation files (the "Software"), to deal
gamezajad 0:ede9cc7e508b 12 * in the Software without restriction, including without limitation the rights
gamezajad 0:ede9cc7e508b 13 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
gamezajad 0:ede9cc7e508b 14 * copies of the Software, and to permit persons to whom the Software is
gamezajad 0:ede9cc7e508b 15 * furnished to do so, subject to the following conditions:
gamezajad 0:ede9cc7e508b 16 *
gamezajad 0:ede9cc7e508b 17 * The above copyright notice and this permission notice shall be included in
gamezajad 0:ede9cc7e508b 18 * all copies or substantial portions of the Software.
gamezajad 0:ede9cc7e508b 19 *
gamezajad 0:ede9cc7e508b 20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
gamezajad 0:ede9cc7e508b 21 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
gamezajad 0:ede9cc7e508b 22 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
gamezajad 0:ede9cc7e508b 23 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
gamezajad 0:ede9cc7e508b 24 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
gamezajad 0:ede9cc7e508b 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
gamezajad 0:ede9cc7e508b 26 * THE SOFTWARE.
gamezajad 0:ede9cc7e508b 27 */
gamezajad 0:ede9cc7e508b 28
gamezajad 0:ede9cc7e508b 29 #include "DigitDisplay.h"
gamezajad 0:ede9cc7e508b 30
gamezajad 0:ede9cc7e508b 31 #define ADDR_AUTO 0x40
gamezajad 0:ede9cc7e508b 32 #define ADDR_FIXED 0x44
gamezajad 0:ede9cc7e508b 33
gamezajad 0:ede9cc7e508b 34 #define POSITION_COLON 1
gamezajad 0:ede9cc7e508b 35
gamezajad 0:ede9cc7e508b 36 #define DIGIT_UNKOWN 0x08
gamezajad 0:ede9cc7e508b 37 #define DIGIT_NULL 0x00
gamezajad 0:ede9cc7e508b 38 #define DIGIT_MINUS 0x40
gamezajad 0:ede9cc7e508b 39
gamezajad 0:ede9cc7e508b 40 const uint8_t DIGIT_TABLE[] = {0x3f, 0x06, 0x5b, 0x4f,
gamezajad 0:ede9cc7e508b 41 0x66, 0x6d, 0x7d, 0x07,
gamezajad 0:ede9cc7e508b 42 0x7f, 0x6f, 0x77, 0x7c,
gamezajad 0:ede9cc7e508b 43 0x39, 0x5e, 0x79, 0x71
gamezajad 0:ede9cc7e508b 44 }; //0~9,A,b,C,d,E,F
gamezajad 0:ede9cc7e508b 45
gamezajad 0:ede9cc7e508b 46
gamezajad 0:ede9cc7e508b 47 inline uint8_t conv(uint8_t n)
gamezajad 0:ede9cc7e508b 48 {
gamezajad 0:ede9cc7e508b 49 uint8_t segments;
gamezajad 0:ede9cc7e508b 50
gamezajad 0:ede9cc7e508b 51 if (n <= sizeof(DIGIT_TABLE)) {
gamezajad 0:ede9cc7e508b 52 segments = DIGIT_TABLE[n];
gamezajad 0:ede9cc7e508b 53 }else if (n == 0xFF) {
gamezajad 0:ede9cc7e508b 54 segments = DIGIT_NULL;
gamezajad 0:ede9cc7e508b 55 } else {
gamezajad 0:ede9cc7e508b 56 segments = DIGIT_UNKOWN;
gamezajad 0:ede9cc7e508b 57 }
gamezajad 0:ede9cc7e508b 58
gamezajad 0:ede9cc7e508b 59 return segments;
gamezajad 0:ede9cc7e508b 60 }
gamezajad 0:ede9cc7e508b 61
gamezajad 0:ede9cc7e508b 62 DigitDisplay::DigitDisplay(PinName clk, PinName dio) : _clk(clk), _dio(dio)
gamezajad 0:ede9cc7e508b 63 {
gamezajad 0:ede9cc7e508b 64 _dio.output();
gamezajad 0:ede9cc7e508b 65 _dio = 1;
gamezajad 0:ede9cc7e508b 66 _clk = 1;
gamezajad 0:ede9cc7e508b 67
gamezajad 0:ede9cc7e508b 68 _brightness = 2;
gamezajad 0:ede9cc7e508b 69 _colon = false;
gamezajad 0:ede9cc7e508b 70 _off = true;
gamezajad 0:ede9cc7e508b 71
gamezajad 0:ede9cc7e508b 72 for (uint8_t i = 0; i < sizeof(_content); i++) {
gamezajad 0:ede9cc7e508b 73 _content[i] = DIGIT_NULL;
gamezajad 0:ede9cc7e508b 74 }
gamezajad 0:ede9cc7e508b 75 }
gamezajad 0:ede9cc7e508b 76
gamezajad 0:ede9cc7e508b 77 void DigitDisplay::on()
gamezajad 0:ede9cc7e508b 78 {
gamezajad 0:ede9cc7e508b 79 start();
gamezajad 0:ede9cc7e508b 80 send(0x88 | _brightness);
gamezajad 0:ede9cc7e508b 81 stop();
gamezajad 0:ede9cc7e508b 82 }
gamezajad 0:ede9cc7e508b 83
gamezajad 0:ede9cc7e508b 84 void DigitDisplay::off()
gamezajad 0:ede9cc7e508b 85 {
gamezajad 0:ede9cc7e508b 86 start();
gamezajad 0:ede9cc7e508b 87 send(0x80);
gamezajad 0:ede9cc7e508b 88 stop();
gamezajad 0:ede9cc7e508b 89 }
gamezajad 0:ede9cc7e508b 90
gamezajad 0:ede9cc7e508b 91 void DigitDisplay::setBrightness(uint8_t brightness)
gamezajad 0:ede9cc7e508b 92 {
gamezajad 0:ede9cc7e508b 93 if (brightness > 7) {
gamezajad 0:ede9cc7e508b 94 brightness = 7;
gamezajad 0:ede9cc7e508b 95 }
gamezajad 0:ede9cc7e508b 96
gamezajad 0:ede9cc7e508b 97 _brightness = brightness;
gamezajad 0:ede9cc7e508b 98
gamezajad 0:ede9cc7e508b 99 start();
gamezajad 0:ede9cc7e508b 100 send(0x88 | _brightness);
gamezajad 0:ede9cc7e508b 101 stop();
gamezajad 0:ede9cc7e508b 102 }
gamezajad 0:ede9cc7e508b 103
gamezajad 0:ede9cc7e508b 104 void DigitDisplay::setColon(bool enable)
gamezajad 0:ede9cc7e508b 105 {
gamezajad 0:ede9cc7e508b 106 if (_colon != enable) {
gamezajad 0:ede9cc7e508b 107 _colon = enable;
gamezajad 0:ede9cc7e508b 108
gamezajad 0:ede9cc7e508b 109 if (enable) {
gamezajad 0:ede9cc7e508b 110 _content[POSITION_COLON] |= 0x80;
gamezajad 0:ede9cc7e508b 111 } else {
gamezajad 0:ede9cc7e508b 112 _content[POSITION_COLON] &= 0x7F;
gamezajad 0:ede9cc7e508b 113 }
gamezajad 0:ede9cc7e508b 114
gamezajad 0:ede9cc7e508b 115 writeRaw(POSITION_COLON, _content[POSITION_COLON]);
gamezajad 0:ede9cc7e508b 116 }
gamezajad 0:ede9cc7e508b 117 }
gamezajad 0:ede9cc7e508b 118
gamezajad 0:ede9cc7e508b 119 void DigitDisplay::write(int16_t n)
gamezajad 0:ede9cc7e508b 120 {
gamezajad 0:ede9cc7e508b 121 uint8_t negative = 0;
gamezajad 0:ede9cc7e508b 122
gamezajad 0:ede9cc7e508b 123 if (n < 0) {
gamezajad 0:ede9cc7e508b 124 negative = 1;
gamezajad 0:ede9cc7e508b 125 n = (-n) % 1000;
gamezajad 0:ede9cc7e508b 126 } else {
gamezajad 0:ede9cc7e508b 127 n = n % 10000;
gamezajad 0:ede9cc7e508b 128 }
gamezajad 0:ede9cc7e508b 129
gamezajad 0:ede9cc7e508b 130 int8_t i = 3;
gamezajad 0:ede9cc7e508b 131 do {
gamezajad 0:ede9cc7e508b 132 uint8_t r = n % 10;
gamezajad 0:ede9cc7e508b 133 _content[i] = conv(r);
gamezajad 0:ede9cc7e508b 134 i--;
gamezajad 0:ede9cc7e508b 135 n = n / 10;
gamezajad 0:ede9cc7e508b 136 } while (n != 0);
gamezajad 0:ede9cc7e508b 137
gamezajad 0:ede9cc7e508b 138 if (negative) {
gamezajad 0:ede9cc7e508b 139 _content[i] = DIGIT_MINUS;
gamezajad 0:ede9cc7e508b 140 i--;
gamezajad 0:ede9cc7e508b 141 }
gamezajad 0:ede9cc7e508b 142
gamezajad 0:ede9cc7e508b 143 for (int8_t j = 0; j <= i; j++) {
gamezajad 0:ede9cc7e508b 144 _content[j] = DIGIT_NULL;
gamezajad 0:ede9cc7e508b 145 }
gamezajad 0:ede9cc7e508b 146
gamezajad 0:ede9cc7e508b 147 if (_colon) {
gamezajad 0:ede9cc7e508b 148 _content[POSITION_COLON] |= 0x80;
gamezajad 0:ede9cc7e508b 149 }
gamezajad 0:ede9cc7e508b 150
gamezajad 0:ede9cc7e508b 151 writeRaw(_content);
gamezajad 0:ede9cc7e508b 152 }
gamezajad 0:ede9cc7e508b 153
gamezajad 0:ede9cc7e508b 154 void DigitDisplay::write(uint8_t numbers[])
gamezajad 0:ede9cc7e508b 155 {
gamezajad 0:ede9cc7e508b 156 for (uint8_t i = 0; i < 4; i++) {
gamezajad 0:ede9cc7e508b 157 _content[i] = conv(numbers[i]);
gamezajad 0:ede9cc7e508b 158 }
gamezajad 0:ede9cc7e508b 159
gamezajad 0:ede9cc7e508b 160 if (_colon) {
gamezajad 0:ede9cc7e508b 161 _content[POSITION_COLON] |= 0x80;
gamezajad 0:ede9cc7e508b 162 }
gamezajad 0:ede9cc7e508b 163
gamezajad 0:ede9cc7e508b 164 start();
gamezajad 0:ede9cc7e508b 165 send(ADDR_AUTO);
gamezajad 0:ede9cc7e508b 166 stop();
gamezajad 0:ede9cc7e508b 167 start();
gamezajad 0:ede9cc7e508b 168 send(0xC0);
gamezajad 0:ede9cc7e508b 169 for (uint8_t i = 0; i < 4; i++) {
gamezajad 0:ede9cc7e508b 170 send(_content[i]);
gamezajad 0:ede9cc7e508b 171 }
gamezajad 0:ede9cc7e508b 172 stop();
gamezajad 0:ede9cc7e508b 173
gamezajad 0:ede9cc7e508b 174 if (_off) {
gamezajad 0:ede9cc7e508b 175 _off = 0;
gamezajad 0:ede9cc7e508b 176 start();
gamezajad 0:ede9cc7e508b 177 send(0x88 | _brightness);
gamezajad 0:ede9cc7e508b 178 stop();
gamezajad 0:ede9cc7e508b 179 }
gamezajad 0:ede9cc7e508b 180 }
gamezajad 0:ede9cc7e508b 181
gamezajad 0:ede9cc7e508b 182 void DigitDisplay::write(uint8_t position, uint8_t number)
gamezajad 0:ede9cc7e508b 183 {
gamezajad 0:ede9cc7e508b 184 if (position >= 4) {
gamezajad 0:ede9cc7e508b 185 return;
gamezajad 0:ede9cc7e508b 186 }
gamezajad 0:ede9cc7e508b 187
gamezajad 0:ede9cc7e508b 188 uint8_t segments = conv(number);
gamezajad 0:ede9cc7e508b 189
gamezajad 0:ede9cc7e508b 190 if ((position == POSITION_COLON) && _colon) {
gamezajad 0:ede9cc7e508b 191 segments |= 0x80;
gamezajad 0:ede9cc7e508b 192 }
gamezajad 0:ede9cc7e508b 193
gamezajad 0:ede9cc7e508b 194 _content[position] = segments;
gamezajad 0:ede9cc7e508b 195
gamezajad 0:ede9cc7e508b 196 start();
gamezajad 0:ede9cc7e508b 197 send(ADDR_FIXED);
gamezajad 0:ede9cc7e508b 198 stop();
gamezajad 0:ede9cc7e508b 199 start();
gamezajad 0:ede9cc7e508b 200 send(0xC0 | position);
gamezajad 0:ede9cc7e508b 201 send(segments);
gamezajad 0:ede9cc7e508b 202 stop();
gamezajad 0:ede9cc7e508b 203
gamezajad 0:ede9cc7e508b 204 if (_off) {
gamezajad 0:ede9cc7e508b 205 _off = 0;
gamezajad 0:ede9cc7e508b 206 start();
gamezajad 0:ede9cc7e508b 207 send(0x88 | _brightness);
gamezajad 0:ede9cc7e508b 208 stop();
gamezajad 0:ede9cc7e508b 209 }
gamezajad 0:ede9cc7e508b 210 }
gamezajad 0:ede9cc7e508b 211
gamezajad 0:ede9cc7e508b 212 void DigitDisplay::writeRaw(uint8_t segments[])
gamezajad 0:ede9cc7e508b 213 {
gamezajad 0:ede9cc7e508b 214 for (uint8_t i = 0; i < 4; i++) {
gamezajad 0:ede9cc7e508b 215 _content[i] = segments[i];
gamezajad 0:ede9cc7e508b 216 }
gamezajad 0:ede9cc7e508b 217
gamezajad 0:ede9cc7e508b 218 start();
gamezajad 0:ede9cc7e508b 219 send(ADDR_AUTO);
gamezajad 0:ede9cc7e508b 220 stop();
gamezajad 0:ede9cc7e508b 221 start();
gamezajad 0:ede9cc7e508b 222 send(0xC0);
gamezajad 0:ede9cc7e508b 223 for (uint8_t i = 0; i < 4; i++) {
gamezajad 0:ede9cc7e508b 224 send(segments[i]);
gamezajad 0:ede9cc7e508b 225 }
gamezajad 0:ede9cc7e508b 226 stop();
gamezajad 0:ede9cc7e508b 227
gamezajad 0:ede9cc7e508b 228 if (_off) {
gamezajad 0:ede9cc7e508b 229 _off = 0;
gamezajad 0:ede9cc7e508b 230 start();
gamezajad 0:ede9cc7e508b 231 send(0x88 | _brightness);
gamezajad 0:ede9cc7e508b 232 stop();
gamezajad 0:ede9cc7e508b 233 }
gamezajad 0:ede9cc7e508b 234 }
gamezajad 0:ede9cc7e508b 235
gamezajad 0:ede9cc7e508b 236 void DigitDisplay::writeRaw(uint8_t position, uint8_t segments)
gamezajad 0:ede9cc7e508b 237 {
gamezajad 0:ede9cc7e508b 238 if (position >= 4) {
gamezajad 0:ede9cc7e508b 239 return;
gamezajad 0:ede9cc7e508b 240 }
gamezajad 0:ede9cc7e508b 241
gamezajad 0:ede9cc7e508b 242 _content[position] = segments;
gamezajad 0:ede9cc7e508b 243
gamezajad 0:ede9cc7e508b 244 start();
gamezajad 0:ede9cc7e508b 245 send(ADDR_FIXED);
gamezajad 0:ede9cc7e508b 246 stop();
gamezajad 0:ede9cc7e508b 247 start();
gamezajad 0:ede9cc7e508b 248 send(0xC0 | position);
gamezajad 0:ede9cc7e508b 249 send(segments);
gamezajad 0:ede9cc7e508b 250 stop();
gamezajad 0:ede9cc7e508b 251
gamezajad 0:ede9cc7e508b 252 if (_off) {
gamezajad 0:ede9cc7e508b 253 _off = 0;
gamezajad 0:ede9cc7e508b 254 start();
gamezajad 0:ede9cc7e508b 255 send(0x88 | _brightness);
gamezajad 0:ede9cc7e508b 256 stop();
gamezajad 0:ede9cc7e508b 257 }
gamezajad 0:ede9cc7e508b 258 }
gamezajad 0:ede9cc7e508b 259
gamezajad 0:ede9cc7e508b 260 void DigitDisplay::clear()
gamezajad 0:ede9cc7e508b 261 {
gamezajad 0:ede9cc7e508b 262 for (uint8_t i = 0; i < 4; i++) {
gamezajad 0:ede9cc7e508b 263 _content[i] = DIGIT_NULL;
gamezajad 0:ede9cc7e508b 264 }
gamezajad 0:ede9cc7e508b 265 _colon = false;
gamezajad 0:ede9cc7e508b 266
gamezajad 0:ede9cc7e508b 267 writeRaw(0, DIGIT_NULL);
gamezajad 0:ede9cc7e508b 268 writeRaw(1, DIGIT_NULL);
gamezajad 0:ede9cc7e508b 269 writeRaw(2, DIGIT_NULL);
gamezajad 0:ede9cc7e508b 270 writeRaw(3, DIGIT_NULL);
gamezajad 0:ede9cc7e508b 271 }
gamezajad 0:ede9cc7e508b 272
gamezajad 0:ede9cc7e508b 273 void DigitDisplay::start()
gamezajad 0:ede9cc7e508b 274 {
gamezajad 0:ede9cc7e508b 275 _clk = 1;
gamezajad 0:ede9cc7e508b 276 _dio = 1;
gamezajad 0:ede9cc7e508b 277 _dio = 0;
gamezajad 0:ede9cc7e508b 278 _clk = 0;
gamezajad 0:ede9cc7e508b 279 }
gamezajad 0:ede9cc7e508b 280
gamezajad 0:ede9cc7e508b 281 bool DigitDisplay::send(uint8_t data)
gamezajad 0:ede9cc7e508b 282 {
gamezajad 0:ede9cc7e508b 283 for (uint8_t i = 0; i < 8; i++) {
gamezajad 0:ede9cc7e508b 284 _clk = 0;
gamezajad 0:ede9cc7e508b 285 _dio = data & 1;
gamezajad 0:ede9cc7e508b 286 data >>= 1;
gamezajad 0:ede9cc7e508b 287 _clk = 1;
gamezajad 0:ede9cc7e508b 288 }
gamezajad 0:ede9cc7e508b 289
gamezajad 0:ede9cc7e508b 290 // check ack
gamezajad 0:ede9cc7e508b 291 _clk = 0;
gamezajad 0:ede9cc7e508b 292 _dio = 1;
gamezajad 0:ede9cc7e508b 293 _clk = 1;
gamezajad 0:ede9cc7e508b 294 _dio.input();
gamezajad 0:ede9cc7e508b 295
gamezajad 0:ede9cc7e508b 296 uint16_t count = 0;
gamezajad 0:ede9cc7e508b 297 while (_dio) {
gamezajad 0:ede9cc7e508b 298 count++;
gamezajad 0:ede9cc7e508b 299 if (count >= 200) {
gamezajad 0:ede9cc7e508b 300 _dio.output();
gamezajad 0:ede9cc7e508b 301 return false;
gamezajad 0:ede9cc7e508b 302 }
gamezajad 0:ede9cc7e508b 303 }
gamezajad 0:ede9cc7e508b 304
gamezajad 0:ede9cc7e508b 305 _dio.output();
gamezajad 0:ede9cc7e508b 306 return true;
gamezajad 0:ede9cc7e508b 307 }
gamezajad 0:ede9cc7e508b 308
gamezajad 0:ede9cc7e508b 309 void DigitDisplay::stop()
gamezajad 0:ede9cc7e508b 310 {
gamezajad 0:ede9cc7e508b 311 _clk = 0;
gamezajad 0:ede9cc7e508b 312 _dio = 0;
gamezajad 0:ede9cc7e508b 313 _clk = 1;
gamezajad 0:ede9cc7e508b 314 _dio = 1;
gamezajad 0:ede9cc7e508b 315 }
gamezajad 0:ede9cc7e508b 316
gamezajad 0:ede9cc7e508b 317