access GT20L16J1Y through UART. Please use Shift-JIS code on serial terminal.

Dependencies:   mbed

GT20L16J1Yにアクセスするサンプルです。パソコンのシリアルターミナルからShift-JISで文字を入力すると、フォントを表示します。

main.cpp

Committer:
ytsuboi
Date:
2015-10-23
Revision:
0:371d6cc5d4fb

File content as of revision 0:371d6cc5d4fb:

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx
SPI spi(p11, p12, p13); // mosi, miso, sclk
DigitalOut cs(p10);

unsigned char matrixdata32[32]; //16×16用表示データ
unsigned char matrixdata16[16]; //16×8用表示データ

/*漢字ROMとやりとり*/
//readFontJIS(JIS上位8bit,JIS下位8bit);
void readFontJIS(uint8_t c1, uint8_t c2)
{
    /*jisx変換後の表示*/
    pc.printf("JIS X up8 = 0x%x downn8 = 0x%x\r\n", c1, c2);

    /*jisxの区点を求める*/
    uint32_t MSB = c1 - 0x20;//区
    uint32_t LSB = c2 - 0x20;//点
    /*JISの句点番号で分類*/
    uint32_t Address = 0;

    pc.printf("MSB = d%d LSB = d%d\r\n", MSB, LSB);
    /*各種記号・英数字・かな(一部機種依存につき注意,㍍などWindowsと互換性なし)*/
    if (MSB >= 1 && MSB <= 15 && LSB >= 1 && LSB <= 94)
        Address = ( (MSB - 1) * 94 + (LSB - 1)) * 32;
    /*第一水準*/
    if (MSB >= 16 && MSB <= 47 && LSB >= 1 && LSB <= 94)
        Address = ( (MSB - 16) * 94 + (LSB - 1)) * 32 + 43584;
    /*第二水準*/
    if (MSB >= 48 && MSB <= 84 && LSB >= 1 && LSB <= 94)
        Address = ((MSB - 48) * 94 + (LSB - 1)) * 32 + 138464;

    /*GT20L16J1Y内部では1区と同等の内容が収録されている*/
    if (MSB == 85 && LSB >= 0x01 && LSB <= 94)
        Address = ((MSB - 85) * 94 + (LSB - 1)) * 32 + 246944;

    /*GT20L16J1Y内部では2区、3区と同等の内容が収録されている*/
    if (MSB >= 88 && MSB <= 89 && LSB >= 1 && LSB <= 94)
        Address = ((MSB - 88) * 94 + (LSB - 1)) * 32 + 249952;

    /*漢字ROMにデータを送信*/
    // Deselect the device
    cs = 1;
    pc.printf("Address = %u \r\n", Address);

    // Setup the spi for 8 bit data, high steady state clock
    spi.format(8,3);
    spi.frequency(1000000);

    // Select the device by seting chip select low
    cs = 0;
    spi.write(0x03);    // Read data byte
    spi.write(Address >> 16  & 0xff);
    spi.write(Address >> 8   & 0xff);
    spi.write(Address        & 0xff);

    /*漢字ROMからデータを受信*/
    for (int i = 0; i < 32; i++) {
        matrixdata32[i] = spi.write(0x00);
    }
    // Deselect the device
    cs = 1;
}//spireadfont


/*漢字ROMとやりとり*/
//readFontASCII(ASCIIコード);
void readFontASCII(uint8_t ASCIICODE)
{
    pc.printf("ASCII,0x");
    pc.printf("%x\r\n", ASCIICODE); //10/07
    uint32_t Address = 0;
    /*ASCII文字*/
    if (ASCIICODE >= 0x20 && ASCIICODE <= 0x7F)
        Address = ( ASCIICODE - 0x20) * 16 + 255968;

    /*漢字ROMにデータを送信*/
    // Deselect the device
    cs = 1;

    // Setup the spi for 8 bit data, high steady state clock
    spi.format(8,3);
    spi.frequency(1000000);

    // Select the device by seting chip select low
    cs = 0;
    spi.write(0x03);
    spi.write(Address >> 16  & 0xff);
    spi.write(Address >> 8   & 0xff);
    spi.write(Address        & 0xff);

    /*漢字ROMからデータを受信*/
    for (int i = 0; i < 16; i++) {
        matrixdata16[i] = spi.write(0x00);
    }
    // Deselect the device
    cs = 1;
}

