another clone

Dependents:   AwesomeAlarm_BLE

Committer:
yungsung
Date:
Thu Jan 09 19:18:37 2020 +0000
Revision:
2:2a21c0342751
Parent:
1:cae630b12d63
First commit almost done

Who changed what in which revision?

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