秋月パーツ、AQM1248で2~4倍拡大文字表示

秋月で販売している超小型グラフィック液晶モジュールAQM1248は、128x48ドットの表示が出来るので、文字フォントを用意して文字を表示することが出来ます。そのとき21文字x6行が表示できるのですが、画面が小さいのでよく見えませんでした。見やすくするには2倍拡大などをすることが必要になります。SPIの関数としてC18コンパイラのライブラリOpenSPIとWriteSPIを使用して2倍~4倍の文字を表示するルーチンを作りました。最初3倍ぐらいがよいと思っていたのですが、2倍でもよく、10文字x3行が表示できます。

画像使用しているマイコンはPIC18F14K50というPIC18Fでは最も簡単な安価なマイコンですので、RAMサイズはそれほどありません。そのためフォントデータはROM属性を持たせてフラッシュメモリ上においています。そのためにフォントファイルの中で、「const rom」をつけています。SPIに関してはすでに確認済みですが、AQM1248の取扱説明書に説明されているように初期化と転送を行っています。説明書にここまで丁寧に書かれているのであればキットを組み立てているのとそう替わりません。これからもこのような説明だけでキットとなっていないものを期待したいと思います。キットになっていると、手順どおりに書き込みをして終わりになってしまいますが、説明書を見ながら自分でプログラムするのは、データシートなどを自分で読み返す機会が増えます。このプログラムでは、最初1倍フォントで1回表示した後、2倍、3倍、4倍を順に繰り返して表示します。画面の中で表示されなかったところは前の表示が残りますので、右端に文字の残りが表示されたままになります。プログラムはC18コンパイラでコンパイルします。


画像
画像


