7 segment display library for mbed This routine support 2,4 and 8 digit anode-common or cathode-common LED.

Dependents:   7segMbed

Files at this revision

API Documentation at this revision

Comitter:
morecat_lab
Date:
Sun Jul 05 07:21:33 2015 +0000
Parent:
9:6d3229c8dc0f
Child:
11:8be75770e375
Commit message:
Change BusOut to DigitalOut[]

Changed in this revision

Sseg.cpp Show annotated file Show diff for this revision Revisions of this file
Sseg.h Show annotated file Show diff for this revision Revisions of this file
--- 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) {
--- a/Sseg.h	Mon Jan 12 08:18:59 2015 +0000
+++ b/Sseg.h	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
  
   based on Dots library.
   Copyright 2010 arms22. All right reserved.
@@ -41,8 +41,8 @@
 private:
     unsigned long _lastUpdateTime;
     int _updateInterval;
-    BusOut _segPins;
-    BusOut _digPins;
+    DigitalOut *_segPins[8];  // changed to use array
+    DigitalOut *_digPins[8];  // changed to use array
     char _buffer[8];
     int _numOfDigs;
     int _dig;       // support 4 or 8