FRA221_2015 / Mbed 2 deprecated B3_ShutMeUp

Dependencies:   mbed

Fork of zProject_RTC_display_alarm by PuG

Committer:
Peeraya
Date:
Sat Dec 05 10:02:26 2015 +0000
Revision:
0:b2064b3558b6
Child:
1:ba7154d2d7ca
vv

Who changed what in which revision?

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