---
---
秋月電子から販売されている超小型グラフィックLCDモジュール(AQM1248A)を接続しました。PICがマスターとなり、SPI MODE II で、データをLCDモジュールに送信します。グラフィックLCDモジュールに文字を表示させるには、PICが文字コードに対応するグラフィックパターンを作成し、LCDモジュールに送信します。 このプログラム例では、プロポーショナルの5x7ドットの文字データはAQM1248A.h に格納してあります。
文字やアイコンを画面に表示するだけのプログラムです。プログラムは、LCD表示関連関数を呼び出して、文字を表示させます。具体的には、他のLCDと同様な以下の手順でプログラムします。
*注意*
PIC16F1455のSPIピンは、ICSPピンと同一です。 PICにプログラムするためPICkit3を接続したままにすると、このピンがPICkit3内部で4.7kΩの抵抗でプルダウンされるため、SPI機能が動作しません。 正常に動作させるには、PICにプログラムを書き込んだ後で、PICkit3を回路から取り外す必要があります。
<プログラム> main.c
//*********************************************************
// File name: SPI Mode II Grafic LCD
// 秋月 AQM1248A 用
//
// RC0 SPISCK idle時:Hi SCKの立下でデータ変更
// RC1 SPI_CS 0:有効 1:無効
// RC2 SPISDO
// RC3 SPI_RS 0:コマンド 1:データ
// Language: MPLABX XC8
// Target: PIC16F1455
// Copyright (c) 2012 iwamoto All Rights Reserved
//*********************************************************
#include <xc.h>
#include "AQM1248A.h"
#define _XTAL_FREQ 16000000 // delay_ms(x) のための定義
//************* Config ***********************************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x
#pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF
//////////// Main //////////////////////////////////
void main(void){
unsigned char i,ypos,xpos;
OSCCON = 0b00111100; // 内部クロック16Mhz
ANSELC = 0; // PortCをデジタルI/Oにする
mInitLCD_IO (); // LCD制御用I/O 設定
mInitSPI(); // SPI Mode II 設定
LCD_int (); // Grafic LCD 初期設定
ypos = 0; xpos = 10; // 文字表示位置
xpos = LCD_ROMstr3x("ABC",ypos,xpos); // 3倍文字列表示
ypos = 1;
xpos = LCD_ROMstr2x("ABC",ypos,xpos); // 2倍文字列表示
ypos = 2;
xpos = LCD_ROMstr1x("ABC",ypos,xpos); // 通常文字列表示
LCD_posyx (4,20); // 文字表示位置
LCD_dat('S'); // 通常文字表示
LCD_ROMstr("PI LCD AQM1248A"); // 通常文字列表示
LCD_posyx (5,0); // 下段枠表示位置
for(i=0; i<128 ; i+=2) { // コラムデータを順に取得
LCD_ram(0b11101000); // 下段枠文様
LCD_ram(0b11010000);
}
while(1);
}
AQM1248A.h
/********************************************************************
FileName: Grafic LCD AQM1248A.h 用ライブラリ
Processor: PIC16F1455
Compiler: Microchip XC8
プロポーショナルな最大5x7dotの文字パターンを提供するとともに
以下の機能も実現する
mInitLCD_IO() G_LCDで使用するPICのI/Oピンを初期化する
mInitSPI() PICのSPI機能を初期化する
LCD_int () G_LCDを初期化する
LCD_cmd (cmd) G_LCDにコマンドデータを送信する
LCD_dat (chr) 文字コードchrを文字パターンに変換し
G_LCDに文字を表示する
LCD_ram (dat) G_LCDにグラフィックデータを送信する
LCD_clr () G_LCDの表示RAMを全消去する
LCD_posyx (ypos, xpos) G_LCDの表示RAMをアドレスを指定する
LCD_str(add) PICのRAM領域にある文字列をG_LCDに表示する
LCD_ROMstr(r_add) PICのROM領域にある文字列をG_LCDに表示する
以下は、文字表示した後で、次の表示位置xposを返す
xpos = LCD_chr1x(chr, ypos, xpos) 通常文字
xpos = LCD_str1x(add, ypos, xpos) RAM領域通常文字列
xpos = LCD_ROMstr1x(add, ypos, xpos) ROM領域通常文字列
xpos = LCD_chr2x(chr, ypos, xpos) 2倍拡大文字
xpos = LCD_str2x(add, ypos, xpos) RAM領域2倍拡大文字列
xpos = LCD_ROMstr2x(r_add, ypos, xpos) RAM領域2倍拡大文字列
xpos = LCD_chr3x(chr, ypos, xpos) 3倍拡大文字
xpos = LCD_str3x(add, ypos, xpos) RAM領域3倍拡大文字列
xpos = LCD_ROMstr3x(r_add, ypos, xpos) RAM領域3倍拡大文字列
引数の意味とデータ型
cmd : char型データ G_LCDへのコマンドデータ
dat : char型データ G_LCDへのグラフィックデータ
chr : char型データ G_LCDに表示する文字のコードデータ
ypos : char型データ G_LCDの表示RAMの縦(page)位置
ypos : unsigned char型データ G_LCDの表示RAMの横(column)位置
add : RAM領域の文字列開始アドレスポインタ
r_add : ROM領域の文字列開始アドレスポインタ
Copyright (c) 2014 iwamoto All Rights Reserved
********************************************************************
File Description:
Change History:
Rev Date Description
1.0 20014/1/2 Initial release
********************************************************************/
/******** プロトタイプ *************************/
void LCD_int (void);
void LCD_cmd (char );
void LCD_dat (char );
void LCD_ram (char );
void LCD_clr (void );
void LCD_posyx (char, unsigned char );
void LCD_str(char *);
void LCD_ROMstr(const char *);
unsigned char LCD_chr1x(char, char, unsigned char);
unsigned char LCD_str1x(char *, char, unsigned char);
unsigned char LCD_ROMstr1x(const char *, char, unsigned char);
unsigned char LCD_chr2x(char, char, unsigned char);
unsigned char LCD_str2x(char *, char, unsigned char);
unsigned char LCD_ROMstr2x(const char *, char, unsigned char);
unsigned char LCD_chr3x(char, char, unsigned char);
unsigned char LCD_str3x(char *, char, unsigned char);
unsigned char LCD_ROMstr3x(const char *, char, unsigned char);
/******** クロックの指定 *************************/
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 16000000
#endif
/** Grafic LCD 制御関連I/O *********************************************
RC3 SPI_RS LCD データ種別 0:コマンド 1:表示データ
RC1 SPI_CS チップセレクト 0:有効 1:無効
************************************************************************/
#define mInitLCD_IO() LATC3=1;LATC1=1;TRISC3=0;TRISC1=0;
#define SPI_RS LATC3
#define SPI_CS LATC1
/******* SSP(SPI) ******************************************************
SPI機能の設定 マスタモード、クロック = FOSC/4
バスモード アイドル時のクロック : Hi
(MODE_11) データ送信タイミング : クロックの立下
受信データサンプル : SMPMID (送信だけのため NA)
RC2/7 SPISDO データ出力
RC0/RB6 SPISCK idle時:Hi SCKの立下でデータ変更
************************************************************************/
#define mInitSPI() {TRISC2=0;TRISC0=0;SSPSTAT=0x00;SSPCON1=0x30;}
/******** キャラクタデータ (ASCII 0x20-0x7F) ************************
5x8 dot キャラクタデータを基本としているが、
5dotない幅の狭いフォント(!など)は0xFFで終端を示している
*********************************************************************/
const unsigned char chrom[96][5]={
{0x00,0x00,0xFF,0x00,0x00}, // 0x20, Space
{0x5F,0xFF }, // 0x21, ! x
{0x00,0x07,0x00,0x07,0x00}, // 0x22, " x
{0x14,0x7F,0x14,0x7F,0x14}, // 0x23, #
{0x24,0x2A,0x7F,0x2A,0x12}, // 0x24, $
{0x27,0x15,0x6B,0x54,0x72}, // 0x25, %
{0x36,0x49,0x56,0x20,0x50}, // 0x26, &
{0x0B,0x07,0x00,0xFF }, // 0x27, ' x
{0x1C,0x22,0x41,0xFF }, // 0x28, ( x
{0x41,0x22,0x1C,0xFF }, // 0x29, ) x
{0x2A,0x1C,0x7F,0x1C,0x2A}, // 0x2a, *
{0x08,0x08,0x3E,0x08,0x08}, // 0x2b, + x
{0x58,0x38,0xFF }, // 0x2c, , x
{0x08,0x08,0x08,0x08,0x08}, // 0x2d, -
{0x60,0x60,0xFF }, // 0x2e, . x
{0x20,0x10,0x08,0x04,0x02}, // 0x2f, /
{0x3E,0x51,0x49,0x45,0x3E}, // 0x30, 0
{0x42,0x7F,0x40,0xFF }, // 0x31, 1 x
{0x72,0x49,0x49,0x49,0x46}, // 0x32, 2
{0x22,0x41,0x49,0x49,0x36}, // 0x33, 3
{0x18,0x14,0x12,0x7F,0x10}, // 0x34, 4
{0x27,0x45,0x45,0x45,0x39}, // 0x35, 5
{0x3C,0x4A,0x49,0x49,0x30}, // 0x36, 6
{0x01,0x71,0x09,0x05,0x03}, // 0x37, 7
{0x36,0x49,0x49,0x49,0x36}, // 0x38, 8
{0x06,0x49,0x49,0x29,0x1E}, // 0x39, 9
{0x36,0x36,0xFF,0x00 }, // 0x3a, : x
{0x5B,0x3B,0xFF,0x00 }, // 0x3b, ; x
{0x08,0x14,0x22,0x41,0xFF}, // 0x3c, < x
{0x14,0x14,0x14,0x14,0x14}, // 0x3d, =
{0x41,0x22,0x14,0x08,0xFF}, // 0x3e, > x
{0x02,0x01,0x51,0x09,0x06}, // 0x3f, ?
{0x32,0x49,0x79,0x41,0x3E}, // 0x40, @
{0x7C,0x12,0x11,0x12,0x7C}, // 0x41, A
{0x41,0x7F,0x49,0x49,0x36}, // 0x42, B
{0x3E,0x41,0x41,0x41,0x22}, // 0x43, C
{0x41,0x7F,0x41,0x41,0x3E}, // 0x44, D
{0x7F,0x49,0x49,0x41,0x41}, // 0x45, E
{0x7F,0x09,0x09,0x01,0x01}, // 0x46, F
{0x3E,0x41,0x49,0x49,0x3A}, // 0x37, G
{0x7F,0x08,0x08,0x08,0x7F}, // 0x48, H
{0x41,0x7F,0x41,0xFF }, // 0x49, I
{0x20,0x40,0x41,0x3F,0x01}, // 0x4a, J
{0x7F,0x08,0x14,0x22,0x41}, // 0x4b, K
{0x7F,0x40,0x40,0x40,0x40}, // 0x4c, L
{0x7F,0x02,0x0C,0x02,0x7F}, // 0x4d, M
{0x7F,0x02,0x04,0x08,0x7F}, // 0x4e, N
{0x3E,0x41,0x41,0x41,0x3E}, // 0x4f, O
{0x7F,0x09,0x09,0x09,0x06}, // 0x50, P
{0x3E,0x41,0x51,0x21,0x5E}, // 0x51, Q
{0x7F,0x09,0x19,0x29,0x46}, // 0x52, R
{0x26,0x49,0x49,0x49,0x32}, // 0x53, S
{0x01,0x01,0x7F,0x01,0x01}, // 0x54, T
{0x3F,0x40,0x40,0x40,0x3F}, // 0x55, U
{0x07,0x18,0x60,0x18,0x07}, // 0x56, V
{0x7F,0x20,0x18,0x20,0x7F}, // 0x57, W
{0x63,0x14,0x08,0x14,0x63}, // 0x58, X
{0x03,0x04,0x78,0x04,0x03}, // 0x59, Y
{0x61,0x51,0x49,0x45,0x43}, // 0x5a, Z
{0x00,0x7F,0x41,0x41,0xFF}, // 0x5b, [ x
{0x02,0x04,0x08,0x10,0x20}, // 0x5c, ¥
{0x41,0x41,0x7F,0x00,0xFF}, // 0x5d, ] x
{0x04,0x02,0x01,0x02,0x04}, // 0x5e, ^
{0x40,0x40,0x40,0x40,0x40}, // 0x5f, _
{0x00,0x03,0x04,0xFF,0xFF}, // 0x60, ` x
{0x20,0x54,0x54,0x54,0x38}, // 0x61, a
{0x7F,0x28,0x44,0x44,0x38}, // 0x62, b
{0x38,0x44,0x44,0x44,0xFF}, // 0x63, c x
{0x38,0x44,0x44,0x28,0x7F}, // 0x64, d
{0x38,0x54,0x54,0x54,0x18}, // 0x65, e
{0x08,0x3F,0x09,0x09,0x02}, // 0x66, f
// {0x08,0x54,0x54,0x54,0x3C}, // 0x67, g
{0x18,0xA4,0xA4,0x9C,0x78}, // 0x67, g
{0x7F,0x08,0x04,0x04,0x78}, // 0x68, h
{0x44,0x7D,0x40,0xFF }, // 0x69, i x
{0x20,0x40,0x44,0x3D,0xFF}, // 0x6a, j x
{0x7F,0x10,0x28,0x44,0xFF}, // 0x6b, k x
{0x41,0x7F,0x40,0xFF }, // 0x6c, l x
{0x7C,0x04,0x78,0x04,0x78}, // 0x6d, m
{0x7C,0x08,0x04,0x04,0x78}, // 0x6e, n
{0x38,0x44,0x44,0x44,0x38}, // 0x6f, o
// {0x7C,0x14,0x14,0x14,0x08}, // 0x70, p
// {0x08,0x14,0x14,0x14,0x7C}, // 0x71, q
{0xFC,0x18,0x24,0x24,0x18}, // 0x70, p
{0x18,0x24,0x24,0x18,0xFC}, // 0x71, q
{0x7C,0x08,0x04,0x04,0x08}, // 0x72, r
{0x48,0x54,0x54,0x54,0x24}, // 0x73, s
{0x04,0x3F,0x44,0x44,0xFF}, // 0x74, t x
{0x3C,0x40,0x40,0x20,0x7C}, // 0x75, u
{0x1C,0x20,0x40,0x20,0x1C}, // 0x76, v
{0x3C,0x40,0x30,0x40,0x3C}, // 0x77, w
{0x44,0x28,0x10,0x28,0x44}, // 0x78, x
{0x0C,0x90,0x90,0x90,0x7C}, // 0x79, y
{0x24,0x64,0x54,0x4C,0x24}, // 0x7a, z
{0x08,0x36,0x41 ,0xFF}, // 0x7b, x
{0x00,0x7F,0x00 ,0xFF}, // 0x7c, | x
{0x41,0x36,0x08 ,0xFF}, // 0x7d, } x
{0x02,0x01,0x02,0x04,0x02}, // 0x7e, ‾ x
{0x7F,0x7F,0x7F,0x7F,0x7F}, // 0x7f, DELx
};
AQM1248A.c
/********************************************************************
FileName: Grafic LCD AQM1248A.c
Dependencies: See INCLUDES section
Processor: PIC16F1455
Compiler: Microchip XC8
Copyright (c) 2014 iwamoto All Rights Reserved
********************************************************************
File Description:
Change History:
Rev Date Description
1.0 20014/1/2 Initial release
********************************************************************/
#include <xc.h>
#include "AQM1248A.h"
//-------- G-LCDを初期化する --------------------------------------
void LCD_int (void){
LCD_cmd (0xAE); // Display = OFF
LCD_cmd (0xA0); // ADC = normal
LCD_cmd (0xC8); // Common output = revers
LCD_cmd (0xA3); // bias = 1/7
//--内部レギュレータを順番にON
LCD_cmd (0x2C); // power control 1
__delay_ms(2); // 2mS遅延
LCD_cmd (0x2E); // power control 2
__delay_ms(2); // 2mS遅延
LCD_cmd (0x2F); // power control 3
//--コントラスト設定
LCD_cmd (0x23); // Vo voltage resistor ratio set
LCD_cmd (0x81); // Electronic volume mode set
LCD_cmd (0x1C); // Electronic volume value set
//--表示設定
LCD_cmd (0xA4); // display all point normal(全点灯しない)
LCD_cmd (0x40); // display start line = 0
LCD_cmd (0xA6); // Display normal(白黒反転しない)
LCD_cmd (0xAF); // Display = ON
LCD_clr (); // データRAMを全消去
}
//-------- G-LCDにコマンドを一文字送信する -----------------------
void LCD_cmd (char cmd){
SPI_CS = 0; // チップセレクト有効
SPI_RS = 0; // コマンドデータ指定
SSPBUF = cmd; // データの送信を開始
while(!SSPSTATbits.BF); // 送信完了を待つ
cmd = SSPBUF; // BFをリセットするため空読み
SPI_CS = 1; // チップセレクト無効
}
//-------- G-LCD RAMに一バイト送信する ------------------------
void LCD_ram (char dat){
SPI_CS = 0; // チップセレクト有効
SPI_RS = 1; // 表示データ指定
SSPBUF = dat; // データの送信を開始
while(!SSPSTATbits.BF); // 送信完了を待つ
dat = SSPBUF; // BFをリセットするため空読み
SPI_CS = 1; // チップセレクト無効
}
//-------- G-LCDに一文字表示する --------------------------------
void LCD_dat (char dat){
char i,chptn;
dat -= 0x20; //配列アドレスを計算
for(i=0; i<5; i++) { //コラムデータを順に取得
chptn = chrom[dat][i];
if(chptn == 0xFF)break; //幅狭文字なら抜ける
LCD_ram(chptn); //コラムデータを転送
}
LCD_ram(0); //文字間隔を空ける
}
//-------- G-LCDのデータを全消去する ----------------------------
void LCD_clr (void){
unsigned char i,j;
for(j=0; j<8; j++) { //ページを更新
LCD_posyx (j,0); //ページを指定
for(i=0; i<128; i++) { //ページ内RAMデータを順に
LCD_ram (0); // クリア
}
}
}
//-------- カーソル位置指定 --------------------------------------
void LCD_posyx(char ypos, unsigned char xpos){
LCD_cmd(0xB0 | ypos); //ページを指定
LCD_cmd(0x10 | (xpos >> 4)); //ページ内RAMアドレスを
LCD_cmd(xpos & 0xF); // 分割し指定
}
//-------- 文字列出力 --------------------------------------------
void LCD_str(char *str){
while(*str) //文字列終端(00)まで継続
LCD_dat(*str++); //文字出力しポインタ+1
}
//-------- Rom 文字列出力 -----------------------------------------
void LCD_ROMstr(const char *str){
while(*str) //文字列終端(00)まで継続
LCD_dat(*str++); //文字出力しポインタ+1
}
//-------- 文字表示 ---------------------------------------------
// 文字コード、表示位置(ypos, xpos)を指定する。
// 文字を表示後、次の表示開始位置 xpos を返す
//----------------------------------------------------------------
unsigned char LCD_chr1x(char dat, char ypos, unsigned char xpos){
char i,chptn;
dat -= 0x20; //配列アドレスを計算
LCD_posyx( ypos, xpos); //上半分の表示位置を指定
for(i=0; i<5; i++) { //コラムデータを順に取得
chptn = chrom[dat][i];
if(chptn == 0xFF)break; //幅狭文字なら抜ける
LCD_ram(chptn); //コラムデータを転送
}
LCD_ram(0); //文字間隔を空ける
return i + 1 + xpos; //次の表示開始位置 xpos を返す
}
//-------- 文字列表示 ----------------------------------------
// 文字列アドレス、表示位置(ypos, xpos)を指定する。
// 文字を表示後、次の表示開始位置 xpos を返す
//------------------------------------------------------------
unsigned char LCD_str1x(char *str, char ypos, unsigned char xpos){
while(*str) //文字列終端(00)まで継続
xpos = LCD_chr1x(*str++, ypos, xpos); //文字出力し
return xpos; //次表示位置を返す
}
//-------- 文字列表示 ROMエリア--------------------------------------
// 文字列アドレス、表示位置(ypos, xpos)を指定する。
// 文字を表示後、次の表示開始位置 xpos を返す
//-------------------------------------------------------------------
unsigned char LCD_ROMstr1x(const char *str, char ypos, unsigned char xpos){
while(*str) //文字列終端(00)まで継続
xpos = LCD_chr1x(*str++, ypos, xpos); //文字出力しポインタ+1
return xpos; //次表示位置を返す
}
//-------- 拡大文字表示 --------------------------------------
// 文字コード、表示位置(ypos, xpos)を指定する。
// x2 サイズで文字を表示後、次の表示開始位置 xpos を返す
//------------------------------------------------------------
unsigned char LCD_chr2x(char dat, char ypos, unsigned char xpos){
unsigned char wch,fnt,i;
dat -= 0x20; //配列アドレスを計算
LCD_posyx( ypos, xpos); //上半分の表示位置を指定
for(i=0;i<5;i++){ //
wch = chrom[dat][i]; //キャラクタデータのLSB 4bit
if(wch == 0xFF)break; //情報を拡大してLCD RAMに転送
fnt = 0;
if(wch & 0b00000001)fnt = 0b00000011;
if(wch & 0b00000010)fnt |= 0b00001100;
if(wch & 0b00000100)fnt |= 0b00110000;
if(wch & 0b00001000)fnt |= 0b11000000;
LCD_ram(fnt); LCD_ram(fnt);
}
LCD_ram(0); LCD_ram(0);
LCD_posyx( ypos + 1, xpos); //下半分の表示位置を指定
for(i=0;i<5;i++){ //
wch = chrom[dat][i]; //キャラクタデータのMSB 4bit
if(wch == 0xFF)break; //情報を拡大してLCD RAMに転送
fnt = 0;
if(wch & 0b00010000)fnt = 0b00000011;
if(wch & 0b00100000)fnt |= 0b00001100;
if(wch & 0b01000000)fnt |= 0b00110000;
if(wch & 0b10000000)fnt |= 0b11000000;
LCD_ram(fnt); LCD_ram(fnt);
}
LCD_ram(0); LCD_ram(0);
return (i + 1) * 2 + xpos; //次の表示開始位置 xpos を返す
}
//-------- 拡大文字列表示 --------------------------------------
// 文字列アドレス、表示位置(ypos, xpos)を指定する。
// x2 サイズで文字を表示後、次の表示開始位置 xpos を返す
//--------------------------------------------------------------
unsigned char LCD_str2x(char *str, char ypos, unsigned char xpos){
while(*str) //文字列終端(00)まで継続
xpos = LCD_chr2x(*str++, ypos, xpos); //文字出力し
return xpos; //次表示位置を返す
}
//-------- 拡大文字列表示 ROMエリア--------------------------------------
// 文字列アドレス、表示位置(ypos, xpos)を指定する。
// x2 サイズで文字を表示後、次の表示開始位置 xpos を返す
//-----------------------------------------------------------------------
unsigned char LCD_ROMstr2x(const char *str, char ypos, unsigned char xpos){
while(*str) //文字列終端(00)まで継続
xpos = LCD_chr2x(*str++, ypos, xpos); //文字出力しポインタ+1
return xpos; //次表示位置を返す
}
//-------- 3倍拡大文字表示 Tri Font -----------------------------
// 文字コード、表示位置(ypos, xpos)を指定する。
// x3 サイズで文字を表示後、次の表示開始位置 xpos を返す
//---------------------------------------------------------------
unsigned char LCD_chr3x(char dat, char ypos, unsigned char xpos){
unsigned char wch,fnt,i;
dat -= 0x20; //配列アドレスを計算
LCD_posyx( ypos, xpos); //上半分の表示位置を指定
for(i=0;i<5;i++){ //
wch = chrom[dat][i]; //キャラクタデータのLSB 4bit
if(wch == 0xFF)break; //情報を拡大してLCD RAMに転送
fnt = 0;
if(wch & 0b00000001)fnt = 0b00000111;
if(wch & 0b00000010)fnt |= 0b00111000;
if(wch & 0b00000100)fnt |= 0b11000000;
LCD_ram(fnt); LCD_ram(fnt); LCD_ram(fnt);
}
LCD_posyx( ypos + 1, xpos); //下半分の表示位置を指定
for(i=0;i<5;i++){ //
wch = chrom[dat][i]; //キャラクタデータのMSB 4bit
if(wch == 0xFF)break; //情報を拡大してLCD RAMに転送
fnt = 0;
if(wch & 0b00000100)fnt |= 0b00000001;
if(wch & 0b00001000)fnt |= 0b00001110;
if(wch & 0b00010000)fnt |= 0b01110000;
if(wch & 0b00100000)fnt |= 0b10000000;
LCD_ram(fnt); LCD_ram(fnt); LCD_ram(fnt);
}
LCD_posyx( ypos + 2, xpos); //下半分の表示位置を指定
for(i=0;i<5;i++){ //
wch = chrom[dat][i]; //キャラクタデータのMSB 4bit
if(wch == 0xFF)break; //情報を拡大してLCD RAMに転送
fnt = 0;
if(wch & 0b00100000)fnt |= 0b00000011;
if(wch & 0b01000000)fnt |= 0b00011100;
if(wch & 0b10000000)fnt |= 0b11100000;
LCD_ram(fnt); LCD_ram(fnt); LCD_ram(fnt);
}
LCD_ram(0); LCD_ram(0); LCD_ram(0);
return (i + 1) * 3 + xpos; //次の表示開始位置 xpos を返す
}
//-------- 3倍拡大文字列表示 --------------------------------------
// 文字列アドレス、表示位置(ypos, xpos)を指定する。
// x3 サイズで文字を表示後、次の表示開始位置 xpos を返す
//-----------------------------------------------------------------
unsigned char LCD_str3x(char *str, char ypos, unsigned char xpos){
while(*str) //文字列終端(00)まで継続
xpos = LCD_chr3x(*str++, ypos, xpos); //文字出力し
return xpos; //次表示位置を返す
}
//-------- 3倍拡大文字列表示 ROMエリア--------------------------------------
// 文字列アドレス、表示位置(ypos, xpos)を指定する。
// x3 サイズで文字を表示後、次の表示開始位置 xpos を返す
//------------------------------------------------------------
unsigned char LCD_ROMstr3x(const char *str, char ypos, unsigned char xpos){
while(*str) //文字列終端(00)まで継続
xpos = LCD_chr3x(*str++, ypos, xpos); //文字出力しポインタ+1
return xpos; //次表示位置を返す
}