最終更新日
記事公開日

PIC12F1822でLCDディスプレイ(AE-AQM1602A)を表示するシンプルなテストプログラム

PIC12F1822でLCDディスプレイ(AE-AQM1602A)を表示

秋月電子で以下のLCDディスプレイを購入しました。

I2c接続小型キャラクタLCDモジュール(16×2行・3.3V/5V)ピッチ変換キット AE-AQM1602A(KIT)

今回は、PIC12F1822を使って、このLCDディスプレイに文字を表示する方法を紹介します。

とりあえず、テスト用にシンプルなプログラムにしています。

回路図

PIC12F1822でLCDディスプレイ(AE-AQM1602A)を表示する電子回路

※SDA・SCLラインの10KΩ抵抗は、シリアル通信で必要なプルアップ抵抗です。

プログラム

/*
 * 
 *  PIC12F1822
 *  シリアル通信でLCDディスプレイへ(AE-AQM1602A)表示
 *                                   - 2021/02/15 -
 * 
 */

//ヘッダファイルの読み込み
//--------------------------------------------------------------
#include <xc.h>
#include <stdio.h>  // printfを使うために必要なライブラリ

// クロック周波数指定
//--------------------------------------------------------------
#define _XTAL_FREQ 32000000

// LCDディスプレイ(AE-AQM1602A)のアドレス
//--------------------------------------------------------------
#define LCD_addr 0x7C

// プロトタイプ宣言
//--------------------------------------------------------------
void I2C_init(void);
void I2C_start(void);
void I2C_stop(void);
void I2C_write(unsigned char dat);
void LCD_cmd(unsigned char cmd);
void LCD_char(unsigned char dat);
void LCD_init(void);
void LCD_clear(void);
void LCD_home(void);
void LCD_cursor(unsigned x,unsigned y);

// ============================================================
//
//                  メインプログラム
//
// ============================================================

/*              12F1822
 *                   ------        
 *             VDD -| 1      8 |- VSS
 *             RA5 -| 2      7 |- AN0/RA0
 *         AN3/RA4 -| 3      6 |- AN1/RA1/SCL → LCD(SCL)
 *             RA3 -| 4      5 |- AN2/RA2/SDA → LCD(SDA)
 *                   ------      
 */

void main() {
    
    //----------------------------------------------------------
    //               PICマイコン初期設定
    //----------------------------------------------------------
    OSCCON = 0b01110000;    // 内部クロック周波数:8MHz
    ANSELA = 0b00000000;    // 全てデジタルモード
    TRISA  = 0b00000110;    // SCL[6Pin]、SDA[5Pin]を入力ピンに設定
    
    //----------------------------------------------------------
    //            シリアル通信(I2C)初期設定
    //----------------------------------------------------------
    SSP1STAT = 0b10000000;  // 標準モード(100kHz)
    SSP1CON1 = 0b00101000;  // マスター(制御する側)に設定
    SSP1ADD = 0b01001111;   // 通信速度 = Fosc/(4*Clock)-1 = 32MHz/(4*100kHz)-1 = 79(10進数)
    
     //----------------------------------------------------------
    //              LCDディスプレイと通信
    //----------------------------------------------------------
    
    // ディスプレイの初期化
    LCD_init();
       
    // 1列目に表示
    LCD_cmd(0x80);
    printf("Hello World!");

    // 2列目に表示
    LCD_cmd(0xC0);
    printf("0123456789");
    
}

// ============================================================
//
//                     I2C 通信開始
//
// ============================================================
void I2C_start() {
    SEN = 1;
    while(SEN);
}
// ============================================================
//
//                     I2C 通信終了
//
// ============================================================
void I2C_stop() {
    SSP1IF = 0;
    PEN = 1;
    while(PEN);
    SSP1IF = 0;
}
// ============================================================
//
//                    I2C データ送信
//
// ============================================================
void I2C_write(unsigned char dat) {
    SSP1IF = 0;
    SSP1BUF = dat;
    while(!SSP1IF);
}

// ============================================================
//
//            LCDディスプレイの初期化
//
// ============================================================
void LCD_init() {
    __delay_ms(40); //40ms wait
    LCD_cmd(0x38);  //8bit,2line
    LCD_cmd(0x39);  //IS=1 : extention mode set
    LCD_cmd(0x14);  //Internal OSC Frequency
    LCD_cmd(0x7A);  //Contrast set
    LCD_cmd(0x56);  //Power/ICON/Contrast Control
    LCD_cmd(0x6C);  //Follower control
    __delay_ms(200);//200ms wait
    LCD_cmd(0x38);  //IS=0 : extention mode cancel
    LCD_cmd(0x0C);  //Display ON
    LCD_cmd(0x01);  //Clear Display
    __delay_ms(2);  //wait more than 1.08ms
}

// ============================================================
//
//                   LCDへコマンドを送信
//
// ============================================================
void LCD_cmd(unsigned char cmd) {
    I2C_start();
    I2C_write(LCD_addr);
    I2C_write(0x00);    // 0x00(コマンドの送信を示すbit)
    I2C_write(cmd);
    I2C_stop();
}

// ============================================================
//
//              LCDへ表示するデータの送信
//        printf文を使用するためにputch関数を使用する
//
// ============================================================
void putch(unsigned char text) {
    I2C_start();
    I2C_write(LCD_addr);
    I2C_write(0x40);    // 0x40(データの送信を示すbit)
    I2C_write(text);
    I2C_stop(); 
}

lcd_test.txt

※LCDディスプレイに文字を表示するために、「printf文」を使用しています。

printf文を使用する際は、

12行目:stdio.hライブラリのインクルード

149行目:putch関数

が必要になります。

また、printf文を使用する際にフォーマット指定子を使うと、PIC12F1822ではメモリ不足となりエラーが表示されます。

例:printf(“%3d”,count);

「%3d」の部分がフォーマット指定子です。

ちなみに、printf文を使用せずにLCDディスプレイに文字を表示しようとすると、説明書に掲載されているキャラクターパターンを見ながら、ビットで送らないといけないから大変です。

LCDディスプレイのキャラクターパターン表
この記事のURLをコピー

メールアドレスは公開されませんのでご安心ください。また、* が付いている欄は必須項目となります。

内容に問題なければ、下記の「コメントを送信する」ボタンを押してください。

関連情報

運営者プロフィール
コダマ

職業はIT系フリーランス。過去、電子配線業務の経験が10年ある為、はんだづけも得意です。宮崎県在住、30代・2児の父親。