7segment SPI LED module from DF Robot.com

Dependents:   spi7seg_test

Committer:
morecat_lab
Date:
Fri Jan 30 22:46:29 2015 +0000
Revision:
1:fcb72bd26532
Parent:
0:f0806724e7c9
Child:
2:27cc28619363
change font shape of 'C'

Who changed what in which revision?

UserRevisionLine numberNew 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 1:fcb72bd26532 27 _zeroSupress = 1;
morecat_lab 0:f0806724e7c9 28 }
morecat_lab 0:f0806724e7c9 29
morecat_lab 0:f0806724e7c9 30 void Spi7Seg::begin(void) {
morecat_lab 0:f0806724e7c9 31 clear();
morecat_lab 0:f0806724e7c9 32 }
morecat_lab 0:f0806724e7c9 33
morecat_lab 0:f0806724e7c9 34 char Spi7Seg::segCh(char i) {
morecat_lab 0:f0806724e7c9 35 return Spi7Seg::numConv[i];
morecat_lab 0:f0806724e7c9 36 }
morecat_lab 0:f0806724e7c9 37
morecat_lab 0:f0806724e7c9 38 void Spi7Seg::setDot(int d) {
morecat_lab 0:f0806724e7c9 39 _buffer[d] &= 0x7f; // P <- 0
morecat_lab 0:f0806724e7c9 40 }
morecat_lab 0:f0806724e7c9 41
morecat_lab 0:f0806724e7c9 42 void Spi7Seg::clearDot(int d) {
morecat_lab 0:f0806724e7c9 43 _buffer[d] |= 0x80; // P <- 1
morecat_lab 0:f0806724e7c9 44 }
morecat_lab 0:f0806724e7c9 45
morecat_lab 0:f0806724e7c9 46 void Spi7Seg::writeNum(long n) {
morecat_lab 0:f0806724e7c9 47 _buffer[0] = segCh((n % 100000000) / 10000000);
morecat_lab 0:f0806724e7c9 48 _buffer[1] = segCh((n % 10000000) / 1000000);
morecat_lab 0:f0806724e7c9 49 _buffer[2] = segCh((n % 1000000) / 100000);
morecat_lab 0:f0806724e7c9 50 _buffer[3] = segCh((n % 100000) / 10000);
morecat_lab 0:f0806724e7c9 51 _buffer[4] = segCh((n % 10000) / 1000);
morecat_lab 0:f0806724e7c9 52 _buffer[5] = segCh((n % 1000) / 100);
morecat_lab 0:f0806724e7c9 53 _buffer[6] = segCh((n % 100) / 10);
morecat_lab 0:f0806724e7c9 54 _buffer[7] = segCh(n % 10);
morecat_lab 0:f0806724e7c9 55 Spi7Seg::supressZero();
morecat_lab 0:f0806724e7c9 56 }
morecat_lab 0:f0806724e7c9 57
morecat_lab 0:f0806724e7c9 58 void Spi7Seg::writeNum(char d1, char d2, char d3, char d4,
morecat_lab 0:f0806724e7c9 59 char d5, char d6, char d7, char d8)
morecat_lab 0:f0806724e7c9 60 {
morecat_lab 0:f0806724e7c9 61 _buffer[0] = segCh(d1);
morecat_lab 0:f0806724e7c9 62 _buffer[1] = segCh(d2);
morecat_lab 0:f0806724e7c9 63 _buffer[2] = segCh(d3);
morecat_lab 0:f0806724e7c9 64 _buffer[3] = segCh(d4);
morecat_lab 0:f0806724e7c9 65 _buffer[4] = segCh(d5);
morecat_lab 0:f0806724e7c9 66 _buffer[5] = segCh(d6);
morecat_lab 0:f0806724e7c9 67 _buffer[6] = segCh(d7);
morecat_lab 0:f0806724e7c9 68 _buffer[7] = segCh(d8);
morecat_lab 0:f0806724e7c9 69 Spi7Seg::supressZero();
morecat_lab 0:f0806724e7c9 70 }
morecat_lab 0:f0806724e7c9 71
morecat_lab 0:f0806724e7c9 72 void Spi7Seg::writeHex(long n) {
morecat_lab 0:f0806724e7c9 73 _buffer[0] = segCh((n >> 28) & 0xf);
morecat_lab 0:f0806724e7c9 74 _buffer[1] = segCh((n >> 24) & 0xf);
morecat_lab 0:f0806724e7c9 75 _buffer[2] = segCh((n >> 20) & 0xf);
morecat_lab 0:f0806724e7c9 76 _buffer[3] = segCh((n >> 16) & 0xf);
morecat_lab 0:f0806724e7c9 77 _buffer[4] = segCh((n >> 12) & 0xf);
morecat_lab 0:f0806724e7c9 78 _buffer[5] = segCh((n >> 8) & 0xf);
morecat_lab 0:f0806724e7c9 79 _buffer[6] = segCh((n >> 4) & 0xf);
morecat_lab 0:f0806724e7c9 80 _buffer[7] = segCh(n & 0xf);
morecat_lab 0:f0806724e7c9 81 Spi7Seg::supressZero();
morecat_lab 0:f0806724e7c9 82 }
morecat_lab 0:f0806724e7c9 83
morecat_lab 0:f0806724e7c9 84 void Spi7Seg::setZeroSupress(bool t) {
morecat_lab 0:f0806724e7c9 85 _zeroSupress = t;
morecat_lab 0:f0806724e7c9 86 }
morecat_lab 0:f0806724e7c9 87
morecat_lab 0:f0806724e7c9 88 void Spi7Seg::supressZero() {
morecat_lab 0:f0806724e7c9 89 if (_zeroSupress ) {
morecat_lab 0:f0806724e7c9 90 for (int i = 0 ; i < (_numOfDigs-1) ; i++) {
morecat_lab 0:f0806724e7c9 91 if (_buffer[i] == segCh(0)) {
morecat_lab 1:fcb72bd26532 92 _buffer[i] |= 0x7f; // blank except dot
morecat_lab 0:f0806724e7c9 93 } else {
morecat_lab 0:f0806724e7c9 94 break;
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
morecat_lab 0:f0806724e7c9 101 void Spi7Seg::writeRawData(char d1, char d2, char d3, char d4,
morecat_lab 0:f0806724e7c9 102 char d5, char d6, char d7, char d8) {
morecat_lab 0:f0806724e7c9 103 _buffer[0] = d1;
morecat_lab 0:f0806724e7c9 104 _buffer[1] = d2;
morecat_lab 0:f0806724e7c9 105 _buffer[2] = d3;
morecat_lab 0:f0806724e7c9 106 _buffer[3] = d4;
morecat_lab 0:f0806724e7c9 107 _buffer[4] = d5;
morecat_lab 0:f0806724e7c9 108 _buffer[5] = d6;
morecat_lab 0:f0806724e7c9 109 _buffer[6] = d7;
morecat_lab 0:f0806724e7c9 110 _buffer[7] = d8;
morecat_lab 0:f0806724e7c9 111 }
morecat_lab 0:f0806724e7c9 112
morecat_lab 0:f0806724e7c9 113 void Spi7Seg::write(uint8_t d, uint8_t value) {
morecat_lab 0:f0806724e7c9 114 _buffer[d] = value;
morecat_lab 0:f0806724e7c9 115 }
morecat_lab 0:f0806724e7c9 116
morecat_lab 0:f0806724e7c9 117 void Spi7Seg::clear(void) {
morecat_lab 0:f0806724e7c9 118 for (int i = 0; i < 8; i++){
morecat_lab 0:f0806724e7c9 119 _buffer[i] = 0;
morecat_lab 0:f0806724e7c9 120 }
morecat_lab 0:f0806724e7c9 121 }
morecat_lab 0:f0806724e7c9 122
morecat_lab 0:f0806724e7c9 123
morecat_lab 0:f0806724e7c9 124 void Spi7Seg::update(void) {
morecat_lab 0:f0806724e7c9 125 _ratchPin = 0;
morecat_lab 0:f0806724e7c9 126 for (int col = _numOfDigs ; col >= 0 ; col--) { // reverse order
morecat_lab 0:f0806724e7c9 127 for (int i = 7; i >= 0; i--) {
morecat_lab 0:f0806724e7c9 128 _clockPin = 0;
morecat_lab 0:f0806724e7c9 129 if(_buffer[col] & (1 << i)){
morecat_lab 0:f0806724e7c9 130 _dataPin = 1;
morecat_lab 0:f0806724e7c9 131 } else {
morecat_lab 0:f0806724e7c9 132 _dataPin = 0;
morecat_lab 0:f0806724e7c9 133 }
morecat_lab 0:f0806724e7c9 134 _clockPin = 1;
morecat_lab 0:f0806724e7c9 135 _dataPin = 0;
morecat_lab 0:f0806724e7c9 136 }
morecat_lab 0:f0806724e7c9 137 }
morecat_lab 0:f0806724e7c9 138 _ratchPin = 1;
morecat_lab 0:f0806724e7c9 139 }
morecat_lab 0:f0806724e7c9 140
morecat_lab 0:f0806724e7c9 141 void Spi7Seg::updateWithDelay(int ms) {
morecat_lab 0:f0806724e7c9 142 timer.reset(); // to avoid overflow 32bit counter (~=30min)
morecat_lab 0:f0806724e7c9 143 int start = timer.read_ms();
morecat_lab 0:f0806724e7c9 144 update();
morecat_lab 0:f0806724e7c9 145 do {
morecat_lab 0:f0806724e7c9 146 ;
morecat_lab 0:f0806724e7c9 147 } while((timer.read_ms() - start) < ms);
morecat_lab 0:f0806724e7c9 148 }
morecat_lab 0:f0806724e7c9 149
morecat_lab 0:f0806724e7c9 150 // EOF