GEO-FONT-KP.h
//;****************************************************
//;  CG  FONT
//;  CGDATA  5x7dot  GEO-FONT-K  (C)  2009-2010  BY  S.FUKUDA
//;  char  0x20-0xFF  alphabet  and  kana
//;****************************************************
const  rom  unsigned  char  CGDATA[]={
//  20
       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x5F,0x00,0x00,0x00,
       0x00,0x07,0x00,0x07,0x00,0x00,0x24,0x7F,0x24,0x7F,0x24,0x00,
       0x24,0x2A,0x7F,0x2A,0x12,0x00,0x47,0x37,0x08,0x76,0x71,0x00,
       0x36,0x49,0x36,0x30,0x48,0x00,0x00,0x00,0x17,0x0F,0x00,0x00,
       0x1C,0x22,0x41,0x00,0x00,0x00,0x00,0x00,0x41,0x22,0x1C,0x00,
       0x22,0x14,0x7F,0x14,0x22,0x00,0x08,0x08,0x3E,0x08,0x08,0x00,
       0x00,0x00,0x40,0x30,0x30,0x00,0x08,0x08,0x08,0x08,0x08,0x00,
       0x00,0x00,0x60,0x60,0x00,0x00,0x40,0x30,0x08,0x06,0x01,0x00,
//  30
       0x3E,0x51,0x49,0x45,0x3E,0x00,0x00,0x42,0x7F,0x40,0x00,0x00,
       0x46,0x61,0x51,0x49,0x46,0x00,0x41,0x49,0x49,0x49,0x36,0x00,
       0x10,0x18,0x14,0x7F,0x10,0x00,0x4F,0x49,0x49,0x49,0x31,0x00,
       0x3E,0x49,0x49,0x49,0x31,0x00,0x01,0x01,0x71,0x0D,0x03,0x00,
       0x36,0x49,0x49,0x49,0x36,0x00,0x46,0x49,0x49,0x49,0x3E,0x00,
       0x00,0x00,0x33,0x33,0x00,0x00,0x00,0x20,0x3B,0x1B,0x00,0x00,
       0x08,0x14,0x22,0x41,0x00,0x00,0x28,0x28,0x28,0x28,0x28,0x00,
       0x00,0x41,0x22,0x14,0x08,0x00,0x06,0x01,0x51,0x09,0x06,0x00,
//  40
       0x7E,0x01,0x31,0x49,0x3E,0x00,0x7C,0x12,0x11,0x12,0x7C,0x00,
       0x7F,0x49,0x49,0x49,0x36,0x00,0x3E,0x41,0x41,0x41,0x22,0x00,
       0x7F,0x41,0x41,0x41,0x3E,0x00,0x7F,0x49,0x49,0x49,0x49,0x00,
       0x7F,0x09,0x09,0x09,0x09,0x00,0x3E,0x41,0x49,0x49,0x7A,0x00,
       0x7F,0x08,0x08,0x08,0x7F,0x00,0x00,0x41,0x7F,0x41,0x00,0x00,
       0x20,0x41,0x41,0x3F,0x01,0x00,0x7F,0x08,0x14,0x22,0x41,0x00,
       0x7F,0x40,0x40,0x40,0x40,0x00,0x7F,0x06,0x1C,0x06,0x7F,0x00,
       0x7F,0x04,0x08,0x10,0x7F,0x00,0x3E,0x41,0x41,0x41,0x3E,0x00,
//  50
       0x7F,0x11,0x11,0x11,0x0E,0x00,0x3E,0x61,0x51,0x21,0x5E,0x00,
       0x7F,0x09,0x19,0x29,0x46,0x00,0x46,0x49,0x49,0x49,0x31,0x00,
       0x01,0x01,0x7F,0x01,0x01,0x00,0x3F,0x40,0x40,0x40,0x3F,0x00,
       0x07,0x18,0x60,0x18,0x07,0x00,0x1F,0x60,0x38,0x60,0x1F,0x00,
       0x63,0x14,0x08,0x14,0x63,0x00,0x03,0x0C,0x70,0x0C,0x03,0x00,
       0x41,0x61,0x59,0x45,0x43,0x00,0x7F,0x41,0x41,0x00,0x00,0x00,
       0x29,0x2A,0x7C,0x2A,0x29,0x00,0x00,0x00,0x41,0x41,0x7F,0x00,
       0x18,0x04,0x03,0x04,0x18,0x00,0x40,0x40,0x40,0x40,0x40,0x00,
//  60
       0x00,0x03,0x03,0x04,0x00,0x00,0x32,0x4A,0x4A,0x3C,0x40,0x00,
       0x7F,0x48,0x48,0x48,0x30,0x00,0x30,0x48,0x48,0x48,0x48,0x00,
       0x30,0x48,0x48,0x48,0x7F,0x00,0x38,0x54,0x54,0x54,0x48,0x00,
       0x00,0x08,0x7E,0x09,0x01,0x00,0x48,0x54,0x54,0x54,0x3C,0x00,
       0x7F,0x08,0x08,0x08,0x70,0x00,0x00,0x00,0x7D,0x00,0x00,0x00,
       0x00,0x20,0x40,0x3D,0x00,0x00,0x7F,0x10,0x28,0x44,0x00,0x00,
       0x00,0x01,0x7F,0x00,0x00,0x00,0x7C,0x04,0x78,0x04,0x78,0x00,
       0x7C,0x04,0x04,0x04,0x78,0x00,0x30,0x48,0x48,0x48,0x30,0x00,
//  70
       0x7C,0x14,0x14,0x14,0x08,0x00,0x08,0x14,0x14,0x14,0x7C,0x00,
       0x7C,0x08,0x04,0x08,0x00,0x00,0x48,0x54,0x54,0x54,0x24,0x00,
       0x00,0x04,0x3F,0x44,0x00,0x00,0x3C,0x40,0x40,0x40,0x7C,0x00,
       0x1C,0x20,0x40,0x20,0x1C,0x00,0x3C,0x40,0x38,0x40,0x3C,0x00,
       0x44,0x28,0x10,0x28,0x44,0x00,0x44,0x28,0x10,0x08,0x04,0x00,
       0x44,0x64,0x54,0x4C,0x44,0x00,0x00,0x08,0x77,0x41,0x00,0x00,
       0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x41,0x77,0x08,0x00,0x00,
       0x02,0x01,0x02,0x04,0x02,0x00,0x7F,0x7F,0x7F,0x7F,0x7F,0x00,

       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,
       0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0,  0,0,0,0,0,0
};

AQM124CharN18F14K50.c
#define  USE_OR_MASKS
#include  <p18cxxx.h>
#include  "spi.h"

#pragma  config  FOSC  =  IRC,  FCMEN  =  OFF,  IESO  =  OFF
#pragma  config  PWRTEN  =  OFF,  BOREN  =  OFF  ,  BORV  =  19
#pragma  config  WDTEN  =  OFF,  WDTPS  =  32768
#pragma  config  MCLRE  =  ON
#pragma  config  STVREN  =  OFF,  LVP  =  OFF,  XINST  =  OFF

#define  CS    LATCbits.LATC5
#define  RS    LATCbits.LATC4
typedef  unsigned  char  BYTE;

