超小型グラフィックLCD AQM1248A

秋月電子で売っていいる、”超小型グラフィックLCD AQM1248A”をESP32につないでみました。

回路図

AQM1248AとESP32は、SPI + RS を使って接続します。 ESP32は、”ESP32 開発ボード WiFi + Bluetooth 超低消費 電力 デュアル コア ESP-32 ESP-32S ボード”を使用しています。36ピンの製品です。

超小型グラフィックLCD AQM1248A”は7ピンで以下の様に接続しています。

  • 1番ピン: 電源。3.3Vと接続
  • 2番ピン: チップセレクト。 GPIO5と接続
  • 3番ピン: リセット。 GPIO23と接続
  • 4番ピン: RS。コマンドとデータの識別用端子。GPIO15と接続
  • 5番ピン: SCLK。GPIO18と接続。
  • 6番ピン: SDI。GPIO23と接続。
  • 7番ピン: GND

その他の注意点は

  • この回路はESP32デフォルトのSPI用ピンを使用しています。
  • ピン配置は固定では有りません。上記以外の設定にした場合、スケッチでSPI.begin(SCK, MISO, MOSI, SS);が必要です。
  • SPIピン以外に、/CS, /RESETの2ピンが必要です。これらのピンは、出力となるので、GPIO34から39は使用出来ません(これらは入力専用)
  • また、GPIO6から11はESP32内部で使用しているようで避けた方が無難。(GPIO8をRESETに使用したら動きませんでした)

回路から分かる様にMISO端子を使用していません。つまりマスターは、AQM1248A へデータを出力しますが、AQM1248Aのデータを読み取る事は出来ません。

スケッチ

秋月電子さんのHPにある資料に初期化の方法”が載っています。まずはそれに合わせて初期化します。

追加機能として以下を追加しています。

  • 画面消去   LCD_CLS()
  • 点を打つ   LCD_PSET()
  • 線を引く   LCD_LINE()
  • 文字の表示  LCD_Print_C()
  • 文字列の表示 LCD_Print_Str()
// **********************************************
// * ESP32
// ***********************************************/

#include "AQM1248A.h"

char v_buf[128][6];

SPISettings spiSettings = SPISettings(SPI_CLK, SPI_MSBFIRST, SPI_MODE1);

void setup() 
{
    Serial.begin(115200);
    Serial.println();

    SPI.begin(); 
    Init_LCD();
    LCD_CLS(0);
    
    LCD_Print_Str(0,0,"LCD OK",1);
    delay(3000);
    
    Serial.println("LCD_OK");
}

void loop() 
{
    int a,b,c,d;

    LCD_CLS(0);
    for(a=0; a<128; a += 10)
        for(b=0; b < 48; b += 5) LCD_PSET(a,b,1);
    delay(3000);

    LCD_CLS(0); 
    for(a=0; a<128; a += 10)
    {
        LCD_LINE(a,0,127,46,1);
        LCD_LINE(0,46,a,0,1);
    }
    delay(3000);
        
    LCD_CLS(0); 
    LCD_Print_C(10,10,'A',1); LCD_Print_C(20,10,'a',1);
    LCD_Print_Str(10,10,"AQM1248A LCD TEST",1); 
    LCD_Print_Str(10,25,"エキュウエム1248エ LCD ",1); 
    delay(3000);
    
    a = 0x20; LCD_CLS(0); c = 0;
    while(a < 0x70)
    {
       for(b=0; b<120; b += 8)
       {
           LCD_Print_C(b,c,a,1);
           a ++;
       }
       c += 10;
    }
    delay(3000);

    a = 0x70; LCD_CLS(0); c = 0;
    while(a < 0xc0)
    {
       for(b=0; b<120; b += 8)
       {
           LCD_Print_C(b,c,a,1);
           a ++;
       }
       c += 10;
    }
    delay(3000);
}

