7segment SPI LED module from DF Robot.com
Spi7Seg.cpp@0:f0806724e7c9, 2015-01-30 (annotated)
- Committer:
- morecat_lab
- Date:
- Fri Jan 30 21:05:27 2015 +0000
- Revision:
- 0:f0806724e7c9
- Child:
- 1:fcb72bd26532
1st publish
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
morecat_lab | 0:f0806724e7c9 | 1 | /* |
morecat_lab | 0:f0806724e7c9 | 2 | Spi7Seg.h - mbed library for Serial seven segment LED driver. |
morecat_lab | 0:f0806724e7c9 | 3 | This library is for Serial-in pararel-out shift register (HC595) and 7 Segiemnt LED module |
morecat_lab | 0:f0806724e7c9 | 4 | Copyright 20154 by morecat_lab |
morecat_lab | 0:f0806724e7c9 | 5 | |
morecat_lab | 0:f0806724e7c9 | 6 | This library is distributed in the hope that it will be useful, |
morecat_lab | 0:f0806724e7c9 | 7 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
morecat_lab | 0:f0806724e7c9 | 8 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
morecat_lab | 0:f0806724e7c9 | 9 | */ |
morecat_lab | 0:f0806724e7c9 | 10 | |
morecat_lab | 0:f0806724e7c9 | 11 | #include <Timer.h> |
morecat_lab | 0:f0806724e7c9 | 12 | #include "Spi7Seg.h" |
morecat_lab | 0:f0806724e7c9 | 13 | |
morecat_lab | 0:f0806724e7c9 | 14 | const int Spi7Seg::numConv[] = { |
morecat_lab | 0:f0806724e7c9 | 15 | NUM_PAT_0, NUM_PAT_1, NUM_PAT_2, NUM_PAT_3, |
morecat_lab | 0:f0806724e7c9 | 16 | NUM_PAT_4, NUM_PAT_5, NUM_PAT_6, NUM_PAT_7, |
morecat_lab | 0:f0806724e7c9 | 17 | NUM_PAT_8, NUM_PAT_9, NUM_PAT_A, NUM_PAT_B, |
morecat_lab | 0:f0806724e7c9 | 18 | NUM_PAT_C, NUM_PAT_D, NUM_PAT_E, NUM_PAT_F}; |
morecat_lab | 0:f0806724e7c9 | 19 | |
morecat_lab | 0:f0806724e7c9 | 20 | // 8 digit |
morecat_lab | 0:f0806724e7c9 | 21 | Spi7Seg::Spi7Seg(PinName data,PinName clock, PinName ratch) : |
morecat_lab | 0:f0806724e7c9 | 22 | _dataPin(data), _clockPin(clock), _ratchPin(ratch) { |
morecat_lab | 0:f0806724e7c9 | 23 | _numOfDigs = 8; |
morecat_lab | 0:f0806724e7c9 | 24 | _dataPin = 0; |
morecat_lab | 0:f0806724e7c9 | 25 | _clockPin = 1; |
morecat_lab | 0:f0806724e7c9 | 26 | _ratchPin = 1; |
morecat_lab | 0:f0806724e7c9 | 27 | } |
morecat_lab | 0:f0806724e7c9 | 28 | |
morecat_lab | 0:f0806724e7c9 | 29 | void Spi7Seg::begin(void) { |
morecat_lab | 0:f0806724e7c9 | 30 | clear(); |
morecat_lab | 0:f0806724e7c9 | 31 | } |
morecat_lab | 0:f0806724e7c9 | 32 | |
morecat_lab | 0:f0806724e7c9 | 33 | char Spi7Seg::segCh(char i) { |
morecat_lab | 0:f0806724e7c9 | 34 | return Spi7Seg::numConv[i]; |
morecat_lab | 0:f0806724e7c9 | 35 | } |
morecat_lab | 0:f0806724e7c9 | 36 | |
morecat_lab | 0:f0806724e7c9 | 37 | void Spi7Seg::setDot(int d) { |
morecat_lab | 0:f0806724e7c9 | 38 | _buffer[d] &= 0x7f; // P <- 0 |
morecat_lab | 0:f0806724e7c9 | 39 | } |
morecat_lab | 0:f0806724e7c9 | 40 | |
morecat_lab | 0:f0806724e7c9 | 41 | void Spi7Seg::clearDot(int d) { |
morecat_lab | 0:f0806724e7c9 | 42 | _buffer[d] |= 0x80; // P <- 1 |
morecat_lab | 0:f0806724e7c9 | 43 | } |
morecat_lab | 0:f0806724e7c9 | 44 | |
morecat_lab | 0:f0806724e7c9 | 45 | void Spi7Seg::writeNum(long n) { |
morecat_lab | 0:f0806724e7c9 | 46 | _buffer[0] = segCh((n % 100000000) / 10000000); |
morecat_lab | 0:f0806724e7c9 | 47 | _buffer[1] = segCh((n % 10000000) / 1000000); |
morecat_lab | 0:f0806724e7c9 | 48 | _buffer[2] = segCh((n % 1000000) / 100000); |
morecat_lab | 0:f0806724e7c9 | 49 | _buffer[3] = segCh((n % 100000) / 10000); |
morecat_lab | 0:f0806724e7c9 | 50 | _buffer[4] = segCh((n % 10000) / 1000); |
morecat_lab | 0:f0806724e7c9 | 51 | _buffer[5] = segCh((n % 1000) / 100); |
morecat_lab | 0:f0806724e7c9 | 52 | _buffer[6] = segCh((n % 100) / 10); |
morecat_lab | 0:f0806724e7c9 | 53 | _buffer[7] = segCh(n % 10); |
morecat_lab | 0:f0806724e7c9 | 54 | Spi7Seg::supressZero(); |
morecat_lab | 0:f0806724e7c9 | 55 | } |
morecat_lab | 0:f0806724e7c9 | 56 | |
morecat_lab | 0:f0806724e7c9 | 57 | void Spi7Seg::writeNum(char d1, char d2, char d3, char d4, |
morecat_lab | 0:f0806724e7c9 | 58 | char d5, char d6, char d7, char d8) |
morecat_lab | 0:f0806724e7c9 | 59 | { |
morecat_lab | 0:f0806724e7c9 | 60 | _buffer[0] = segCh(d1); |
morecat_lab | 0:f0806724e7c9 | 61 | _buffer[1] = segCh(d2); |
morecat_lab | 0:f0806724e7c9 | 62 | _buffer[2] = segCh(d3); |
morecat_lab | 0:f0806724e7c9 | 63 | _buffer[3] = segCh(d4); |
morecat_lab | 0:f0806724e7c9 | 64 | _buffer[4] = segCh(d5); |
morecat_lab | 0:f0806724e7c9 | 65 | _buffer[5] = segCh(d6); |
morecat_lab | 0:f0806724e7c9 | 66 | _buffer[6] = segCh(d7); |
morecat_lab | 0:f0806724e7c9 | 67 | _buffer[7] = segCh(d8); |
morecat_lab | 0:f0806724e7c9 | 68 | Spi7Seg::supressZero(); |
morecat_lab | 0:f0806724e7c9 | 69 | } |
morecat_lab | 0:f0806724e7c9 | 70 | |
morecat_lab | 0:f0806724e7c9 | 71 | void Spi7Seg::writeHex(long n) { |
morecat_lab | 0:f0806724e7c9 | 72 | _buffer[0] = segCh((n >> 28) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 73 | _buffer[1] = segCh((n >> 24) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 74 | _buffer[2] = segCh((n >> 20) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 75 | _buffer[3] = segCh((n >> 16) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 76 | _buffer[4] = segCh((n >> 12) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 77 | _buffer[5] = segCh((n >> 8) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 78 | _buffer[6] = segCh((n >> 4) & 0xf); |
morecat_lab | 0:f0806724e7c9 | 79 | _buffer[7] = segCh(n & 0xf); |
morecat_lab | 0:f0806724e7c9 | 80 | Spi7Seg::supressZero(); |
morecat_lab | 0:f0806724e7c9 | 81 | } |
morecat_lab | 0:f0806724e7c9 | 82 | |
morecat_lab | 0:f0806724e7c9 | 83 | void Spi7Seg::setZeroSupress(bool t) { |
morecat_lab | 0:f0806724e7c9 | 84 | _zeroSupress = t; |
morecat_lab | 0:f0806724e7c9 | 85 | } |
morecat_lab | 0:f0806724e7c9 | 86 | |
morecat_lab | 0:f0806724e7c9 | 87 | void Spi7Seg::supressZero() { |
morecat_lab | 0:f0806724e7c9 | 88 | if (_zeroSupress ) { |
morecat_lab | 0:f0806724e7c9 | 89 | for (int i = 0 ; i < (_numOfDigs-1) ; i++) { |
morecat_lab | 0:f0806724e7c9 | 90 | if (_buffer[i] == segCh(0)) { |
morecat_lab | 0:f0806724e7c9 | 91 | _buffer[i] = _buffer[i] & 0x80; |
morecat_lab | 0:f0806724e7c9 | 92 | } else { |
morecat_lab | 0:f0806724e7c9 | 93 | break; |
morecat_lab | 0:f0806724e7c9 | 94 | } |
morecat_lab | 0:f0806724e7c9 | 95 | } |
morecat_lab | 0:f0806724e7c9 | 96 | } |
morecat_lab | 0:f0806724e7c9 | 97 | } |
morecat_lab | 0:f0806724e7c9 | 98 | |
morecat_lab | 0:f0806724e7c9 | 99 | |
morecat_lab | 0:f0806724e7c9 | 100 | void Spi7Seg::writeRawData(char d1, char d2, char d3, char d4, |
morecat_lab | 0:f0806724e7c9 | 101 | char d5, char d6, char d7, char d8) { |
morecat_lab | 0:f0806724e7c9 | 102 | _buffer[0] = d1; |
morecat_lab | 0:f0806724e7c9 | 103 | _buffer[1] = d2; |
morecat_lab | 0:f0806724e7c9 | 104 | _buffer[2] = d3; |
morecat_lab | 0:f0806724e7c9 | 105 | _buffer[3] = d4; |
morecat_lab | 0:f0806724e7c9 | 106 | _buffer[4] = d5; |
morecat_lab | 0:f0806724e7c9 | 107 | _buffer[5] = d6; |
morecat_lab | 0:f0806724e7c9 | 108 | _buffer[6] = d7; |
morecat_lab | 0:f0806724e7c9 | 109 | _buffer[7] = d8; |
morecat_lab | 0:f0806724e7c9 | 110 | } |
morecat_lab | 0:f0806724e7c9 | 111 | |
morecat_lab | 0:f0806724e7c9 | 112 | void Spi7Seg::write(uint8_t d, uint8_t value) { |
morecat_lab | 0:f0806724e7c9 | 113 | _buffer[d] = value; |
morecat_lab | 0:f0806724e7c9 | 114 | } |
morecat_lab | 0:f0806724e7c9 | 115 | |
morecat_lab | 0:f0806724e7c9 | 116 | void Spi7Seg::clear(void) { |
morecat_lab | 0:f0806724e7c9 | 117 | for (int i = 0; i < 8; i++){ |
morecat_lab | 0:f0806724e7c9 | 118 | _buffer[i] = 0; |
morecat_lab | 0:f0806724e7c9 | 119 | } |
morecat_lab | 0:f0806724e7c9 | 120 | } |
morecat_lab | 0:f0806724e7c9 | 121 | |
morecat_lab | 0:f0806724e7c9 | 122 | |
morecat_lab | 0:f0806724e7c9 | 123 | void Spi7Seg::update(void) { |
morecat_lab | 0:f0806724e7c9 | 124 | _ratchPin = 0; |
morecat_lab | 0:f0806724e7c9 | 125 | for (int col = _numOfDigs ; col >= 0 ; col--) { // reverse order |
morecat_lab | 0:f0806724e7c9 | 126 | for (int i = 7; i >= 0; i--) { |
morecat_lab | 0:f0806724e7c9 | 127 | _clockPin = 0; |
morecat_lab | 0:f0806724e7c9 | 128 | if(_buffer[col] & (1 << i)){ |
morecat_lab | 0:f0806724e7c9 | 129 | _dataPin = 1; |
morecat_lab | 0:f0806724e7c9 | 130 | } else { |
morecat_lab | 0:f0806724e7c9 | 131 | _dataPin = 0; |
morecat_lab | 0:f0806724e7c9 | 132 | } |
morecat_lab | 0:f0806724e7c9 | 133 | _clockPin = 1; |
morecat_lab | 0:f0806724e7c9 | 134 | _dataPin = 0; |
morecat_lab | 0:f0806724e7c9 | 135 | } |
morecat_lab | 0:f0806724e7c9 | 136 | } |
morecat_lab | 0:f0806724e7c9 | 137 | _ratchPin = 1; |
morecat_lab | 0:f0806724e7c9 | 138 | } |
morecat_lab | 0:f0806724e7c9 | 139 | |
morecat_lab | 0:f0806724e7c9 | 140 | void Spi7Seg::updateWithDelay(int ms) { |
morecat_lab | 0:f0806724e7c9 | 141 | timer.reset(); // to avoid overflow 32bit counter (~=30min) |
morecat_lab | 0:f0806724e7c9 | 142 | int start = timer.read_ms(); |
morecat_lab | 0:f0806724e7c9 | 143 | update(); |
morecat_lab | 0:f0806724e7c9 | 144 | do { |
morecat_lab | 0:f0806724e7c9 | 145 | ; |
morecat_lab | 0:f0806724e7c9 | 146 | } while((timer.read_ms() - start) < ms); |
morecat_lab | 0:f0806724e7c9 | 147 | } |
morecat_lab | 0:f0806724e7c9 | 148 | |
morecat_lab | 0:f0806724e7c9 | 149 | // EOF |