7 segment display library for mbed This routine support 2,4 and 8 digit anode-common or cathode-common LED.
Diff: Sseg.cpp
- Revision:
- 10:1b8dbe52e5a8
- Parent:
- 9:6d3229c8dc0f
- Child:
- 11:8be75770e375
--- a/Sseg.cpp Mon Jan 12 08:18:59 2015 +0000 +++ b/Sseg.cpp Sun Jul 05 07:21:33 2015 +0000 @@ -1,6 +1,6 @@ /* Sseg.cpp - mbed library for 2/4/8 digit seven segment LED driver. - Copyright 2013,2014 by morecat_lab + Copyright 2013,2014,2015 by morecat_lab base on Dots library. Copyright 2010 arms22. All right reserved. @@ -22,10 +22,20 @@ // 2 digit Sseg::Sseg(PinName a,PinName b,PinName c,PinName d, PinName e,PinName f,PinName g,PinName dp, - PinName d1,PinName d2) : - _segPins( dp, g, f, e, d, c, b, a), _digPins(d1, d2) + PinName d1,PinName d2) { _numOfDigs = 2; + PinName segPins[8] = {a, b, c, d, e, f, g, dp}; + PinName digPins[2] = {d1, d2}; + + for (int i=0; i<8; i++) { + _segPins[i] = new DigitalOut(segPins[i]); + } + + for (int i=0; i<_numOfDigs; i++) { + _digPins[i] = new DigitalOut(digPins[i]); + } + _updateInterval = (8333 / 2); _zeroSupress = true; _kcommon = false; @@ -35,10 +45,19 @@ // 4 digit Sseg::Sseg(PinName a,PinName b,PinName c,PinName d, PinName e,PinName f,PinName g,PinName dp, - PinName d1,PinName d2,PinName d3,PinName d4) : - _segPins( dp, g, f, e, d, c, b, a), _digPins(d1, d2, d3, d4) + PinName d1,PinName d2,PinName d3,PinName d4) { _numOfDigs = 4; + PinName segPins[8] = {a, b, c, d, e, f, g, dp}; + PinName digPins[4] = {d1, d2, d3, d4}; + + for (int i=0; i<8; i++) { + _segPins[i] = new DigitalOut(segPins[i]); + } + + for (int i=0; i<_numOfDigs; i++) { + _digPins[i] = new DigitalOut(digPins[i]); + } _updateInterval = (8333 / 4); _zeroSupress = true; _kcommon = false; @@ -49,11 +68,19 @@ Sseg::Sseg(PinName a,PinName b,PinName c,PinName d, PinName e,PinName f,PinName g,PinName dp, PinName d1,PinName d2,PinName d3,PinName d4, - PinName d5,PinName d6,PinName d7,PinName d8) : - _segPins( dp, g, f, e, d, c, b, a), _digPins(d1, d2, d3, d4, d5, d6, d7, d8) + PinName d5,PinName d6,PinName d7,PinName d8) { _numOfDigs = 8; - _updateInterval = (8333 / 8); + PinName segPins[8] = {a, b, c, d, e, f, g, dp}; + PinName digPins[8] = {d1, d2, d3, d4, d5, d6, d7, d8}; + + for (int i=0; i<8; i++) { + _segPins[i] = new DigitalOut(segPins[i]); + } + + for (int i=0; i<_numOfDigs; i++) { + _digPins[i] = new DigitalOut(digPins[i]); + } _updateInterval = (8333 / 8); _zeroSupress = true; _kcommon = false; _sinkDriver = false; @@ -256,25 +283,27 @@ } void Sseg::turnOff(void) { - if ( _kcommon) { - _digPins = _digPins & (1 << _dig); // set LOW - } else { - _digPins = _digPins | (~(1 << _dig)); // set HIGH - } + _digPins[_dig] -> write((_kcommon == 0) ? 0 : 1); } void Sseg::turnOn(void) { - if ( _kcommon) { - _digPins = _digPins | (~(1 << _dig)); // set HIGH - } else { - _digPins = _digPins & (1 << _dig); // set LOW - } + _digPins[_dig] -> write((_kcommon == 0) ? 1 : 1); } void Sseg::updateSeg(void) { + char i,data,mask; if( (++_dig) >= _numOfDigs) _dig = 0; - _segPins = (( _kcommon) || (_sinkDriver)) ? _buffer[_dig] : ~_buffer[_dig]; + data = _buffer[_dig]; + mask = 0x80; + for(i=0;i<8;i++){ + if(data & mask){ + _segPins[i]->write((_kcommon == 0) ? 0 : 1); + }else{ + _segPins[i]->write((_kcommon == 0) ? 1 : 0); + } + mask >>= 1; + } } bool Sseg::update(void) {