void Init_LCD()
{
    pinMode(LCD_CS, OUTPUT);     
    digitalWrite(LCD_CS,HIGH);
    
    pinMode(LCD_RS, OUTPUT);     
    digitalWrite(LCD_RS,HIGH);

    pinMode(LCD_RSET, OUTPUT);     
    digitalWrite(LCD_RSET,LOW);
    delay(500);
    digitalWrite(LCD_RSET,HIGH);
   
    digitalWrite(LCD_CS,LOW);
    digitalWrite(LCD_RS,LOW);
    
    SPI.transfer(0xAE);
    SPI.transfer(0xA0);
    SPI.transfer(0xC8);
    SPI.transfer(0xA3);
    
    SPI.transfer(0x2C);
    delay(50);
    SPI.transfer(0x2E);
    delay(50);
   
    SPI.transfer(0x2F);
    
    SPI.transfer(0x23);
    SPI.transfer(0x81);
    SPI.transfer(0x1C);

    SPI.transfer(0xA4);
    SPI.transfer(0x40);
    SPI.transfer(0xA6);
    SPI.transfer(0xAF);
     
    digitalWrite(LCD_CS,HIGH);
}

void LCD_CLS(char data)
{
    int a,b;
    
    digitalWrite(LCD_CS,LOW);
    for(b=0; b<6; b ++)
    {
        digitalWrite(LCD_RS,LOW);
        SPI.transfer(0xB0+b);
        SPI.transfer(0x10);
        SPI.transfer(0x00);
    
        digitalWrite(LCD_RS,HIGH);   
        for(a=0; a<128; a++)
        {
            SPI.transfer(data);
            v_buf[a][b]=data;
        }
    }
    digitalWrite(LCD_CS,HIGH);
}

//----------------------------------------------------
//  点の描画 
//  int x_data  X positon   0 -> 128    
//  int x_data  Y positon   0 -> 48 
//  int cl      color 0: white  1:black 
//----------------------------------------------------
void LCD_PSET(int x_data, int y_data, int cl)
{

    int a,b;
    char c;
 
//  y_data
    a=y_data >> 3; b= y_data & 0x07;
    c=0x1; 
    while(b)
    {
        c <<= 1; b --; 
    }
    
    if(cl) v_buf[x_data][a] |= c;
    else 
    {
        c = ~c; v_buf[x_data][a] &= c;
    }

    digitalWrite(LCD_CS,LOW);
    digitalWrite(LCD_RS,LOW);    
    SPI.transfer(0xB0+a);
    c=x_data >> 4; c |= 0x10;
    SPI.transfer(c);
    c=x_data & 0xf;
    SPI.transfer(c);
    digitalWrite(LCD_RS,HIGH);
    SPI.transfer(v_buf[x_data][a]);
    digitalWrite(LCD_CS,HIGH);
}

//----------------------------------------------------
//  Fontの描画 
//  int x_data  X positon   0 -> 128    
//  int y_data  Y positon   0 -> 48
//  char c_data Data
//  int cl      color 0: white  1:black
//----------------------------------------------------
void LCD_Print_C(int x_data, int y_data, char c_data, int cl)
{
    int a,b,c,d;
    char s;

    a = c_data - 0x20; 
    for(b=0; b<5; b ++)
    {
        s=0x1;
        for(c=0; c<8; c ++)
        {
            d=0;
            if(Font[a][b] & s) d=1;
            if(cl == 0)
            {
                if(d) d=0;
                else d=1;
            }
            LCD_PSET(x_data,y_data + c,d);
            s <<= 1; 
        }
        x_data ++;
    }
    for(c=0; c<8; c ++)
    {
        d=0;
        if(cl == 0) d=1; 
        LCD_PSET(x_data,y_data + c,d);        
    }
}

//----------------------------------------------------
//  Strtの描画 
//  int x_data  X positon   0 -> 128    
//  int y_data  Y positon   0 -> 48
//  char *c_data Data
//  int cl      color 0: white  1:black
//----------------------------------------------------
void LCD_Print_Str(int x_data, int y_data, char *c_data, int cl)
{
    int a;
    a = strlen(c_data);
    while(a)
    {
        if(*c_data == 0xef)
        {
            c_data += 2;
            a -= 2;
        }
        LCD_Print_C(x_data,y_data,*c_data,cl);
//        Serial.println(*c_data,HEX);
        a --; x_data += 6; c_data ++;
    }
}

