LEDMatrixDisplay Program 文字ごとに色を変更できるように修正

Dependencies:   mbed

Fork of LEDMatrix_Master by en 129

main.cpp

Committer:
nameless129
Date:
2013-11-07
Revision:
3:5605bd4d6295
Parent:
2:402191724e28
Child:
4:70a1803901d1

File content as of revision 3:5605bd4d6295:

#pragma import __use_all_ctype

#include "mbed.h"
#include <string.h>
#include "kfont8.h"
#include "process_fonts.h"

unsigned char matrixdata[32];
SPI spi(p5, p6, p7); // mosi, miso, sclk 

BusOut bords(p15,p16,p17,p18,p19,p20);
Serial pc(USBTX, USBRX); // tx, rx

SPI spi2(p11, p12, p13); // mosi, miso, sclk
DigitalOut cs(p14);

#define DISPLAY_XSIZE   (96)
unsigned int ImageBuf[3][DISPLAY_XSIZE];//16*6
unsigned int ColerMap[3][DISPLAY_XSIZE];

void read_font(unsigned short code) {
    unsigned char  c1, c2, MSB,LSB;
    uint32_t Address, seq;

    // SJIS to kuten code conversion
    c1 = (code>>8);
    c2 = (code & 0xFF);
    seq = (c1<=159 ? c1-129 : c1-193)*188 + (c2<=126 ? c2-64 : c2-65);
    MSB = seq / 94 + 1;
    LSB = seq % 94 + 1;
    Address = 0;
        
    if(     MSB >=  1 && MSB <= 15 && LSB >= 1 && LSB <= 94)
        Address =( (MSB -  1) * 94 + (LSB - 1))*32;
    else if(MSB >= 16 && MSB <= 47 && LSB >= 1 && LSB <= 94)
        Address =( (MSB - 16) * 94 + (LSB - 1))*32 + 0x0AA40L;
    else if(MSB >= 48 && MSB <= 84 && LSB >= 1 && LSB <= 94)
        Address = ((MSB - 48) * 94 + (LSB - 1))*32 + 0x21CDFL;
    else if(MSB == 85 &&                LSB >= 1 && LSB <= 94)
        Address = ((MSB - 85) * 94 + (LSB - 1))*32 + 0x3C4A0L;
    else if(MSB >= 88 && MSB <= 89 && LSB >= 1 && LSB <= 94)
        Address = ((MSB - 88) * 94 + (LSB - 1))*32 + 0x3D060L;
    
    // Deselect the device
    cs = 1;

    // Setup the spi for 8 bit data, high steady state clock
    spi2.format(8,3);
    spi2.frequency(1000000); 
    
    // Select the device by seting chip select low
    cs = 0;
    spi2.write(0x03);    // Read data byte
    spi2.write(Address>>16 & 0xff);
    spi2.write(Address>>8 & 0xff);
    spi2.write(Address & 0xff);
    
    // Send a dummy byte to receive the contents of the WHOAMI register
    for(int i=0; i<32; i++)
    {
      matrixdata[i]=spi2.write(0x00);
    }

    // Deselect the device
    cs = 1;
}

void draw_kanji_15x16(int pos_x,unsigned char color)
{
    int i = 0;
    for(i=0;i<16;i++)
    {
        if( ((signed int)(15-i+pos_x) >= 0) && ((15-i+pos_x) <= (DISPLAY_XSIZE-1)) )
        {
            if(color == COLOR_G || color == COLOR_C || color == COLOR_Y || color == COLOR_W)
            {
                ImageBuf[0][15-i+pos_x] =  matrixdata[i];
                ImageBuf[0][15-i+pos_x] |= matrixdata[i+16]<<8;
            }
            if(color == COLOR_R || color == COLOR_Y || color == COLOR_M || color == COLOR_W)
            {
                ImageBuf[1][15-i+pos_x] =  matrixdata[i];
                ImageBuf[1][15-i+pos_x] |= matrixdata[i+16]<<8;
            }
            if(color == COLOR_B || color == COLOR_C || color == COLOR_M || color == COLOR_W)
            {
                ImageBuf[2][15-i+pos_x] =  matrixdata[i];
                ImageBuf[2][15-i+pos_x] |= matrixdata[i+16]<<8;
            }
        }
    }
}

unsigned int CountChar(char *str)
{
    unsigned char   f_SJISChar = 0;
    unsigned char   c = 0;
    unsigned int    CountChar = 0;

    c = *str;
    while(c != '\0')
    {
        //2バイト文字の判定
        if( ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)) && f_SJISChar != 1 )
        {
            f_SJISChar = 1;
        }
        else
        {
            f_SJISChar = 0;
            CountChar++;
        }
        str++;
        c = *str;
    }
    return CountChar;
}

