Dynamic Lighting Lib. of 7Seg-LED (add DP) x4. Features: - Unified Anode/Cathode and NPN/PNP sw. - Non-use wait(); Useing Interrupt Timer. - Modulates Brightness with PWM. - Display Hex. - Using BusOut(s) of Digits(4) and Segments(8). - Sinmple Interface of Class.

LED7segX4.cpp

Committer:
AkinoriHashimoto
Date:
2018-04-11
Revision:
0:51d1da4a6b6a
Child:
1:e89aae394d29

File content as of revision 0:51d1da4a6b6a:

#include "LED7segX4.h"

LED7segX4::LED7segX4(BusOut &portDig, BusOut &portSeg)
    : _portDig(portDig), _portSeg(portSeg)
{
    return;
}

LED7segX4::~LED7segX4()
{
    return;   
}


void LED7segX4::init(bool revDig, bool revSeg, int timePeriod, int duty)
{
    for(int i= 0; i < 5; i++)
        _seg7[i]= NULL;

    init_def7seg();

    this->setReverse(revDig, revSeg);
    
    this->setPWM(timePeriod, duty);
    
    return;
}

void LED7segX4::setReverse(bool dig, bool seg)
{
    _revDig= dig;
    _revSeg= seg;
    
    return;
}


void LED7segX4::init_def7seg()
{
    _def7seg[0]= 0x3F;   // 0
    _def7seg[1]= 0x06;
    _def7seg[2]= 0x5B;
    _def7seg[3]= 0x4F;
    _def7seg[4]= 0x66;
    _def7seg[5]= 0x6D;
    _def7seg[6]= 0x7D;
    _def7seg[7]= 0x27;
    _def7seg[8]= 0x7F;
    _def7seg[9]= 0x67;   // 9
    _def7seg[10]= 0x77;  // A
    _def7seg[11]= 0x7C;  // b
    _def7seg[12]= 0x39;  // C
    _def7seg[13]= 0x5E;  // d
    _def7seg[14]= 0x79;  // E
    _def7seg[15]= 0x71;  // F
    _def7seg[16]= 0x00;
    
    return;
}

void LED7segX4::OnSet()
{
    static char tmp;
    
    if(++_currentDigit >= 4)
        _currentDigit= 0;
    
    // ** SELECT DIGIT.
    tmp= 0b1000 >> _currentDigit;
    if(_revDig)
        tmp ^= 0xff;
    _portDig = tmp;   // set BusOut
    
    
    // ** SET current PATTERN of 7SEG.
    tmp= _seg7[_currentDigit];      // 0-9, a-f, 16(NULL)
    tmp= _def7seg[tmp];             // ex. 6:0x7D
    
    // -- set DP
    if(_dp & (0b0001 << _currentDigit) )
        tmp |= 0x80;    // DP: b7
    
    if(_revSeg)
        tmp ^= 0xff;
    _portSeg= tmp;      // set Bus
    
    
    // *** Atach TimeOut for Modulated Brightness ***
    if(_dutySec != -1)
        timeout.attach(this, &LED7segX4::OffSet, _dutySec);
    
    return;
}

void LED7segX4::OffSet()
{
    static char tmp;
    
    tmp= 0b0000;
    if(_revDig)
        tmp ^= 0xff;
    _portDig = tmp;   // set BusOut
    
    tmp= 0x00;
    if(_revSeg)
        tmp= 0xff;
    _portSeg= tmp;      // set BusOut
    
    return;
}



// **********************************************
//          Public Interface Set Function
// **********************************************
void LED7segX4::set7seg(char chr[])
{
    // 0~3 REVERCE
    for(int i= 0; i < 4; i++)
        _seg7[i]= chr[3-i];
    
    return;
}

void LED7segX4::setDP(char chr)
{
    _dp= chr;
    return;
}

void LED7segX4::setPWM(int timePeriod, int duty)
{
    if(duty <= 0){
        ticker.detach();        // detach
        this->OffSet();
        return;
    }
    
    _dutySec= timePeriod* 1e-6* (duty / 100.0);
    if(duty >= 100)
        _dutySec= -1;

    ticker.attach(this, &LED7segX4::OnSet, timePeriod* 1e-6);
    
    return;
}


// EOF