//----------------------------------------------------
//   直線描画関数
//
//  int x0      start x
//  int y0      start y
//  int x1      end x
//  int y1      end y
//  int cl      color 0: white  1:black
//----------------------------------------------------
#define abs(a)  (((a)>0) ? (a) : -(a))
void LCD_LINE(int x0, int y0, int x1, int y1, int cl)
{
    int steep, t;
    int deltax, deltay, error;
    int x, y;
    int ystep;
    
    /// 差分の大きいほうを求める
    steep = (abs(y1 - y0) > abs(x1 - x0));
    /// x、yの入れ替え
    if(steep)
    {
        t = x0; x0 = y0; y0 = t;
        t = x1; x1 = y1; y1 = t;
    }
    if(x0 > x1) 
    {
        t = x0; x0 = x1; x1 = t;
        t = y0; y0 = y1; y1 = t;
    }
    deltax = x1 - x0;                       // 傾き計算 
    deltay = abs(y1 - y0);
    error = 0;
    y = y0;
    /// 傾きでステップの正負を切り替え
    if(y0 < y1) ystep = 1; else ystep = -1;
    /// 直線を点で描画
    for(x=x0; x<x1+1; x++) 
    {
        if(steep) LCD_PSET(y,x,cl); else LCD_PSET(x,y,cl);
        error += deltay;
        if((error << 1) >= deltax) 
        {
            y += ystep;
            error -= deltax;
        }
    }
}
  • 5行 #include “AQM1248A.h”
    • 今回はフォントデータが有るため本体とは別に、”AQM1248A.h”を制作しています。
  • 7行 char v_buf[128][6];
    • AQM1248Aからデータを読めない為、画面データをESP32本体に確保
    • 画面に描いたデータをこのバッファーにも描いている。
  • 17行 Init_LCD(); 本体は、74行から
    • AQM1248Aの初期化
    • 秋月のHPにあった初期化をそのまま実行
  • 18行 LCD_CLS(0); 本体は114行から
    • LCD画面をを引数で渡したデータで埋めます。
    • 0で画面の消去。
  • 20行 LCD_Print_Str(0,0,”LCD OK”,1); 本体219行から
    • 文字列の表示
    • 第一引数: X座標。
    • 第二引数: Y座標。
    • 第三引数: 文字列のポインター
    • 第四引数: 色ー>0:白  1:黒
  • 32行 for(b=0; b < 48; b += 5) LCD_PSET(a,b,1); 本体142行から
    • 点の表示
    • 第一引数: X座標。
    • 第二引数: Y座標。
    • 第三引数: 色ー>0:白  1:黒
  • 38行 LCD_LINE(a,0,127,46,1); 本体 246行から
    • 線の描画
    • 第一引数: 始点X座標。
    • 第二引数: 始点Y座標。
    • 第三引数: 終点X座標。
    • 第四引数: 終点Y座標。
    • 第五引数: 色ー>0:白  1:黒
  • 44行 LCD_Print_C(10,10,’A’,1);  本体181行から
    • 文字の表示
    • 第一引数: X座標。
    • 第二引数: Y座標。
    • 第三引数: 表示文字データ
    • 第四引数: 色ー>0:白  1:黒

AQM1248A.H

//----------------------------------------------------------------
//        AQM1248A LCD
//----------------------------------------------------------------
#include <SPI.h>

#define LCD_CS           5	
#define LCD_RS          15
#define LCD_RSET        21
#define SPI_CLK         18


