SSブログ

STM32F103+カラーLCD評価基板で文字を表示させる編 全角/半角混載OKですぅ。 [ARM&Cortex-M3]

※ソースコードのhtml変換はこれを使わせてもらっています。
http://noritan-micon.blog.so-net.ne.jp/2009-06-11
Dsc00192.jpgASCII文字の表示を出来るようにしました。

ASCII/日本語(Shift-JIS)の区別は、最初の文字コードが0x80を越えるか超えないかで判断できます。
日本語のFontは従来から使わせて頂いているFONTX形式のフリーフォントです。ASCII文字のFontデータは、ネットを探せばフリーの物が有るのでしょうけれど、まあ自分でFontデータを作るのは容易いので、作ります。



ascii_001.pngまずペイントソフトでスペース(0x20)から~(0x7E)までの文字を描画していき、これを2値のビットマップファイルとして保存します。
※単に文字を並べていっても、なかなか等間隔にならないので、その辺はちまちま調整が必要。今回もなんだかんだで30分位作業時間が掛かっている。

次にこのビットマップファイルをお手製のCソース変換ソフトを通してCソース化し、そのソースファイルをプロジェクトに組み込む訳です。
※以下がその変換ソフトのソース。

/* ------------------------------------------------------------------------ */
/*  Windows ビットマップファイルをCソースに変換する。                       */
/*                                                                          */
/*  変換出来るフォーマットはWindows BMP、2色、RGBです。                     */
/*  上記のフォーマットは、大概のペイントツールで可能でしょう。              */
/*                                        Copyright (C) 2007 - by hamayan   */
/* ------------------------------------------------------------------------ */
#include <stdio.h>
#include <stdlib.h>

typedef	struct	/*ビットマップファイルヘッダー*/
{
  char  bfType[2];  /*認識文字*/
  char  bfSize[4];  /*ファイルサイズ*/
  char  bfReserved1[2];  /*予約1*/
  char  bfReserved2[2];  /*予約2*/
  char  bfOffBits[4];  /*ピクセルデータまでのバイト数*/
} BITMAPFILEHEADER;

typedef  struct  /*ビットマップ情報ヘッダー*/
{
  char  biSize[4];  /*BITMAPFILEHEADERのサイズ*/
  char  biWidth[4];  /*ピクセルデータの幅*/
  char  biHeight[4];  /*ピクセルデータの高さ*/
  char  Planes[2];  /*カラープレーン数*/
  char  biBitCount[2];  /*色数*/
  char  biCompression[4];  /*圧縮形式*/
  char  biSizeImage[4];  /*ピクセルデータのサイズ*/
  char  biXPelsPerMeter[4];  /*水平解像度*/
  char  biYPelsPerMeter[4];  /*垂直解像度*/
  char  biClrUsed[4];  /*使用カラー数*/
  char  biClrImportant[4];  /*重要なカラー数*/
} BITMAPINFOHEADER;

typedef  struct  /*カラーパレット*/
{
  unsigned char  rgbBlue;  /*青の輝度*/
  unsigned char  rgbGreen;  /*緑の輝度*/
  unsigned char  rgbRed;    /*赤の輝度*/
  unsigned char  rgbReserved;  /*予約*/
} RGBQUAD;

typedef  struct  /*ファイル全体のフォーマット*/
{
  BITMAPFILEHEADER  bf;
  BITMAPINFOHEADER  bi;
  RGBQUAD        rgb[1];
} BITMAPFILEFORMAT;