/*シリアルモニタへ16*16のデータを表示する*/
void sendDotsToSerial32()
{
    /*上半分*/
    for (int i = 0; i < 8; i++) {
        for (int b = 0; b < 16; b++) {
            char byteDigit = (1 << i);
            if (matrixdata32[b] & byteDigit) {
                pc.printf("XX");
            } else {
                pc.printf("--");
            }
        }
        pc.printf("\r\n");
    }
    /*下半分*/
    for (int i = 0; i < 8; i++) {
        for (int b = 16; b < 32 ; b++) {
            char byteDigit = (1 << i);
            if (matrixdata32[b] & byteDigit) {
                pc.printf("XX");
            } else {
                pc.printf("--");
            }
        }
        pc.printf("\r\n");
    }
    pc.printf("\r\n");
} //sendDataToSerial32


/*シリアルモニタへ16*8のデータを表示する*/
void sendDotsToSerial16()
{
    /*上半分*/
    for (int i = 0; i < 8; i++) {
        for (int b = 0; b < 8; b++) {
            char byteDigit = (1 << i);
            if (matrixdata16[b] & byteDigit) {
                pc.printf("XX");
            } else {
                pc.printf("--");
            }
        }
        pc.printf("\r\n");
    }

    /*下半分*/
    for (int i = 0; i < 8; i++) {
        for (int b = 8; b < 16; b++) {
            char byteDigit = (1 << i);
            if (matrixdata16[b] & byteDigit) {
                pc.printf("XX");
            } else {
                pc.printf("--");
            }
        }
        pc.printf("\r\n");
    }
    pc.printf("\r\n");
} //sendDataToSerial32


/*1byteのSJISを表示する*/
void showSJIS1byte(uint8_t code)
{
    readFontASCII(code);
    sendDotsToSerial16();
}

/*2byteのSJISを表示する*/
//showSJIS2byte(SJIS文字コード)
void showSJIS2byte(unsigned short code)
{
    /*Arduinoのシリアルで日本語はSJIS送信なのでSJIS->JIS X 0208変換をする*/
    pc.printf("SJIS, 0x%x\r\n", code);
    uint8_t c1 = ((code & 0xff00) >> 8);
    uint8_t c2 = (code & 0xFF);
    if (c1 >= 0xe0) {
        c1 = c1 - 0x40;
    }
    if (c2 >= 0x80) {
        c2 = c2 - 1;
    }
    if (c2 >= 0x9e) {
        c1 = (c1 - 0x70) * 2;
        c2 = c2 - 0x7d;
    } else {
        c1 = ((c1 - 0x70) * 2) - 1;
        c2 = c2 - 0x1f;
    }
    /*読み出し*/
    readFontJIS(c1, c2);
    /*表示*/
    sendDotsToSerial32();
}

int main()
{
    while(1) {
        if (pc.readable() > 0) {
            /* PCからはSJISで送ること */
            wait(0.2);//最低でも2バイト受信したい
            uint8_t msbdata = pc.getc();//1バイト目 //10/07
            /*SJISの1バイトコードか否か*/
            if ( (msbdata < 0x80) || ((0xA0 < msbdata) && (msbdata <= 0xdF)) ) {
                showSJIS1byte(msbdata);
            } else {
                uint8_t lsbdata = pc.getc();//2バイト目 //10/07
                uint16_t data =  ((msbdata << 8) + lsbdata); //2
                showSJIS2byte(data);
            }
        }
    }
}