//    Font Data 
const char Font[192][5] =
{
    { 0x00, 0x00, 0x00, 0x00, 0x00 }, // " " 0x20
    { 0x00, 0x00, 0x4f, 0x00, 0x00 }, // !   0x21
    { 0x00, 0x07, 0x00, 0x07, 0x00 }, // "   0x22
    { 0x14, 0x7f, 0x14, 0x7f, 0x14 }, // #   0x23
    { 0x24, 0x2a, 0x7f, 0x2a, 0x12 }, // $   0x24
    { 0x23, 0x13, 0x08, 0x64, 0x62 }, // %   0x25
    { 0x36, 0x49, 0x55, 0x22, 0x50 }, // &   0x26
    { 0x00, 0x05, 0x03, 0x00, 0x00 }, // '   0x27
    { 0x00, 0x1c, 0x22, 0x41, 0x00 }, // (   0x28
    { 0x00, 0x41, 0x22, 0x1c, 0x00 }, // )   0x29
    { 0x14, 0x08, 0x3e, 0x08, 0x14 }, // *   0x2A
    { 0x08, 0x08, 0x3e, 0x08, 0x08 }, // +   0x2B
    { 0x00, 0x50, 0x30, 0x00, 0x00 }, // ,   0x2C
    { 0x08, 0x08, 0x08, 0x08, 0x08 }, // -   0x2D
    { 0x00, 0x60, 0x60, 0x00, 0x00 }, // .   0x2E
    { 0x20, 0x10, 0x08, 0x04, 0x02 }, // /   0x2F
    { 0x3e, 0x51, 0x49, 0x45, 0x3e }, // 0   0x30
    { 0x00, 0x42, 0x7f, 0x40, 0x00 }, // 1   0x31
    { 0x42, 0x61, 0x51, 0x49, 0x46 }, // 2   0x32
    { 0x21, 0x41, 0x45, 0x4b, 0x31 }, // 3   0x33
    { 0x18, 0x14, 0x12, 0x7f, 0x10 }, // 4   0x34
    { 0x27, 0x45, 0x45, 0x45, 0x39 }, // 5   0x35
    { 0x3c, 0x4a, 0x49, 0x49, 0x30 }, // 6   0x36
    { 0x01, 0x71, 0x09, 0x05, 0x03 }, // 7   0x37
    { 0x36, 0x49, 0x49, 0x49, 0x36 }, // 8   0x38
    { 0x06, 0x49, 0x49, 0x29, 0x1e }, // 9   0x39
    { 0x00, 0x36, 0x36, 0x00, 0x00 }, // :   0x3A
    { 0x00, 0x56, 0x36, 0x00, 0x00 }, // ;   0x3B
    { 0x08, 0x14, 0x22, 0x41, 0x00 }, // <   0x3C
    { 0x14, 0x14, 0x14, 0x14, 0x14 }, // =   0x3D
    { 0x00, 0x41, 0x22, 0x14, 0x08 }, // >   0x3E
    { 0x02, 0x01, 0x51, 0x09, 0x06 }, // ?   0x3F
    { 0x32, 0x49, 0x79, 0x41, 0x3e }, // @   0x40
    { 0x7e, 0x11, 0x11, 0x11, 0x7e }, // A   0x41
    { 0x7f, 0x49, 0x49, 0x49, 0x36 }, // B   0x42
    { 0x3e, 0x41, 0x41, 0x41, 0x22 }, // C   0x43
    { 0x7f, 0x41, 0x41, 0x22, 0x1c }, // D   0x44
    { 0x7f, 0x49, 0x49, 0x49, 0x41 }, // E   0x45
    { 0x7f, 0x09, 0x09, 0x09, 0x01 }, // F   0x46
    { 0x3e, 0x41, 0x49, 0x49, 0x7a }, // G   0x47
    { 0x7f, 0x08, 0x08, 0x08, 0x7f }, // H   0x48
    { 0x00, 0x41, 0x7f, 0x41, 0x00 }, // I   0x49
    { 0x20, 0x40, 0x41, 0x3f, 0x01 }, // J   0x4A
    { 0x7f, 0x08, 0x14, 0x22, 0x41 }, // K   0x4B
    { 0x7f, 0x40, 0x40, 0x40, 0x40 }, // L   0x4C
    { 0x7f, 0x02, 0x0c, 0x02, 0x7f }, // M   0x4D
    { 0x7f, 0x04, 0x08, 0x10, 0x7f }, // N   0x4E
    { 0x3e, 0x41, 0x41, 0x41, 0x3e }, // O   0x4F
    { 0x7f, 0x09, 0x09, 0x09, 0x06 }, // P   0X50
    { 0x3e, 0x41, 0x51, 0x21, 0x5e }, // Q   0X51
    { 0x7f, 0x09, 0x19, 0x29, 0x46 }, // R   0X52
    { 0x46, 0x49, 0x49, 0x49, 0x31 }, // S   0X53
    { 0x01, 0x01, 0x7f, 0x01, 0x01 }, // T   0X54
    { 0x3f, 0x40, 0x40, 0x40, 0x3f }, // U   0X55
    { 0x1f, 0x20, 0x40, 0x20, 0x1f }, // V   0X56
    { 0x3f, 0x40, 0x38, 0x40, 0x3f }, // W   0X57
    { 0x63, 0x14, 0x08, 0x14, 0x63 }, // X   0X58
    { 0x07, 0x08, 0x70, 0x08, 0x07 }, // Y   0X59
    { 0x61, 0x51, 0x49, 0x45, 0x43 }, // Z   0X5A
    { 0x00, 0x7f, 0x41, 0x41, 0x00 }, // [   0X5B
    { 0x02, 0x04, 0x08, 0x10, 0x20 }, // "\" 0X5C
    { 0x00, 0x41, 0x41, 0x7f, 0x00 }, // ]   0X5D
    { 0x04, 0x02, 0x01, 0x02, 0x04 }, // ^   0X5E
    { 0x40, 0x40, 0x40, 0x40, 0x40 }, // _   0X5F
    { 0x00, 0x01, 0x02, 0x04, 0x00 }, // `   0X60
    { 0x20, 0x54, 0x54, 0x54, 0x78 }, // a   0X61
    { 0x7f, 0x48, 0x44, 0x44, 0x38 }, // b   0X62
    { 0x38, 0x44, 0x44, 0x44, 0x20 }, // c   0X63
    { 0x38, 0x44, 0x44, 0x48, 0x7f }, // d   0X64
    { 0x38, 0x54, 0x54, 0x54, 0x18 }, // e   0X65
    { 0x08, 0x7e, 0x09, 0x01, 0x02 }, // f   0X66
    { 0x0c, 0x52, 0x52, 0x52, 0x3e }, // g   0X67
    { 0x7f, 0x08, 0x04, 0x04, 0x78 }, // h   0X68
    { 0x00, 0x44, 0x7d, 0x40, 0x00 }, // i   0X69
    { 0x20, 0x40, 0x44, 0x3d, 0x00 }, // j   0X6A
    { 0x7f, 0x10, 0x28, 0x44, 0x00 }, // k   0X6B
    { 0x00, 0x41, 0x7f, 0x40, 0x00 }, // l   0X6C
    { 0x7c, 0x04, 0x18, 0x04, 0x78 }, // m   0X6D
    { 0x7c, 0x08, 0x04, 0x04, 0x78 }, // n   0X6E
    { 0x38, 0x44, 0x44, 0x44, 0x38 }, // o   0X6F
    { 0x7c, 0x14, 0x14, 0x14, 0x08 }, // p   0X70
    { 0x08, 0x14, 0x14, 0x18, 0x7c }, // q   0X71
    { 0x7c, 0x08, 0x04, 0x04, 0x08 }, // r   0X72
    { 0x48, 0x54, 0x54, 0x54, 0x20 }, // s   0X73
    { 0x04, 0x3f, 0x44, 0x40, 0x20 }, // t   0X74
    { 0x3c, 0x40, 0x40, 0x20, 0x7c }, // u   0X75
    { 0x1c, 0x20, 0x40, 0x20, 0x1c }, // v   0X76
    { 0x3c, 0x40, 0x30, 0x40, 0x3c }, // w   0X77
    { 0x44, 0x28, 0x10, 0x28, 0x44 }, // x   0X78
    { 0x0c, 0x50, 0x50, 0x50, 0x3c }, // y   0X79
    { 0x44, 0x64, 0x54, 0x4c, 0x44 }, // z   0X7A
    { 0x00, 0x08, 0x36, 0x41, 0x00 }, // {   0X7B
    { 0x00, 0x00, 0x7f, 0x00, 0x00 }, // |   0X7C
    { 0x00, 0x41, 0x36, 0x08, 0x00 }, // }   0X7D
    { 0x08, 0x08, 0x2a, 0x1c, 0x08 }, // ->  0X7E
    { 0x08, 0x1c, 0x2a, 0x08, 0x08 }, // <-  0X7F
    { 0x08, 0x46, 0x4a, 0x32, 0x1e }, // ta  0x80
    { 0x0a, 0x4a, 0x3e, 0x09, 0x08 }, // ti  0x81        
    { 0x0e, 0x00, 0x4e, 0x20, 0x1e }, // tu  0x82
    { 0x04, 0x45, 0x3d, 0x05, 0x04 }, // te  0x83       
    { 0x00, 0x7f, 0x08, 0x10, 0x00 }, // to  0x84
    { 0x44, 0x24, 0x1f, 0x04, 0x04 }, // na  0x85        
    { 0x40, 0x42, 0x42, 0x42, 0x40 }, // ni  0x86
    { 0x42, 0x2a, 0x12, 0x2a, 0x06 }, // nu  0x87       
    { 0x22, 0x12, 0x7b, 0x16, 0x22 }, // ne  0x88
    { 0x00, 0x40, 0x20, 0x1f, 0x00 }, // no  0x89        
    { 0x78, 0x00, 0x02, 0x04, 0x78 }, // ha  0x8A
    { 0x3f, 0x44, 0x44, 0x44, 0x44 }, // hi  0x8B       
    { 0x02, 0x42, 0x42, 0x22, 0x1e }, // hu  0x8C
    { 0x04, 0x02, 0x04, 0x08, 0x30 }, // he  0x8D        
    { 0x32, 0x02, 0x7f, 0x02, 0x32 }, // ho  0x8E
    { 0x02, 0x12, 0x22, 0x52, 0x0e }, // ma  0x8F       
    { 0x00, 0x2a, 0x2a, 0x2a, 0x40 }, // mi  0x90
    { 0x38, 0x24, 0x22, 0x20, 0x70 }, // mu  0x91        
    { 0x40, 0x28, 0x10, 0x28, 0x06 }, // me  0x92
    { 0x0a, 0x3e, 0x4a, 0x4a, 0x4a }, // mo  0x93       
    { 0x04, 0x7f, 0x04, 0x14, 0x0c }, // ya  0x94
    { 0x40, 0x42, 0x42, 0x7e, 0x40 }, // yu  0x95        
    { 0x4a, 0x4a, 0x4a, 0x4a, 0x7e }, // yo  0x96
    { 0x04, 0x05, 0x45, 0x25, 0x1c }, // ra  0x97       
    { 0x0f, 0x40, 0x20, 0x1f, 0x00 }, // ri  0x98
    { 0x7c, 0x00, 0x7e, 0x80, 0x30 }, // ru  0x99        
    { 0x7e, 0x40, 0x20, 0x10, 0x08 }, // re  0x9A
    { 0x7e, 0x42, 0x42, 0x42, 0x7e }, // ro  0x9B       
    { 0x0e, 0x02, 0x42, 0x22, 0x1e }, // wa  0x9C
    { 0x42, 0x42, 0x40, 0x20, 0x18 }, // n   0x9D        
    { 0x02, 0x04, 0x01, 0x02, 0x00 }, // "   0x9E
    { 0x07, 0x05, 0x07, 0x00, 0x00 }, // .   0x9F
	{ 0x00, 0x00, 0x00, 0x00, 0x00 }, //     0xA0
	{ 0x70, 0x50, 0x70, 0x00, 0x00 }, //  .  0xA1		 
	{ 0x00, 0x00, 0x0f, 0x01, 0x01 }, //  [  0xA2
	{ 0x40, 0x40, 0x78, 0x00, 0x00 }, //  ]  0xA3	    
	{ 0x10, 0x20, 0x40, 0x00, 0x00 }, //  ,  0xA4
	{ 0x00, 0x18, 0x18, 0x00, 0x00 }, //  .  0xA5		 
	{ 0x0a, 0x0a, 0x4a, 0x2a, 0x1e }, // wo  0xA6
	{ 0x04, 0x24, 0x34, 0x14, 0x0c }, // a   0xA7	    
	{ 0x20, 0x10, 0x78, 0x04, 0x00 }, // i   0xA8
	{ 0x18, 0x08, 0x4c, 0x48, 0x38 }, // u   0xA9		 
	{ 0x48, 0x48, 0x78, 0x48, 0x48 }, // e   0xAA
	{ 0x48, 0x28, 0x18, 0x7c, 0x08 }, // o   0xAB	    
	{ 0x08, 0x7c, 0x08, 0x28, 0x18 }, // ya  0xAC
	{ 0x40, 0x48, 0x48, 0x78, 0x40 }, // yu  0xAD		 
	{ 0x54, 0x54, 0x54, 0x7c, 0x00 }, // yo  0xAE
	{ 0x18, 0x00, 0x58, 0x40, 0x38 }, // tu  0xAF		
	{ 0x08, 0x08, 0x08, 0x08, 0x08 }, //  -  0xB0
	{ 0x01, 0x41, 0x3d, 0x09, 0x07 }, //  a  0xB1		 
	{ 0x20, 0x10, 0x7c, 0x02, 0x01 }, //  i  0xB2
	{ 0x0e, 0x02, 0x43, 0x22, 0x1e }, //  u  0xB3	    
	{ 0x42, 0x42, 0x7e, 0x42, 0x42 }, //  e  0xB4
	{ 0x22, 0x12, 0x0a, 0x7f, 0x02 }, //  o  0xB5		 
	{ 0x42, 0x3f, 0x02, 0x42, 0x3e }, // ka  0xB6
	{ 0x0a, 0x0a, 0x7f, 0x0a, 0x0a }, // ki  0xB7	    
	{ 0x08, 0x46, 0x42, 0x22, 0x1e }, // ku  0xB8
	{ 0x04, 0x03, 0x42, 0x3e, 0x04 }, // ke  0xB9		 
	{ 0x42, 0x42, 0x42, 0x42, 0x7e }, // ko  0xBA
	{ 0x02, 0x4f, 0x22, 0x1f, 0x02 }, // sa  0xBB	    
	{ 0x4a, 0x4a, 0x40, 0x20, 0x1c }, // si  0xBC
	{ 0x42, 0x22, 0x12, 0x2a, 0x46 }, // su  0xBD		 
	{ 0x02, 0x3f, 0x42, 0x4a, 0x46 }, // se  0xBE
	{ 0x06, 0x48, 0x40, 0x20, 0x1e } // so  0xBF
};
  • 4行 #include <SPI.h>
    • SPIを使用するときはこれを読み込む。
  • 6から9行 各ピンの宣言
  • 13行以下 フォントデータ
    • 6 x 8のフォント
    • 記号、英数、カタカナを収録

