PIC18F14K50の基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
SPI接続グラフィックLCD表示器(AQM1248A)

秋月電子から販売されているグラフィックLCD表示器(AQM1248A)モジュールの自作ライブラリLCD関数を説明します。 このライブラリではPICのLCD関連I/Oピンの指定やクロック周波数をヘッダーファイルで指定しています。

関数名 概要
LCD_int 液晶表示器初期化
LCD_cmd コマンド出力
LCD_dat 1文字表示
LCD_ram 表示RAMに1バイト送信
LCD_str 文字列表示 RAM領域
LCD_ROMstr 文字列表示 ROM領域
LCD_posyx カーソル位置指定、行 y、横位置 x
LCD_clr 表示データ全消去
LCD_chr3x 3倍拡大文字表示
LCD_str3x 3倍拡大文字列 RAM領域
LCD_ROMstr3x 3倍拡大文字列 ROM領域
LCD_chr2x 2倍拡大文字表示
LCD_str2x 2倍拡大文字列 RAM領域
LCD_ROMstr2x 2倍拡大文字列 ROM領域
LCD_chr1x 通常文字表示
LCD_str1x 通常文字列 RAM領域
LCD_ROMstr1x 通常文字列 ROM領域

  <LCD_int>    液晶表示器の初期設定

この関数で、液晶表示器の初期設定を行います。

使用例
LCD_int();

  <LCD_cmd>    コマンドバイトを送信

この関数で、引数の1バイトをコマンド送信します。
引数は送信する1バイトデータ。 

使用例
LCD_cmd(0x0A);

  <LCD_dat>    文字1バイトを送信

この関数で、引数で指定された文字をグラフィックパターンに変換し、LCDに表示します。引数は 0x20から0x7FまでのASCII文字1バイトデータ。 表示される文字は、5x7dotを基本としたプロポーショナルな文字で、見た目のバランスが考慮され文字幅の狭い 記号や、小文字は、横幅が5bitより狭く詰めて表示します。。

使用例
LCD_dat('A');

  <LCD_ram>    グラフィックパターン1バイトを送信

この関数で、引数で指定された1バイトのグラフィックパターンをLCD内の表示RAMに送信します。
表示RAMのアドレスは、あらかじめ LCD_posyx で指定しておきます。

使用例
LCD_ram(0x55);

  <LCD_str>    RAM領域に保存された文字列を送信

この関数で、文字を送信し、文字列が終了するまで連続して送信します。引数は表示される文字列の格納されている開始アドレス。 

使用例
char msg[] = "Hello";
LCD_str(msg);

  <LCD_ROMstr>    ROM領域に保存された文字列を送信

この関数で、文字を送信し、文字列が終了するまで連続して送信します。引数はROM領域に保存された文字列の開始アドレス。 

使用例
LCD_ROMstr("Hello ");

  <LCD_posyx>  カーソル位置指定、行 y、横位置 x

この関数で、液晶表示器のカーソル位置を指定します。第一引数は縦(Page)位置を示す(0-8)の値、第二引数は横位置を示す(0-127)の値を指定します。 

使用例
LCD_posyx(1,5);

  <LCD_clr>    全画面クリア

この関数で、表示文字をすべてクリアし、カーソルを左上に移動します。

使用例
LCD_clr();

  <LCD_chr3x>    3倍拡大文字表示

この関数で、指定した画面の表示位置に、縦横3倍に拡大した文字を表示し、表示文字の次の表示位置xposを返します。

使用例
chr = 'A';  xpos = 2;  xpos = 10;
xpos = LCD_chr3x ( chr, ypos, xpos );

プログラム例

文字やグラフィックパターンを画面に表示するプログラムです。プログラムは、メインプログラム(main.c)とLCD表示ライブラリAQM1248A.h、AQM1248A.c)から構成されています。 AQM1248A.c にLCD表示する手順が記載されており、AQM1248A.h には、ASCII文字コードをグラフィック文字に変更するための基本パターン(5x7dot)が定義されています。メインプログラムは、これらライブラリに登録されている関数を呼び出して、文字を表示させます。具体的には、たのLCDと同様な以下の手順で表示します。

  1. LCD_int() で表示器を初期化し、
  2. LCD_posyx() で表示位置を指定し、
  3. LCD_dat()、LCD_str()、などの関数で文字を表示

プロジェクトファイル C32_SPI_gLCDlib.zip

<プログラム> main.c
画面に文字を表示させる。LCDライブラリ関数で主な仕事をするため、メインプログラムは、非常に簡単になっています。

//  File name: SPI Mode II Grafic LCD
//
//     RC4  SPI_RS     0:コマンド  1:データ
//     RC5  SPI_CS     0:有効      1:無効
//     RC7  SPISDO
//     RB6  SPISCK     idle時:Hi   SCKの立下でデータ変更
//  Language: MPLABX XC8
//  Target: PIC18F14K50
//  Copyright (c) 2014 iwamoto All Rights Reserved

#include <xc.h>
#include "AQM1248A.h"
#define  _XTAL_FREQ 16000000      // delay_ms(x) のための定義

//-------------- コンフィグレーション --------------------------------
#pragma config MCLRE  = OFF
#pragma config PWRTEN = OFF, BOREN  = OFF, BORV   = 30
#pragma config WDTEN  = OFF, WDTPS  = 32768
#pragma config STVREN = ON
#pragma config FOSC   = IRC  //  内部クロック
#pragma config PLLEN  = ON,  CPUDIV = NOCLKDIV, USBDIV = OFF
#pragma config FCMEN  = OFF, IESO   = OFF, HFOFST = OFF
#pragma config LVP    = OFF, XINST  = OFF, BBSIZ  = OFF
#pragma config CP0    = OFF, CP1 = OFF, CPB = OFF, CPD = OFF
#pragma config WRT0   = OFF, WRT1 = OFF
#pragma config WRTB   = OFF, WRTC = OFF, WRTD = OFF
#pragma config EBTR0  = OFF, EBTR1 = OFF, EBTRB = OFF

void main(void){
    unsigned char i,ypos,xpos;
    OSCCON = 0b01110010;            // 内部クロック16Mhz
    mInitLCD_IO ();                 // LCD制御用I/O 設定
    mInitSPI();                     // SPI Mode II 設定
    ANSEL  = 0b00000000;            // 全てデジタルI/O
    ANSELH = 0b00000000;
    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);
}