LPC1114FN28 drive 8x8 LED Matrix. http://jiwashin.blogspot.jp/2016/07/my-lpc1114-device-lose-before-game.html

Dependencies:   mbed-rtos mbed

main.cpp

Committer:
TareObjects
Date:
2015-06-27
Revision:
1:badc825f9c7e
Parent:
0:070e4cb87478
Child:
2:adfdb6828250

File content as of revision 1:badc825f9c7e:

#include "mbed.h"


void setPNumLeftAndRight();

void disableTicker();
void enableTicker();

void dynamicDriver();
void count();


char num0[] = {126,129,129,129,129,129,126,0};
char num1[] = {0,1,65,255,1,1,0,0};
char num2[] = {33,67,133,137,137,113,1,0};
char num3[] = {66,129,145,145,145,145,110,0};
char num4[] = {24,40,72,136,8,255,8,0};
char num5[] = {242,145,145,145,145,145,142,0};
char num6[] = {126,145,145,145,145,145,78,0};
char num7[] = {192,128,128,143,144,160,192,0};
char num8[] = {110,145,145,145,145,145,110,0};
char num9[] = {114,137,137,137,137,137,126,0};
char col[]   = {0, 0, 0, 36, 0, 0, 0, 0};
char space[] = {0, 0, 0, 0, 0, 0, 0, 0}; 

char *nums[] = {num0, num1, num2, num3, num4, num5, num6, num7, num8, num9};

//BusOut common(dp15,dp25,dp13,dp17, dp1,dp11, dp2);     // anode
//BusOut row(   dp18, dp4, dp6,dp14,dp10,dp16,dp26,dp28);     // casode
BusOut common( dp9,  dp2, dp11,  dp1, dp17, dp13, dp25, dp15);     // anode
BusOut row(   dp28, dp26, dp16, dp10, dp14,  dp6,  dp4, dp18);     // casode

I2CSlave slave(dp5, dp27);


Ticker frameRate;
Ticker dynamicRate;


char displayBuffer[100];
int nDisplayBuffer;
int  iDisplayBuffer = 0;
char *pNumLeft;     // 出力中の数字ビットパターン、左側
char *pNumRight;    // 出力中の数字ビットパターン、右側
int  iShift = 0;        // 0 - 7 ... 現在何ビットずれているか


void setPNumLeftAndRight() {
    char left  = displayBuffer[iDisplayBuffer];
    if (left == ' ') {
        pNumLeft = space;
    } else if (left == ':') {
        pNumLeft = col;
    } else {
        pNumLeft = nums[left  - '0'];
    }
    char right = (iDisplayBuffer+1 >= nDisplayBuffer) ? displayBuffer[0] : displayBuffer[iDisplayBuffer+1];
    if (right == ' ') {
        pNumRight = space;
    } else if (right == ':') {
        pNumRight = col;
    } else {
        pNumRight = nums[right - '0'];
    }
}


void count() {
    disableTicker();
    
    iShift++;
    if (iShift >= 8) {
        iShift = 0;
        
        iDisplayBuffer++;
        if (iDisplayBuffer >= nDisplayBuffer) {
            iDisplayBuffer = 0;
        }
        setPNumLeftAndRight();
    }

    enableTicker();
}


int iYoko = 0;
int pYoko = 1;


void dynamicDriver() {
    int i = iYoko + iShift;
    
    common = 0x00;
//    char rowData = (i < 8) ? iShift : iShift*16; 
//    char rowData = (i < 8) ? num0[iShift] : num1[iShift]; 
    char rowData = (i < 8) ? pNumLeft[i] : pNumRight[i % 8]; 
    row    = (~rowData) & 0x00ff;
    common = (pYoko)    & 0x00ff;
    iYoko++;
    pYoko *= 2;
    if (iYoko == 8) {
        iYoko = 0;
        pYoko = 1;
    }
}

void disableTicker() {
    frameRate.detach();
    dynamicRate.detach();
}

void enableTicker() {
    frameRate.attach(count, 0.05);
    dynamicRate.attach(dynamicDriver, 0.0001);
}


int main() {
    int deviceOffset = 4;
    slave.address(0x10 + deviceOffset);
    
    strcpy(displayBuffer, " :3: ");
    displayBuffer[2] = deviceOffset + '0';
    nDisplayBuffer = strlen(displayBuffer);
    
    iDisplayBuffer = 0;
    iShift         = 0;
    setPNumLeftAndRight();
    
    enableTicker();
    
    char buf[100];
    char *msg = "ok";
    
    while(1) {   
        int status = slave.receive();
        switch (status) {
            case I2CSlave::ReadAddressed:
                slave.write(msg, strlen(msg) + 1); // Includes null char
                break;
            
            case I2CSlave::WriteGeneral:
                disableTicker();
                if (slave.read(buf, 2)) {
                    int charPos  = buf[0] - '0' + deviceOffset;
                    int shiftPos = buf[1] - '1';
                    
                    if (charPos >= 0 && charPos < nDisplayBuffer) {
                        iDisplayBuffer = charPos;
                    }
                    if (shiftPos >= 0 && shiftPos < 8) {
                        iShift = shiftPos;
                    }
                }
                enableTicker();
                break;
            
            case I2CSlave::WriteAddressed:
                disableTicker();
                if (slave.read(buf, 10)) {
                    strcpy(displayBuffer, buf);
                    nDisplayBuffer = strlen(displayBuffer);
                    iDisplayBuffer = 0;
                    iShift = 0;
                    setPNumLeftAndRight();
                    slave.stop();
                }
                enableTicker();
                break;
                
            default: break;
         }
         
     }
}