int main( int argc, char *argv[] )
{
  char *FileBuffer;
  char *bmp;
  int  i,j,k,width,line,shift;
  long FileSz,curpos;
  BITMAPFILEFORMAT  *head;
  RGBQUAD        *rgb;
  FILE  *in,*out;

  if( argc != 2 && argc != 3 )
  {
    printf( "Parameter Error\n" );
    return EOF;
  }

  if( argc == 2 ) out = stdout;
  else
  {
    out = fopen( argv[2], "w+t" );
  }

  /*引数のファイルをOPENする。*/
  if( (in = fopen( argv[ 1 ], "rb" )) == NULL ) return EOF;

  /*ファイルのサイズを取得する。*/
  curpos = ftell( in );
  fseek( in, 0, SEEK_END );
  FileSz = ftell( in );
  fseek( in, curpos, SEEK_SET );
  FileBuffer = malloc( FileSz + 1 );

  /*ファイルの内容を取込み*/
  curpos = fread( FileBuffer, 1, FileSz, in );

  /*ファイルの内容を取り込んだので、CLOSEする。*/
  fclose( in );

  /*ファイルの情報を表示する。*/
  head = (BITMAPFILEFORMAT *)FileBuffer;

  /*意匠表示*/
  fprintf( out,
    "/* ------------------------------------------------------------------------ */\n"
    "/* 画像データテーブル                                                     */\n"
    "/*                                          designed by hamayan             */\n"
    "/*                                          Copyright (C) 2003 - by hamayan */\n"
    "/* ------------------------------------------------------------------------ */\n\n"
  );

  fprintf( out,  "/*\tGraphic Info*/\n" );
  fprintf( out,
    "/*\tType:%c%c*/\n"
    "/*\tFile size=%ld*/\n"
    "/*\tOffset=%ld*/\n\n",
    head->bf.bfType[0],head->bf.bfType[1],
    *((long *)head->bf.bfSize),
    *((long *)head->bf.bfOffBits)
  );

  fprintf( out,
    "/*\tHeader size=%ld*/\n"
    "/*\tWidth=%ld*/\n"
    "/*\tHeight=%ld*/\n"
    "/*\tPlanes=%d*/\n"
    "/*\tCount=%d*/\n"
    "/*\tImg size=%d*/\n"
    "/*\tX pics=%ld*/\n"
    "/*\tY pics=%ld*/\n"
    "/*\tColor Used=%d*/\n\n",
    *((long *)head->bi.biSize),
    *((long *)head->bi.biWidth),
    *((long *)head->bi.biHeight),
    *((short *)head->bi.Planes),
    *((short *)head->bi.biBitCount),
    *((long *)head->bi.biSizeImage),
    *((long *)head->bi.biXPelsPerMeter),
    *((long *)head->bi.biYPelsPerMeter),
    *((long *)head->bi.biClrUsed)
  );

  fprintf( out, 
    "const long PixWidth = %ld;\n"
    "const long PixHeight = %ld;\n",
    *((long *)head->bi.biWidth),
    *((long *)head->bi.biHeight)
  );

#define    BITCOUNT  (*((short *)head->bi.biBitCount))
#define    OFFBITS    (*((long *)head->bf.bfOffBits))
#define    HEIGHT    (*((long *)head->bi.biHeight) - 1)

  /*縦横サイズの調整*/
  width = *((long *)head->bi.biWidth);    /*横方向のbyte数を計算*/
  width = ((width - 1) * BITCOUNT / 8) + 1;
  line = (((width - 1) / sizeof(long)) + 1) * sizeof(long);

  /*左下を原点にしている為に、上下方向のみ入れ替えが必要となる。*/

  /*画像データをCソースファイルに変換する。*/
  fprintf( out, "\n/*\tparameter width = %d height = %d line = %d*/\n", width, HEIGHT + 1, line );
  fprintf( out, "const char GraphicBMPTable[] = \n" );
  fprintf( out, "{\n" );
  for( i = HEIGHT; i >= 0; i-- )  /*逆順に廻して行く*/
  {
    fprintf( out,  "\t" );
    bmp = (char *)head + (i * line) + OFFBITS;  /*パレット番号が登録されたテーブルから読み出し*/
    for( j = 0; j < width; j++ )
    {
      fprintf( out, "0x%02X,", ~(*bmp) & 0x00ff );
      bmp++;
    }
    putc( '\n', out );
  }
  fprintf( out, "};\n\n" );

  for( i = HEIGHT; i >= 0; i-- )  /*逆順に廻して行く*/
  {
    fprintf( out,  "/*\t" );
    bmp = (char *)head + (i * line) + OFFBITS;  /*パレット番号が登録されたテーブルから読み出し*/
    for( j = 0; j < width; j++ )
    {
      for( k = 0; k < 8; k++ )
      {
        fprintf( out, "%c", (*bmp & (0x80 >> k)) ? ' ' : '*' );
      }
      bmp++;
    }
    fprintf( out,  "*/\n" );
  }

  /*意匠表示*/
  fprintf( out,
    "\n"
    "/* ------------------------------------------------------------------------ */\n"
    "/* end of file                                                              */\n"
    "/*                                          designed by hamayan             */\n"
    "/*                                          Copyright (C) 2003 - by hamayan */\n"
    "/* ------------------------------------------------------------------------ */\n"
  );

  if( argc == 3 ) fclose( out );
  free( FileBuffer );
  return 0;
}

/* ------------------------------------------------------------------------ */
/*                                         Copyright (C) 2003 - by hamayan  */
/* ------------------------------------------------------------------------ */



これ出来上がったCソースは、やっぱり1ピクセル=1bitのデータなので、先にやった日本語Fontと同様にbit長を16bitに変換して使う必要が有ります。

まあその前にASCIIコードから該当のビットマップデータを取得する処理が必要ですので、それは以下の様にしました。
/*************************************************************************/
/* ASCII文字の表示                                                       */
/* ASCII文字は、横8ピクセル、縦14ピクセルで構成されている。              */
/* 文字範囲は、スペース(0x20)から~(0x7E)までの95文字。                  */
/* 失敗するとNULLポインターを返す。                                      */
/*************************************************************************/
static char *GetASCII( char *dst, int code )
{
  int i;
  char *ptr = dst;
  if( code < ' ' || code > '~' ) return 0;
  code -= ' ';  /*オフセット分を削除*/
  for( i = 0; i < ASCII_PixHeight; i++ )
  {
    *ptr++ = *(ASCII_GraphicBMPTable + code + (i * ASCII_PixWidth / 8));
  }
  return dst;
}

上記処理はあくまでもFontデータの取得のみなので、実際には1bit→16bit変換がこの後に続きますが、これは既に行っているので省略。

で、ASCII文字と日本語の混載文字列の表示例が冒頭の写真になります。


WiiRemoteプログラミング

WiiRemoteプログラミング

  • 作者: 白井 暁彦
  • 出版社/メーカー: オーム社
  • 発売日: 2009/07/25
  • メディア: 単行本



ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

ITRONプログラミング入門―H8マイコンとHOSで始める組み込み開発

  • 作者: 濱原 和明
  • 出版社/メーカー: オーム社
  • 発売日: 2005/04/25
  • メディア: 単行本



nice!(0)  コメント(0)  トラックバック(0) 

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。