- 最終更新日
- 記事公開日
PIC12F1822でLCDディスプレイ(AE-AQM1602A)を表示するシンプルなテストプログラム
秋月電子で以下のLCDディスプレイを購入しました。
I2c接続小型キャラクタLCDモジュール(16×2行・3.3V/5V)ピッチ変換キット AE-AQM1602A(KIT)
今回は、PIC12F1822を使って、このLCDディスプレイに文字を表示する方法を紹介します。
とりあえず、テスト用にシンプルなプログラムにしています。
回路図
※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ディスプレイに文字を表示するために、「printf文」を使用しています。
printf文を使用する際は、
12行目:stdio.hライブラリのインクルード
149行目:putch関数
が必要になります。
また、printf文を使用する際にフォーマット指定子を使うと、PIC12F1822ではメモリ不足となりエラーが表示されます。
例:printf(“%3d”,count);
「%3d」の部分がフォーマット指定子です。
ちなみに、printf文を使用せずにLCDディスプレイに文字を表示しようとすると、説明書に掲載されているキャラクターパターンを見ながら、ビットで送らないといけないから大変です。