カタカナの表示について

今回の開発環境は、Ubuntu20とArduino IDE 1.8.13です。この環境が原因かは分からないのですが、カタカナの表示が上手く行きません。どうもカタカナを表示させようとすると、カタカナのコードの頭にEF,BDと2倍とがつかされ、カタカナ1文字が3バイトになってしまいます。

//----------------------------------------------------
//  Strtの描画 
//  int x_data  X positon   0 -> 127    
//  int y_data  Y positon   0 -> 47
//  char *c_data Data
//  int cl      color 0: white  1:black
//----------------------------------------------------
void LCD_Print_Str(int x_data, int y_data, char *c_data, int cl)
{
    int a;
    a = strlen(c_data);
    while(a)
    {
        if(*c_data == 0xef)
        {
            c_data += 2;
            a -= 2;
        }
        LCD_Print_C(x_data,y_data,*c_data,cl);
//        Serial.println(*c_data,HEX);
        a --; x_data += 6; c_data ++;
    }
}

そこで、LCD_Print_Str()関数無いで、文字列が0xEFで始まる場合は、2バイト進めると細工をしています。(上記スケッチ14行目から)

後、通常カタカナは、”ア”が0xB1から始まり、0xDFまでと思っていたのですが、今回は、”ア”が0xB1から始まり、”ソ”が、0xBF。”タ”は、0x80から始まり、0x9Fで終わっていました。並び型が若干不規則です。

実行結果

実行すると最初LCDに、”LCD_OK” と表示されます。その後は下記の①から⑤を繰り返して表示します。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする