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

Dependencies:   mbed

Fork of LEDMatrix_Master by en 129

15x16fontsLib.cpp

Committer:
nameless129
Date:
2014-03-28
Revision:
10:e261964e4989
Parent:
7:bfd5c9d80f48

File content as of revision 10:e261964e4989:

#include "mbed.h"
#include "displayCom.h"
#include "15x16fontsLib.h"

SPI FontROM(p11, p12, p13); // mosi, miso, sclk
DigitalOut FontROM_CS(p14);


unsigned char matrixdata[32];

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;
    
    // if ASCII code
    int font_width;
    if(code >= 0x20 && code <= 0x7F) {
        Address = (code - 0x20)*16 + 255968;
        font_width = 8;
    }
    else {
        font_width = 16;
    }

    // Deselect the device
    FontROM_CS = 1;

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

    // Deselect the device
    FontROM_CS = 1;
}

void draw_kanji_15x16(int pos_x,unsigned char color, int font_width)
{
    for(int i=0; i<font_width; 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+font_width]<<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+font_width]<<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+font_width]<<8;
            }
        }
    }
}

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*8, color, 16);
            CountChar+=2;
        }
        else  //ASCII文字
        {
            SJISChar = c;
            f_SJISChar = 0;
            read_font(SJISChar);
            draw_kanji_15x16(pos_x-CountChar*8, color, 8);
            CountChar++;
        }
        str++;
        c = *str;
    }
}

void drawStr15x16_AutoColer(char *str ,int pos_x)
{
    unsigned char       f_SJISChar = 0;
    unsigned char       c = 0;
    unsigned char       c_color = 0;
    unsigned int        SJISChar = 0;
    unsigned int        CountChar = 0;
    const unsigned char color_pattern[6] = {COLOR_R,COLOR_Y,COLOR_G,COLOR_C,COLOR_B,COLOR_M};

    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*8, color_pattern[c_color], 16);
            CountChar+=2;
        }
        else  //ASCII文字
        {
            SJISChar = c;
            f_SJISChar = 0;
            read_font(SJISChar);
            draw_kanji_15x16(pos_x-CountChar*8, color_pattern[c_color], 8);
            CountChar++;
        }
        str++;
        c = *str;
        c_color++;
        if(c_color>=6)
        {
            c_color = 0;
        }
    }
}