void drawStr15x16(char *str ,int pos_x,unsigned char color)
{
    unsigned char   f_SJISChar = 0;
    unsigned char   c = 0;
    unsigned int    SJISChar = 0;
    unsigned int    CountChar = 0;

    c = *str;
    while(c != '\0')
    {
        //2バイト文字の判定
        if( ((0x81 <= c && c <= 0x9f) || (0xe0 <= c && c <= 0xfc)) && f_SJISChar != 1 )
        {
            SJISChar = c;
            f_SJISChar = 1;
        }
        else if(f_SJISChar == 1)
        {
            SJISChar = (SJISChar<<8) | c;
            f_SJISChar = 0;
            read_font(SJISChar);
            draw_kanji_15x16(pos_x-CountChar*16,color);
            CountChar++;
        }
        else  //ASCII文字
        {
            SJISChar = c;
            f_SJISChar = 0;
            read_font(SJISChar);
            draw_kanji_15x16(pos_x-CountChar*16,color);
            CountChar++;
        }
        str++;
        c = *str;
    }
}



void SPILineOut(unsigned char setLine)
{
    unsigned int data[3]={0};
    unsigned int i = 0;
    for(i=0;i<=5;i++)
    {
        data[0] |= ((ImageBuf[2][setLine]>>(15-i))&0x01) << (15-(3*i));
    }
    for(i=0;i<=4;i++)
    {
        data[0] |= ((ImageBuf[1][setLine]>>(15-i))&0x01) << (14-(3*i));
        data[0] |= ((ImageBuf[0][setLine]>>(15-i))&0x01) << (13-(3*i));
    }

    for(i=0;i<=5;i++)
    {
        data[1] |= ((ImageBuf[1][setLine]>>(10-i))&0x01) << (15-(3*i));
    }
    for(i=0;i<=4;i++)
    {
        data[1] |= ((ImageBuf[0][setLine]>>(10-i))&0x01) << (14-(3*i));
        data[1] |= ((ImageBuf[2][setLine]>>(9-i))&0x01) << (13-(3*i));
    }

    for(i=0;i<=5;i++)
    {
        data[2] |= ((ImageBuf[0][setLine]>>(5-i))&0x01) << (15-(3*i));
    }
    for(i=0;i<=4;i++)
    {
        data[2] |= ((ImageBuf[2][setLine]>>(4-i))&0x01) << (14-(3*i));
        data[2] |= ((ImageBuf[1][setLine]>>(4-i))&0x01) << (13-(3*i));
    }
    spi.write(data[0]);
    spi.write(data[1]);
    spi.write(data[2]);
}

void outBordData()
{
    unsigned char ch = 0,Max_ch=0;
    unsigned int i = 0;
    Max_ch = (DISPLAY_XSIZE-16)/16;
    for(ch=0;ch<=Max_ch;ch++)
    {
        wait_us(10);
        bords = 0x01 << ch;
        for(i=(ch*16);i<(ch*16+16);i++)
        {
            SPILineOut(i);
        }
    }
}

void bufLeftShift_Loop(void)
{
    signed int i = 0;
   
    for(i=(DISPLAY_XSIZE-1);i>=1;i--)
    {
        ImageBuf[0][i] = ImageBuf[0][i-1];
        ImageBuf[1][i] = ImageBuf[1][i-1];
        ImageBuf[2][i] = ImageBuf[2][i-1];
    }
    ImageBuf[0][0] = ImageBuf[0][(DISPLAY_XSIZE-1)];
    ImageBuf[1][0] = ImageBuf[1][(DISPLAY_XSIZE-1)];
    ImageBuf[2][0] = ImageBuf[2][(DISPLAY_XSIZE-1)];

}

void bufLeftShift(void)
{
    signed int i = 0;

    for(i=(DISPLAY_XSIZE-1);i>=1;i--)
    {
        ImageBuf[0][i] = ImageBuf[0][i-1];
        ImageBuf[1][i] = ImageBuf[1][i-1];
        ImageBuf[2][i] = ImageBuf[2][i-1];
    }
    ImageBuf[0][0] = 0;
    ImageBuf[1][0] = 0;
    ImageBuf[2][0] = 0;
}

void TestMode(void)
{
    unsigned char i = 0;
    
    for(i=0;i<16;i++)
    {
        ImageBuf[0][i] = 0xffff;
    }
    for(i=16;i<16+16;i++)
    {
        ImageBuf[1][i] = 0xffff;
    }
    for(i=32;i<32+16;i++)
    {
        ImageBuf[2][i] = 0xffff;
    }

    outBordData();
    
    while(1)
    {
        wait(0.1);
        bufLeftShift_Loop();
        outBordData();
    }
}