#include  "GEO-FONT-KP.h"

void  delay_us(int  t)
{
       unsigned  int  i;
       for(i=0;i<t;i++)
               Nop();
}
void  delay_ms(int  ms)
{
       unsigned  int  i;
       for(i=0;i<ms;i++)
               delay_us(150);
}
void  lcdcmd(unsigned  char  work)
{
       CS=0;
       RS=0;
       WriteSPI(work);
       CS=1;
}
void  lcddat(unsigned  char  work)
{
       CS=0;
       RS=1;
       WriteSPI(work);
       CS=1;
}
const  char  m1[]={"TESTLCD1234"};
const  char  m2[]={"TESTLCD"};
const  char  m3[]={"TESTL"};
const  char  t1[]={"123456789012345678901"};
const  char  t2[]={"ABCDEFGHIJKLMNOPQRST"};
const  char  t3[]={"UVWXYZ!\"#$%&\'()=~|"};
const  char  t4[]={"`{}*+_?><,./\;:]@[    "};

int  x=0,y=0;
void  locate(int  x0,int  y0)
{
       y=y0;  x=x0;
}
void  putnchar(int  c,int  n)
{
       int  i,j,k;
       unsigned  long  cg3[6];
       for(i=0;i<6;i++){
               cg3[i]=0;
               for(j=0;j<8;j++){
                       for(k=0;k<n;k++)
                               cg3[i]=(cg3[i]<<1)|(((CGDATA[6*(c-0x20)+i]&(1<<(7-j)))==0)?0:1);
               }
       }
       for(j=0;j<n;j++){
               lcdcmd(0xB0+j+n*y);  //page0..5
               lcdcmd(0x10+((6*n*x)>>4));    //line00..127
               lcdcmd(0x00+((6*n*x)&0x0F));
               for(i=0;i<6;i++){
                       for(k=0;k<n;k++)
                               lcddat(cg3[i]&0xFF);
                       cg3[i]>>=8;
               }
       }
       x++;
}
void  putnstr(const  char  *p,int  n)
{
       while(*p)
               putnchar(*p++,n);
}
void  main()
{
       unsigned  int  i;
       unsigned  char  sync_mode=0;
       unsigned  char  bus_mode=0;
       unsigned  char  smp_phase=0;

       OSCCON  =  0x70;            //16MHz
       OSCTUNEbits.SPLLEN=1;      //16MHz*4=64MHz
       ADCON1  |=  0x0F;          //  Default  all  pins  to  digital
       ANSEL  =  0x00;              //all  digital
       ANSELH  =  0x00;
       TRISCbits.TRISC2=0;  //RC2=LED
       TRISCbits.TRISC4=0;  //RS
       TRISCbits.TRISC5=0;  //CS
       RS=1;
       CS=1;
       sync_mode  =  SPI_FOSC_64  ;
       bus_mode  =  MODE_11;  //CKP=1;CKE=0;
       smp_phase  =  SMPMID;
       OpenSPI(sync_mode,bus_mode,smp_phase  );
//  AQM1248  initialize
       lcdcmd(0xAE);
       lcdcmd(0xA0);
       lcdcmd(0xC8);
       lcdcmd(0xA3);

       lcdcmd(0x2C);
       delay_ms(2);
       lcdcmd(0x2E);
       delay_ms(2);
       lcdcmd(0x2F);

       lcdcmd(0x23);
       lcdcmd(0x81);
       lcdcmd(0x1C);

       lcdcmd(0xA4);
       lcdcmd(0x40);
       lcdcmd(0xA6);
       lcdcmd(0xAF);
//  very  small  font
       locate(0,0);
       putnstr(t1,1);
       locate(0,1);
       putnstr(t2,1);
       locate(0,2);
       putnstr(t3,1);
       locate(0,3);
       putnstr(t4,1);
       locate(0,4);
       putnstr(t1,1);
       locate(0,5);
       putnstr(t2,1);
       delay_ms(5000);
//
       while(1){
               for(i=0;i<3;i++){
                       locate(0,i);
                       putnstr(m1,2);  //double  scale
               }
               delay_ms(3000);
       //
               for(i=0;i<2;i++){
                       locate(0,i);
                       putnstr(m2,3);  //triple  scale
               }
               delay_ms(3000);
       //
               for(i=0;i<2;i++){
                       locate(0,i);
                       putnstr(m3,4);  //quadple  scale
               }
               delay_ms(3000);
       }
}

この記事へのコメント