6 x 7 segment display library for PCA9637 driven breakout board

Dependents:   FTSE100 InternetDispBoB digitalThermometer Counter ... more

dispBoB.cpp

Committer:
d_worrall
Date:
2011-06-29
Revision:
6:1721cdf1024e
Parent:
0:843654413849
Child:
7:adcfb0f5e4de

File content as of revision 6:1721cdf1024e:

//NXP PCA9635 library
//mbed Team     -   28th June 2011
//Daniel Worrall

#include "mbed.h"
#include "PCA9635.h"
#include "dispBoB.h"

Serial pc(USBTX, USBRX);

    static const char _loc[] = {0x02, 0x02, 0x04, 0x04, 0x10, 0x10, 0x12, 0x12}; 
    static const short _dispL[] = {
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x1008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0002, 0xC006, 0x600C, 0x0000, 0x0000, 0x0000, 0x0001, 0x0000, 0x0000,
    0xE00E, 0x2008, 0xC00D, 0x600D, 0x200B, 0x6007, 0xE007, 0x200E, 0xE00F, 0x600F, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    
    0x0000, 0xF001, 0xE003, 0xC001, 0xE009, 0xC007, 0x8007, 0x600F, 0xA003, 0x8000, 0x6008, 0xA007, 0x3008, 0xA005, 0xA001, 0xE001,
    0x800F, 0x300F, 0x8001, 0x6007, 0xC003, 0xE000, 0xE000, 0xE004, 0xA00B, 0x600B, 0xC00D, 0xC006, 0x0000, 0x600C, 0x0000, 0x4000,
    0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xC006, 0x0000, 0x600C, 0x0000, 0x0000
    };
    static const short _dispR[] = {
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0020, 0x0C60, 0x06C0, 0x0000, 0x0000, 0x0000, 0x0010, 0x0000, 0x0000,
    0x0EE0, 0x0280, 0x0CD0, 0x06D0, 0x02B0, 0x0670, 0x0E70, 0x02E0, 0x0EF0, 0x06F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    
    0x0000, 0x0F10, 0x0E30, 0x0C10, 0x0E90, 0x0C70, 0x0870, 0x06F0, 0x0A30, 0x0800, 0x0680, 0x0A70, 0x0380, 0x0A50, 0x0A10, 0x0E10,
    0x08F0, 0x03F0, 0x0810, 0x0670, 0x0C30, 0x0E00, 0x0E00, 0x0E40, 0x0AB0, 0x06B0, 0x0CD0, 0x0C60, 0x0000, 0x06C0, 0x0000, 0x0400,
    0x0100, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
    0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0000, 0x06C0, 0x0000, 0x0000
    };
    short _element[8];
    short _pair[4];
    string nullArray = "      ";

dispBoB::dispBoB(PinName sda, PinName scl, PinName en): _pca(sda, scl), _en(en) {
    _en = 0;
    _pca.init(_loc[5]);
}

void dispBoB::cls(void){
    for(int j = 0; j < 8; j++){
        locate(j);
        _pca.bus(0x0000);
    }
    _cursor = 0x10;
}

void dispBoB::locate(char pos){
    _pca.setAddress(_loc[pos]);
    _cursor = pos;
}

void dispBoB::putc(char c){
    
    if(_cursor & 1){
        _element[_cursor] = _dispR[c];
    } else {
        _element[_cursor] = _dispL[c];
    }
    
    int i = _cursor/2;
    _pair[i] = _element[(2*i)] + _element[(2*i)+1];
    _pca.bus(_pair[i]); 
}

void dispBoB::putc(char c, char pos){

    locate(pos);
    
    if(_cursor & 1){
    _element[_cursor] = _dispR[c];
    } else {
    _element[_cursor] = _dispL[c];
    } 
    
    int i = _cursor/2;
    _pair[i] = _element[(2*i)] + _element[(2*i)+1];
    _pca.bus(_pair[i]); 
}

void dispBoB::write(string str){ 
    for(int j = 5; j >= 0; j--){
        putc(toupper(str[j]), j);
    }
}

void dispBoB::scroll(string str, float speed){
    char buffer[6];

    str.insert(0, nullArray);
    str.insert(str.length(), nullArray);
    
    for(int k = 0; k < str.length(); k++){
        str.copy(buffer, 6, k);
        write(buffer);
        wait(speed);
    }
}