mbed demo and driver of 14 segment 4 digit Starburst LED display

Dependencies:   mbed

Committer:
wim
Date:
Thu Nov 10 19:29:32 2011 +0000
Revision:
0:85a63648158b
First release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
wim 0:85a63648158b 1 /* Starburst - display driver for 14 segment starburst display
wim 0:85a63648158b 2 *
wim 0:85a63648158b 3 * Copyright (c) 2011 Wim Huiskamp
wim 0:85a63648158b 4 *
wim 0:85a63648158b 5 * Released under the MIT License: http://mbed.org/license/mit
wim 0:85a63648158b 6 *
wim 0:85a63648158b 7 * version 0.2 Initial Release
wim 0:85a63648158b 8 */
wim 0:85a63648158b 9 #include "mbed.h"
wim 0:85a63648158b 10 #include "starburst.h"
wim 0:85a63648158b 11
wim 0:85a63648158b 12 /*****************************************************************************/
wim 0:85a63648158b 13 /********************* DEFINITIONS FOR STARBURST ***************************/
wim 0:85a63648158b 14 /*****************************************************************************/
wim 0:85a63648158b 15
wim 0:85a63648158b 16 // Definitions
wim 0:85a63648158b 17 const char digit_select[STAR_NR_DIGITS] = {0x01, 0x02, 0x04, 0x08}; //digit select
wim 0:85a63648158b 18 const char char_segm[STAR_NR_CHARS][2] = {
wim 0:85a63648158b 19 {0x00, 0x00}, // space (32)
wim 0:85a63648158b 20 {0x06, 0x00}, // !
wim 0:85a63648158b 21 {0x22, 0x00}, // "
wim 0:85a63648158b 22 {0xC7, 0x12}, // #
wim 0:85a63648158b 23
wim 0:85a63648158b 24 {0xED, 0x12}, // $
wim 0:85a63648158b 25 {0x24, 0x24}, // %
wim 0:85a63648158b 26 {0x5D, 0x0B}, // &
wim 0:85a63648158b 27 {0x02, 0x00}, // '
wim 0:85a63648158b 28
wim 0:85a63648158b 29 {0x39, 0x00}, // (
wim 0:85a63648158b 30 {0x0F, 0x00}, // )
wim 0:85a63648158b 31 {0xC0, 0x3F}, // *
wim 0:85a63648158b 32 {0xC0, 0x12}, // +
wim 0:85a63648158b 33
wim 0:85a63648158b 34 {0x04, 0x00}, // ,
wim 0:85a63648158b 35 {0xC0, 0x00}, // -
wim 0:85a63648158b 36 {0x04, 0x00}, // .
wim 0:85a63648158b 37 {0x00, 0x24}, // /
wim 0:85a63648158b 38
wim 0:85a63648158b 39 {0x3F, 0x24}, // 0
wim 0:85a63648158b 40 {0x06, 0x00}, // 1
wim 0:85a63648158b 41 {0xDB, 0x00}, // 2
wim 0:85a63648158b 42 {0xCF, 0x00}, // 3
wim 0:85a63648158b 43
wim 0:85a63648158b 44 {0xE6, 0x00}, // 4
wim 0:85a63648158b 45 {0xED, 0x00}, // 5
wim 0:85a63648158b 46 {0xFD, 0x00}, // 6
wim 0:85a63648158b 47 {0x07, 0x00}, // 7
wim 0:85a63648158b 48
wim 0:85a63648158b 49 {0xFF, 0x00}, // 8
wim 0:85a63648158b 50 {0xEF, 0x00}, // 9
wim 0:85a63648158b 51
wim 0:85a63648158b 52 {0x00, 0x00}, // :
wim 0:85a63648158b 53 {0x00, 0x00}, // ;
wim 0:85a63648158b 54 {0x00, 0x0C}, // <
wim 0:85a63648158b 55 {0xC8, 0x00}, // =
wim 0:85a63648158b 56 {0x00, 0x21}, // >
wim 0:85a63648158b 57 {0x83, 0x10}, // ?
wim 0:85a63648158b 58 {0xDF, 0x00}, // @ (64)
wim 0:85a63648158b 59
wim 0:85a63648158b 60 {0xF7, 0x00}, // A (65)
wim 0:85a63648158b 61 {0xCF, 0x12}, // B
wim 0:85a63648158b 62 {0x39, 0x00}, // C
wim 0:85a63648158b 63 {0x0F, 0x12}, // D
wim 0:85a63648158b 64
wim 0:85a63648158b 65 {0xF9, 0x00}, // E
wim 0:85a63648158b 66 {0xF1, 0x00}, // F
wim 0:85a63648158b 67 {0xBD, 0x00}, // G
wim 0:85a63648158b 68 {0xF6, 0x00}, // H
wim 0:85a63648158b 69
wim 0:85a63648158b 70 {0x09, 0x12}, // I
wim 0:85a63648158b 71 {0x1E, 0x00}, // J
wim 0:85a63648158b 72 {0x70, 0x0C}, // K
wim 0:85a63648158b 73 {0x38, 0x00}, // L
wim 0:85a63648158b 74
wim 0:85a63648158b 75 {0x36, 0x05}, // M
wim 0:85a63648158b 76 {0x36, 0x09}, // N
wim 0:85a63648158b 77 {0x3F, 0x00}, // O
wim 0:85a63648158b 78 {0xF3, 0x00}, // P
wim 0:85a63648158b 79
wim 0:85a63648158b 80 {0x3F, 0x08}, // Q
wim 0:85a63648158b 81 {0xF3, 0x08}, // R
wim 0:85a63648158b 82 {0xED, 0x00}, // S
wim 0:85a63648158b 83 {0x01, 0x12}, // T
wim 0:85a63648158b 84
wim 0:85a63648158b 85 {0x3E, 0x00}, // U
wim 0:85a63648158b 86 {0x30, 0x24}, // V
wim 0:85a63648158b 87 {0x36, 0x28}, // W
wim 0:85a63648158b 88 {0x00, 0x2D}, // X
wim 0:85a63648158b 89
wim 0:85a63648158b 90 {0x00, 0x15}, // Y
wim 0:85a63648158b 91 {0x09, 0x24}, // Z (90)
wim 0:85a63648158b 92
wim 0:85a63648158b 93 {0x39, 0x00}, // [
wim 0:85a63648158b 94 {0x00, 0x09}, // '\'
wim 0:85a63648158b 95 {0x0F, 0x00}, // ]
wim 0:85a63648158b 96 {0x00, 0x28}, // ^
wim 0:85a63648158b 97 {0x08, 0x00}, // _
wim 0:85a63648158b 98 {0x00, 0x01}, // '
wim 0:85a63648158b 99
wim 0:85a63648158b 100 {0xF7, 0x00}, // A replacing a
wim 0:85a63648158b 101 {0xCF, 0x12}, // B
wim 0:85a63648158b 102 {0x39, 0x00}, // C
wim 0:85a63648158b 103 {0x0F, 0x12}, // D
wim 0:85a63648158b 104
wim 0:85a63648158b 105 {0xF9, 0x00}, // E
wim 0:85a63648158b 106 {0xF1, 0x00}, // F
wim 0:85a63648158b 107 {0xBD, 0x00}, // G
wim 0:85a63648158b 108 {0xF6, 0x00}, // H
wim 0:85a63648158b 109
wim 0:85a63648158b 110 {0x09, 0x12}, // I
wim 0:85a63648158b 111 {0x1E, 0x00}, // J
wim 0:85a63648158b 112 {0x70, 0x0C}, // K
wim 0:85a63648158b 113 {0x38, 0x00}, // L
wim 0:85a63648158b 114
wim 0:85a63648158b 115 {0x36, 0x05}, // M
wim 0:85a63648158b 116 {0x36, 0x09}, // N
wim 0:85a63648158b 117 {0x3F, 0x00}, // O
wim 0:85a63648158b 118 {0xF3, 0x00}, // P
wim 0:85a63648158b 119
wim 0:85a63648158b 120 {0x3F, 0x08}, // Q
wim 0:85a63648158b 121 {0xF3, 0x08}, // R
wim 0:85a63648158b 122 {0xED, 0x00}, // S
wim 0:85a63648158b 123 {0x01, 0x12}, // T
wim 0:85a63648158b 124
wim 0:85a63648158b 125 {0x3E, 0x00}, // U
wim 0:85a63648158b 126 {0x30, 0x24}, // V
wim 0:85a63648158b 127 {0x36, 0x28}, // W
wim 0:85a63648158b 128 {0x00, 0x2D}, // X
wim 0:85a63648158b 129
wim 0:85a63648158b 130 {0x00, 0x15}, // Y
wim 0:85a63648158b 131 {0x09, 0x24}, // Z replacing z
wim 0:85a63648158b 132
wim 0:85a63648158b 133 {0x39, 0x00}, // {
wim 0:85a63648158b 134 {0x00, 0x12}, // |
wim 0:85a63648158b 135 {0x0F, 0x00}, // }
wim 0:85a63648158b 136 {0xD2, 0x00}, // ~
wim 0:85a63648158b 137 {0x00, 0x00}}; // DEL (127)
wim 0:85a63648158b 138
wim 0:85a63648158b 139 /** Create a starburst object connected to the proper SPI pins
wim 0:85a63648158b 140 *
wim 0:85a63648158b 141 * @param Pinname mosi, miso, sck, ce to connect to
wim 0:85a63648158b 142 * @brief
wim 0:85a63648158b 143 */
wim 0:85a63648158b 144 Starburst::Starburst(SPI &spi, PinName CE, PinName nOE) : _spi(spi), _ShiftLatch(CE), _nOE(nOE) {
wim 0:85a63648158b 145 _init();
wim 0:85a63648158b 146 }
wim 0:85a63648158b 147
wim 0:85a63648158b 148 /** Display ASCII character at selected cursor location
wim 0:85a63648158b 149 *
wim 0:85a63648158b 150 * @param int location cursor location, valid range is 0 - NR_DIGITS
wim 0:85a63648158b 151 * @param char byte to display, valid range is (char) 32 - (char) 127
wim 0:85a63648158b 152 * @brief
wim 0:85a63648158b 153 */
wim 0:85a63648158b 154 void Starburst::putc(int location, char byte) {
wim 0:85a63648158b 155 int charcode = (int) byte;
wim 0:85a63648158b 156
wim 0:85a63648158b 157 // Check valid range
wim 0:85a63648158b 158 if ((charcode < STAR_CHR_MIN) | (charcode > STAR_CHR_MAX)) {
wim 0:85a63648158b 159 charcode = 0;
wim 0:85a63648158b 160 }
wim 0:85a63648158b 161 else {
wim 0:85a63648158b 162 charcode = charcode - STAR_CHR_MIN;
wim 0:85a63648158b 163 };
wim 0:85a63648158b 164
wim 0:85a63648158b 165 // Check valid range
wim 0:85a63648158b 166 if ((location < 0) | (location > (STAR_NR_DIGITS-1))) {
wim 0:85a63648158b 167 location = 0;
wim 0:85a63648158b 168 };
wim 0:85a63648158b 169
wim 0:85a63648158b 170 // Lookup segmentcode for the character and store in digit's location while protecting the symbol bits
wim 0:85a63648158b 171 _digit_segments[location][1] = (_digit_segments[location][1] & SYM_MSK) | char_segm[charcode][1]; //segments H-N, LEDs
wim 0:85a63648158b 172 _digit_segments[location][0] = char_segm[charcode][0]; //segments A-G2
wim 0:85a63648158b 173 }
wim 0:85a63648158b 174
wim 0:85a63648158b 175
wim 0:85a63648158b 176
wim 0:85a63648158b 177 /*---------------------------------------------------------------------------*\
wim 0:85a63648158b 178 |
wim 0:85a63648158b 179 | Function: putc
wim 0:85a63648158b 180 |
wim 0:85a63648158b 181 | Description: Displays specified character on the display at current
wim 0:85a63648158b 182 | cursor position. Increments cursor.
wim 0:85a63648158b 183 | Position on the display (0 to 3, Leftmost = 0)
wim 0:85a63648158b 184 |
wim 0:85a63648158b 185 | Parameters: disp_char - single character to display
wim 0:85a63648158b 186 | - ASCII characters: 128 values between 0-127
wim 0:85a63648158b 187 | - UDC character, 15 possible UDC values from 128-142 (not supported yet)
wim 0:85a63648158b 188 |
wim 0:85a63648158b 189 | Returns: Nothing
wim 0:85a63648158b 190 |
wim 0:85a63648158b 191 \*---------------------------------------------------------------------------*/
wim 0:85a63648158b 192 void Starburst::putc(char disp_char) {
wim 0:85a63648158b 193
wim 0:85a63648158b 194 // Write selected character to display at current position
wim 0:85a63648158b 195 putc(_column, disp_char);
wim 0:85a63648158b 196
wim 0:85a63648158b 197 // Incr and wrap around cursorposition
wim 0:85a63648158b 198 _column++;
wim 0:85a63648158b 199 _column = _column % STAR_NR_DIGITS;
wim 0:85a63648158b 200 }
wim 0:85a63648158b 201
wim 0:85a63648158b 202 /** Display colon symbol
wim 0:85a63648158b 203 *
wim 0:85a63648158b 204 * @param bool dp colon on or off
wim 0:85a63648158b 205 * @brief
wim 0:85a63648158b 206 */
wim 0:85a63648158b 207 void Starburst::set_dp(bool dp) {
wim 0:85a63648158b 208
wim 0:85a63648158b 209 if (dp) {
wim 0:85a63648158b 210 _digit_segments[DP_IDX][1] = (_digit_segments[DP_IDX][1] & ~DP_MSK) | DP_ON;
wim 0:85a63648158b 211 }
wim 0:85a63648158b 212 else {
wim 0:85a63648158b 213 _digit_segments[DP_IDX][1] = (_digit_segments[DP_IDX][1] & ~DP_MSK);
wim 0:85a63648158b 214 };
wim 0:85a63648158b 215 }
wim 0:85a63648158b 216
wim 0:85a63648158b 217 /** Display LED symbol
wim 0:85a63648158b 218 *
wim 0:85a63648158b 219 * @param bool led LED on or off
wim 0:85a63648158b 220 * @brief
wim 0:85a63648158b 221 */
wim 0:85a63648158b 222 void Starburst::set_led(bool led) {
wim 0:85a63648158b 223
wim 0:85a63648158b 224 if (led) {
wim 0:85a63648158b 225 _digit_segments[D3_IDX][1] = (_digit_segments[D3_IDX][1] & ~D3_MSK) | D3_ON;
wim 0:85a63648158b 226 }
wim 0:85a63648158b 227 else {
wim 0:85a63648158b 228 _digit_segments[D3_IDX][1] = (_digit_segments[D3_IDX][1] & ~D3_MSK);
wim 0:85a63648158b 229 };
wim 0:85a63648158b 230 }
wim 0:85a63648158b 231
wim 0:85a63648158b 232
wim 0:85a63648158b 233 /** Display Bi-Color LED symbol
wim 0:85a63648158b 234 *
wim 0:85a63648158b 235 * @param int Bicolor LED off, Red, Green or Yellow
wim 0:85a63648158b 236 * @brief
wim 0:85a63648158b 237 */
wim 0:85a63648158b 238 void Starburst::set_bi_led(BiLED bi_led) {
wim 0:85a63648158b 239
wim 0:85a63648158b 240 switch (bi_led) {
wim 0:85a63648158b 241 case BI_OFF:
wim 0:85a63648158b 242 _digit_segments[D1_IDX][1] = (_digit_segments[D1_IDX][1] & ~D1_MSK);
wim 0:85a63648158b 243 break;
wim 0:85a63648158b 244 case BI_RED:
wim 0:85a63648158b 245 _digit_segments[D1_IDX][1] = (_digit_segments[D1_IDX][1] & ~D1_MSK) | D1_RED;
wim 0:85a63648158b 246 break;
wim 0:85a63648158b 247 case BI_GRN:
wim 0:85a63648158b 248 _digit_segments[D1_IDX][1] = (_digit_segments[D1_IDX][1] & ~D1_MSK) | D1_GRN;
wim 0:85a63648158b 249 break;
wim 0:85a63648158b 250 case BI_YEL:
wim 0:85a63648158b 251 _digit_segments[D1_IDX][1] = (_digit_segments[D1_IDX][1] & ~D1_MSK) | D1_YEL;
wim 0:85a63648158b 252 break;
wim 0:85a63648158b 253 };
wim 0:85a63648158b 254 }
wim 0:85a63648158b 255
wim 0:85a63648158b 256 /*---------------------------------------------------------------------------*\
wim 0:85a63648158b 257 |
wim 0:85a63648158b 258 | Function: printf
wim 0:85a63648158b 259 |
wim 0:85a63648158b 260 | Description: Displays specified string on the display at current
wim 0:85a63648158b 261 | cursor position. Increments cursor.
wim 0:85a63648158b 262 | Max stringlen is 64 chars.
wim 0:85a63648158b 263 |
wim 0:85a63648158b 264 | Parameters: format - format string
wim 0:85a63648158b 265 | args - data
wim 0:85a63648158b 266 |
wim 0:85a63648158b 267 | Returns: Nothing
wim 0:85a63648158b 268 |
wim 0:85a63648158b 269 \*---------------------------------------------------------------------------*/
wim 0:85a63648158b 270 void Starburst::printf (char * format, ...) {
wim 0:85a63648158b 271 char display_string[64];
wim 0:85a63648158b 272 int rv, string_len, i;
wim 0:85a63648158b 273 va_list args;
wim 0:85a63648158b 274 va_start (args, format);
wim 0:85a63648158b 275
wim 0:85a63648158b 276 rv=vsprintf (display_string, format, args);
wim 0:85a63648158b 277 va_end (args);
wim 0:85a63648158b 278 // printf("printing:'%s'\n", display_string);
wim 0:85a63648158b 279
wim 0:85a63648158b 280 // loop round, writing characters
wim 0:85a63648158b 281 string_len = strlen(display_string); // obtain length of string
wim 0:85a63648158b 282 for (i = 0; i < string_len; i++) {
wim 0:85a63648158b 283 putc(display_string[i]);
wim 0:85a63648158b 284 };
wim 0:85a63648158b 285
wim 0:85a63648158b 286 // return rv;
wim 0:85a63648158b 287 }
wim 0:85a63648158b 288
wim 0:85a63648158b 289
wim 0:85a63648158b 290
wim 0:85a63648158b 291 /*---------------------------------------------------------------------------*\
wim 0:85a63648158b 292 |
wim 0:85a63648158b 293 | Function: _scroll_printf
wim 0:85a63648158b 294 |
wim 0:85a63648158b 295 | Description: Stores specified string in the scroll buffer.
wim 0:85a63648158b 296 | The string will be automatically displayed in a scrolling fashion.
wim 0:85a63648158b 297 | Max stringlen is 64 chars.
wim 0:85a63648158b 298 |
wim 0:85a63648158b 299 | Parameters: format - format string
wim 0:85a63648158b 300 | args - data
wim 0:85a63648158b 301 |
wim 0:85a63648158b 302 | Returns: Nothing
wim 0:85a63648158b 303 |
wim 0:85a63648158b 304 \*---------------------------------------------------------------------------*/
wim 0:85a63648158b 305 void Starburst::scroll_printf (char * format, ...) {
wim 0:85a63648158b 306 int rv;
wim 0:85a63648158b 307 va_list args;
wim 0:85a63648158b 308 va_start (args, format);
wim 0:85a63648158b 309
wim 0:85a63648158b 310 rv=vsprintf (_scroll_display_string, format, args);
wim 0:85a63648158b 311 va_end (args);
wim 0:85a63648158b 312 // printf("printing:'%s'\n", _scroll_display_string);
wim 0:85a63648158b 313
wim 0:85a63648158b 314 // _scroll_string_len = rv; // obtain length of string
wim 0:85a63648158b 315 _scroll_string_len = strlen(_scroll_display_string); // obtain length of string
wim 0:85a63648158b 316
wim 0:85a63648158b 317 // _scroll = (_scroll_string_len != 0);
wim 0:85a63648158b 318 _scroll = false; // Initially scroll is disabled
wim 0:85a63648158b 319 _scroll_ptr = 0;
wim 0:85a63648158b 320
wim 0:85a63648158b 321 // return rv;
wim 0:85a63648158b 322 }
wim 0:85a63648158b 323
wim 0:85a63648158b 324
wim 0:85a63648158b 325 /*---------------------------------------------------------------------------*\
wim 0:85a63648158b 326 |
wim 0:85a63648158b 327 | Function: locate
wim 0:85a63648158b 328 |
wim 0:85a63648158b 329 | Description: Set the cursor address where the next character will be written.
wim 0:85a63648158b 330 |
wim 0:85a63648158b 331 | Parameters: Cursor Column address
wim 0:85a63648158b 332 |
wim 0:85a63648158b 333 | Returns: Nothing
wim 0:85a63648158b 334 |
wim 0:85a63648158b 335 \*---------------------------------------------------------------------------*/
wim 0:85a63648158b 336 void Starburst::locate(uint8_t column) {
wim 0:85a63648158b 337
wim 0:85a63648158b 338 // _row = row % STAR_NR_ROWS;
wim 0:85a63648158b 339 _column = column % STAR_NR_DIGITS;
wim 0:85a63648158b 340 }
wim 0:85a63648158b 341
wim 0:85a63648158b 342
wim 0:85a63648158b 343
wim 0:85a63648158b 344 /*---------------------------------------------------------------------------*\
wim 0:85a63648158b 345 |
wim 0:85a63648158b 346 | Function: cls
wim 0:85a63648158b 347 |
wim 0:85a63648158b 348 | Description: Clears the displayed data and flash RAM, but not the user
wim 0:85a63648158b 349 | defined characters.
wim 0:85a63648158b 350 |
wim 0:85a63648158b 351 | Parameters: None
wim 0:85a63648158b 352 |
wim 0:85a63648158b 353 | Returns: Nothing
wim 0:85a63648158b 354 |
wim 0:85a63648158b 355 \*---------------------------------------------------------------------------*/
wim 0:85a63648158b 356 void Starburst::cls(void) {
wim 0:85a63648158b 357 int location;
wim 0:85a63648158b 358
wim 0:85a63648158b 359 for (location=0; location<STAR_NR_DIGITS; location++)
wim 0:85a63648158b 360 putc(location, ' ');
wim 0:85a63648158b 361
wim 0:85a63648158b 362 // Reset cursor
wim 0:85a63648158b 363 locate(0);
wim 0:85a63648158b 364 }
wim 0:85a63648158b 365
wim 0:85a63648158b 366 /** Activate Blinking Display
wim 0:85a63648158b 367 *
wim 0:85a63648158b 368 * @param bool enable Blink on or off
wim 0:85a63648158b 369 * @brief
wim 0:85a63648158b 370 */
wim 0:85a63648158b 371 void Starburst::set_blink_mode(bool enable) {
wim 0:85a63648158b 372 _blink = enable;
wim 0:85a63648158b 373 }
wim 0:85a63648158b 374
wim 0:85a63648158b 375
wim 0:85a63648158b 376 /** Activate Scrolling Display
wim 0:85a63648158b 377 *
wim 0:85a63648158b 378 * @param bool enable Scroll On or Off
wim 0:85a63648158b 379 * @brief
wim 0:85a63648158b 380 */
wim 0:85a63648158b 381 void Starburst::set_scroll_mode(bool enable) {
wim 0:85a63648158b 382
wim 0:85a63648158b 383 if (enable) {
wim 0:85a63648158b 384 // Scroll only when a scroll string is available
wim 0:85a63648158b 385 _scroll = (_scroll_string_len != 0);
wim 0:85a63648158b 386 }
wim 0:85a63648158b 387 else {
wim 0:85a63648158b 388 _scroll = false;
wim 0:85a63648158b 389 }
wim 0:85a63648158b 390
wim 0:85a63648158b 391 // Init starting idx in scroll string
wim 0:85a63648158b 392 _scroll_ptr = 0;
wim 0:85a63648158b 393 }
wim 0:85a63648158b 394
wim 0:85a63648158b 395
wim 0:85a63648158b 396
wim 0:85a63648158b 397
wim 0:85a63648158b 398 /** Multiplex Call to activate next digit, Called by timer interrupt at 75Hz per digit
wim 0:85a63648158b 399 *
wim 0:85a63648158b 400 * @param
wim 0:85a63648158b 401 * @brief
wim 0:85a63648158b 402 */
wim 0:85a63648158b 403 void Starburst::_mpx_digits() {
wim 0:85a63648158b 404 static int digit_idx = 0;
wim 0:85a63648158b 405
wim 0:85a63648158b 406 // Select the device by setting chip select low
wim 0:85a63648158b 407 _ShiftLatch = 0;
wim 0:85a63648158b 408
wim 0:85a63648158b 409 if (_blink) {
wim 0:85a63648158b 410 // Blink activated
wim 0:85a63648158b 411 if (_blinkstate) {
wim 0:85a63648158b 412 // Data visible, Send data
wim 0:85a63648158b 413 _spi.write( digit_select[digit_idx]); //digit select
wim 0:85a63648158b 414 _spi.write(_digit_segments[digit_idx][1]); //segments H-N, LEDs
wim 0:85a63648158b 415 _spi.write(_digit_segments[digit_idx][0]); //segments A-G2
wim 0:85a63648158b 416 }
wim 0:85a63648158b 417 else {
wim 0:85a63648158b 418 // Data blanked, Send cleared digits
wim 0:85a63648158b 419 _spi.write( digit_select[digit_idx]); //digit select
wim 0:85a63648158b 420 _spi.write(_digit_segments[digit_idx][1] & SYM_MSK); //segments H-N, LEDs
wim 0:85a63648158b 421 _spi.write(0x00); //segments A-G2
wim 0:85a63648158b 422 }
wim 0:85a63648158b 423 }
wim 0:85a63648158b 424 else {
wim 0:85a63648158b 425 // Blink not activated
wim 0:85a63648158b 426 // Send data
wim 0:85a63648158b 427 _spi.write( digit_select[digit_idx]); //digit select
wim 0:85a63648158b 428 _spi.write(_digit_segments[digit_idx][1]); //segments H-N, LEDs
wim 0:85a63648158b 429 _spi.write(_digit_segments[digit_idx][0]); //segments A-G2
wim 0:85a63648158b 430 }
wim 0:85a63648158b 431
wim 0:85a63648158b 432 // latch the value in the device
wim 0:85a63648158b 433 _ShiftLatch = 1;
wim 0:85a63648158b 434
wim 0:85a63648158b 435 digit_idx++;
wim 0:85a63648158b 436 if (digit_idx==STAR_NR_DIGITS) digit_idx=0;
wim 0:85a63648158b 437 }
wim 0:85a63648158b 438
wim 0:85a63648158b 439
wim 0:85a63648158b 440 /** Attach Multiplex Call to timer interrupt
wim 0:85a63648158b 441 *
wim 0:85a63648158b 442 * @param
wim 0:85a63648158b 443 * @brief
wim 0:85a63648158b 444 */
wim 0:85a63648158b 445 void Starburst::_mpx_start() {
wim 0:85a63648158b 446 _mpx.attach(this, &Starburst::_mpx_digits, 0.013 / STAR_NR_DIGITS); // Update each digit at 75 Hz
wim 0:85a63648158b 447 }
wim 0:85a63648158b 448
wim 0:85a63648158b 449
wim 0:85a63648158b 450 /** Blinker Call to toggle _blinkstate, Called by timer interrupt at 2 Hz
wim 0:85a63648158b 451 *
wim 0:85a63648158b 452 * @param
wim 0:85a63648158b 453 * @brief
wim 0:85a63648158b 454 */
wim 0:85a63648158b 455 void Starburst::_blink_tick() {
wim 0:85a63648158b 456 _blinkstate = !_blinkstate;
wim 0:85a63648158b 457
wim 0:85a63648158b 458 }
wim 0:85a63648158b 459
wim 0:85a63648158b 460
wim 0:85a63648158b 461 /** Attach Blink Call to timer interrupt
wim 0:85a63648158b 462 *
wim 0:85a63648158b 463 * @param
wim 0:85a63648158b 464 * @brief
wim 0:85a63648158b 465 */
wim 0:85a63648158b 466 void Starburst::_blink_start() {
wim 0:85a63648158b 467 _blnk.attach(this, &Starburst::_blink_tick, 0.25); // Blink at 2 Hz
wim 0:85a63648158b 468 }
wim 0:85a63648158b 469
wim 0:85a63648158b 470
wim 0:85a63648158b 471 /** Scroll Call to scroll display text, Called by timer interrupt at 2 Hz
wim 0:85a63648158b 472 *
wim 0:85a63648158b 473 * @param
wim 0:85a63648158b 474 * @brief
wim 0:85a63648158b 475 */
wim 0:85a63648158b 476 void Starburst::_scroll_tick() {
wim 0:85a63648158b 477 int tmp_ptr, idx;
wim 0:85a63648158b 478
wim 0:85a63648158b 479 // scroll text
wim 0:85a63648158b 480 if (_scroll) {
wim 0:85a63648158b 481 tmp_ptr = _scroll_ptr;
wim 0:85a63648158b 482
wim 0:85a63648158b 483 // write next set of characters in display
wim 0:85a63648158b 484 for (idx = 0; idx < STAR_NR_DIGITS; idx++) {
wim 0:85a63648158b 485 putc(idx, _scroll_display_string[tmp_ptr]); // write next char in display
wim 0:85a63648158b 486
wim 0:85a63648158b 487 tmp_ptr++; // incr the ptr, wrap around if needed
wim 0:85a63648158b 488 tmp_ptr = tmp_ptr % _scroll_string_len;
wim 0:85a63648158b 489 };
wim 0:85a63648158b 490
wim 0:85a63648158b 491 //WRONG
wim 0:85a63648158b 492 // _scroll_ptr = _scroll_ptr++ % _scroll_string_len; // incr start idx in scroll string for next time
wim 0:85a63648158b 493
wim 0:85a63648158b 494 //WRONG
wim 0:85a63648158b 495 // _scroll_ptr = (_scroll_ptr++) % _scroll_string_len; // incr start idx in scroll string for next time
wim 0:85a63648158b 496
wim 0:85a63648158b 497 //OK
wim 0:85a63648158b 498 _scroll_ptr++;
wim 0:85a63648158b 499 _scroll_ptr = _scroll_ptr % _scroll_string_len; // incr start idx in scroll string for next time
wim 0:85a63648158b 500
wim 0:85a63648158b 501
wim 0:85a63648158b 502 //OK
wim 0:85a63648158b 503 // _scroll_ptr = (_scroll_ptr + 1) % _scroll_string_len; // incr start idx in scroll string for next time
wim 0:85a63648158b 504 }
wim 0:85a63648158b 505
wim 0:85a63648158b 506 }
wim 0:85a63648158b 507
wim 0:85a63648158b 508
wim 0:85a63648158b 509 /** Attach Scroll Call to timer interrupt
wim 0:85a63648158b 510 *
wim 0:85a63648158b 511 * @param
wim 0:85a63648158b 512 * @brief
wim 0:85a63648158b 513 */
wim 0:85a63648158b 514 void Starburst::_scroll_start() {
wim 0:85a63648158b 515 // _scrl.attach(this, &Starburst::_scroll_tick, 0.75); // Scroll at 1.5 Hz
wim 0:85a63648158b 516 _scrl.attach(this, &Starburst::_scroll_tick, 0.5); // Scroll at 2 Hz
wim 0:85a63648158b 517 }
wim 0:85a63648158b 518
wim 0:85a63648158b 519
wim 0:85a63648158b 520
wim 0:85a63648158b 521 void Starburst::_init() {
wim 0:85a63648158b 522
wim 0:85a63648158b 523 // Disable Display
wim 0:85a63648158b 524 _nOE = 1;
wim 0:85a63648158b 525 _ShiftLatch = 1;
wim 0:85a63648158b 526
wim 0:85a63648158b 527 // Setup the spi for 8 bit data, low steady state clock,
wim 0:85a63648158b 528 // rising edge capture, with a 1MHz clock rate
wim 0:85a63648158b 529 _spi.format(8,0);
wim 0:85a63648158b 530 _spi.frequency(500000);
wim 0:85a63648158b 531 // _spi.frequency(1000000);
wim 0:85a63648158b 532
wim 0:85a63648158b 533 // Select the device by setting chip select low
wim 0:85a63648158b 534 _ShiftLatch = 0;
wim 0:85a63648158b 535
wim 0:85a63648158b 536 // Send data to Clear all
wim 0:85a63648158b 537 _spi.write(0x00); //digit select
wim 0:85a63648158b 538 _spi.write(0x00); //segments H-N, LEDs
wim 0:85a63648158b 539 _spi.write(0x00); //segments A-G2
wim 0:85a63648158b 540
wim 0:85a63648158b 541 // Latch the value in the device
wim 0:85a63648158b 542 _ShiftLatch = 1;
wim 0:85a63648158b 543
wim 0:85a63648158b 544 _blink=false; // Blink display
wim 0:85a63648158b 545 _blinkstate=false;
wim 0:85a63648158b 546
wim 0:85a63648158b 547 // _flash=false; // Flash digit
wim 0:85a63648158b 548
wim 0:85a63648158b 549 //Enable display
wim 0:85a63648158b 550 _nOE = 0;
wim 0:85a63648158b 551
wim 0:85a63648158b 552
wim 0:85a63648158b 553 // Clear display
wim 0:85a63648158b 554 cls();
wim 0:85a63648158b 555 // Reset cursor
wim 0:85a63648158b 556 locate(0);
wim 0:85a63648158b 557
wim 0:85a63648158b 558 //Enable blinking timer
wim 0:85a63648158b 559 _blink_start();
wim 0:85a63648158b 560
wim 0:85a63648158b 561 //Enable scroll timer
wim 0:85a63648158b 562 _scroll_start();
wim 0:85a63648158b 563
wim 0:85a63648158b 564 //Enable multiplexing timer
wim 0:85a63648158b 565 _mpx_start();
wim 0:85a63648158b 566 }
wim 0:85a63648158b 567
wim 0:85a63648158b 568
wim 0:85a63648158b 569 /*****************************************************************************/
wim 0:85a63648158b 570 /****************************** END OF FILE ********************************/
wim 0:85a63648158b 571 /*****************************************************************************/