void SetRandamColer(void)
{
    unsigned char color = 0;
    unsigned int i=0,j=0;

    memset(ColerMap,0,sizeof(ColerMap));
    for(j=0;j<DISPLAY_XSIZE;j++)
    {
        for(i=0;i<16;i++)
        {
            color = rand()%7;
            if(color == COLOR_G || color == COLOR_C || color == COLOR_Y || color == COLOR_W)
            {
                ColerMap[0][j] |= 1<<i;
            }
            if(color == COLOR_R || color == COLOR_Y || color == COLOR_M || color == COLOR_W)
            {
                ColerMap[1][j] |= 1<<i;
            }
            if(color == COLOR_B || color == COLOR_C || color == COLOR_M || color == COLOR_W)
            {
                ColerMap[2][j] |= 1<<i;
            }
        }
    }
}

unsigned char ConvHue(unsigned char num)
{
    unsigned char Hue[7] = {COLOR_G,COLOR_C,COLOR_B,COLOR_M,COLOR_R,COLOR_Y,COLOR_W};
    return Hue[num];
    
}

void SetRainbowColer(void)
{
    unsigned char color = 0;
    unsigned int j=0;

    memset(ColerMap,0,sizeof(ColerMap));
    for(j=0;j<DISPLAY_XSIZE;j++)
    {
        color = ConvHue((++color)%7);
        
        if(color == COLOR_G || color == COLOR_C || color == COLOR_Y || color == COLOR_W)
        {
            ColerMap[0][j] |= 0xffff;
        }
        if(color == COLOR_R || color == COLOR_Y || color == COLOR_M || color == COLOR_W)
        {
            ColerMap[1][j] |= 0xffff;
        }
        if(color == COLOR_B || color == COLOR_C || color == COLOR_M || color == COLOR_W)
        {
            ColerMap[2][j] |= 0xffff;
        }
    }
}


void ApplyColerMap(void)
{
    unsigned i = 0;
    for(i=0;i<DISPLAY_XSIZE;i++)
    {
        ImageBuf[0][i] = ImageBuf[0][i]&ColerMap[0][i];
        ImageBuf[1][i] = ImageBuf[1][i]&ColerMap[1][i];
        ImageBuf[2][i] = ImageBuf[2][i]&ColerMap[2][i];
    }
}


int main()
{
    unsigned char f_mode = 0;
    unsigned int i = 0;
    unsigned char coler = 0;
    char tmpstr[100];
    unsigned int cnt_tmpstr = 0;
    char strs[100]={0x82,0x6C,0x82,0x81,0x82,0x8B,0x82,0x85,0x82,0x65,0x82,0x81,0x82,0x89,0x82,0x92,
        0x82,0x73,0x82,0x8F,0x82,0x8B,0x82,0x99,0x82,0x8F,0x82,0x51,0x82,0x4F,0x82,0x50,0x82,0x52,0x00};
    spi.format(16,1);
    spi.frequency(1000000);

    memset(tmpstr,0,sizeof(tmpstr));

    memset(ImageBuf,0,sizeof(ImageBuf));
    i=0;
    wait(1);
    //TestMode();
    SetRandamColer();
//    SetRainbowColer();
    while(1)
    {
        memset(ImageBuf,0,sizeof(ImageBuf));
//        read_font(0x826d);
//        draw_kanji_15x16(0,0);

        for(i=0;i<DISPLAY_XSIZE+(15*CountChar(strs)-1);i++)
        {
            drawStr15x16(strs ,i,COLOR_W);
            ApplyColerMap();
            outBordData();
            wait(0.1);
        }
    }
    while(1)
    {
        if(f_mode == 0)
        {
            memset(ImageBuf,0,sizeof(ImageBuf));
            pc.scanf("%s",&strs);
            pc.printf("cmdOK\r\n");
            if(strstr(strs,"barusu") != NULL)
            {
                memset(ImageBuf,0xffff,sizeof(ImageBuf));
                f_mode = 2;
            }
            else
            {
                f_mode = 1;
            }
        }
        if(f_mode == 1)
        {
            drawStr(strs,coler,i,4);
            i++;
            if(i > (16*6 - 8 ))
            {
                f_mode = 2;
                coler = (coler+1)%7;
                i = 0;
            }
        }
        if(f_mode == 2)
        {
            bufLeftShift();
            i++;
            if(i>=((16*6 - 8)*3))
            {
                memset(ImageBuf,0,sizeof(ImageBuf));
                i = 0;
                f_mode = 1;
            }
        }

        if(pc.readable()) {
            tmpstr[cnt_tmpstr] = pc.getc();
            if(tmpstr[cnt_tmpstr] == '\n')
            {
                tmpstr[cnt_tmpstr+1] = 0;
            pc.printf("%s\r\n",tmpstr);
            }
            cnt_tmpstr++;
        }
        outBordData();
        wait(0.1);
    }    
}