Curiosity開発ボードには、ユーザーが追加回路を簡単に取り付けられる拡張用コネクターの準備があります。今回はそのコネクターに取り付ける 8文字 x 2行のLCD表示器を作成します。
I2C接続 8文字 x 2行のLCD表示器を使用しました。【P/N M-09109】秋月電子通商の I2C接続小型LCD (AE-AQM0802 ) を、2.54mmピッチの変換基板に取り付けたモジュールです。
ユニバーサルボードをCuriosityの拡張コネクターに合わせて、下図のようにカットしました。基板に取り付けたピンヘッドとの配線にはメッキ線を使っています。
拡張コネクダーは 10 pin x 2 列ですが、配線するのは 4 つの pin だけになります。ただ取り付けたときの安定感を考え4隅に最低でも 2pin を半田付けしています。また、組み立てた時、画面がユニバーサルボードと水平になるようピンヘッダーからピンを抜き基礎部分だけを取り出して、スペーサーとし画面裏に接着しています。
メッキ線をはんだ付けします。LCD基板とユニバーサルボードの間はシリコンボンドで接着しました。
下図を参考に組み立ててください。
作成したLCD表示器の回路図 SDA, SCL は、LCDモジュール内の10 kの抵抗で終端されています。
確認のため、メッセージを表示させるだけのプログラムを作成しました。新しいプロジェクトを作成し、以下のリスト内容を main,c として、コンパイル後、Curiosityボードの PIC16F1619 に書き込んでください。Curiosityボードに取り付けたLCDに文字が表示されます。
/****************************************************************
* main.c データをLCDに表示する。
* 秋月(ACM1602NI)I2C LCD表示器を使用 1MHz (内部クロック)
* PIC16F1619 MPLAB X IDE v5.40 with XC8 v2.20
* Copyright (c) 2020 iwamoto All Rights Reserved
* **************************************************************/
#include <xc.h>
#define _XTAL_FREQ 1000000
//****************************************************************
// 調整用定数
//****************************************************************
#define CONTRAST 0x28 // for 3.3V
#pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON
#pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON
#pragma config WDTCPS = WDTCPS1F, WDTE = OFF
#pragma config WDTCWS = WDTCWSSW, WDTCCS = SWC
//******************* プロトタイプ *******************************
void i2cByteWrite(char, char, char);
void i2cTxData(char);
void LCD_dat(char);
void LCD_cmd(char);
void LCD_clr(void);
void LCD_posyx(char,char);
void LCD_int(void);
void LCD_put(char);
void LCD_ROMstr(const char *);
/*********************************************************
Main application
*********************************************************/
void main(void)
{
OSCCON = 0x58; // FOSC; PLL disabled; 1MHz_HF;
// SSP1関連設定 -----------------------------------------------
TRISB4 = 1; // RB4,RB6をデジタル入力に指定
TRISB6 = 1;
ANSB4 = 0;
ANSB6 = 0;
SSPCLKPPS = 0b00001110; // RB6をCLK入力に指定
RB6PPS = 0b00010000; // RB6をCLK出力に指定
SSPDATPPS = 0b00001100; // RB4をDATに入力指定
RB4PPS = 0b00010001; // RB4をDAT出力に指定
SSP1STAT = 0b10000000; // スルーレート制御はOff
SSP1ADD = 3; // クロック設定 65k@1MHz
SSP1CON1 = 0b00101000; // I2C Master modeにする
// --------------------------------------------------------
LCD_int(); // LCDを初期化
LCD_ROMstr("LCD Disp"); // 下段に追記
LCD_posyx(1,1); // 下段にカーソル移動
LCD_ROMstr("i2c 8x2"); // 下段に追記
while (1)
{
// Add your application code
}
}
//***************************************************************
// I2C 関連
//****************************************************************
//-------- ByteI2C送信
void i2cByteWrite(char addr, char cont, char data){
SSP1CON2bits.SEN = 1; // Start condition 開始
while(SSP1CON2bits.SEN); // Start condition 確認
i2cTxData(addr); // アドレス送信
i2cTxData(cont); // 制御コード送信
i2cTxData(data); // データ送信
SSP1CON2bits.PEN = 1; // Stop condition 開始
while(SSP1CON2bits.PEN); // Stop condition 確認
}
//-------- Data送信
void i2cTxData(char data){
PIR1bits.SSP1IF = 0; // 終了フラグクリア
SSP1BUF = data; // データセット
while(!PIR1bits.SSP1IF); // 送信終了待ち
}
//**************************************************************
// LCD
//***************************************************************
//-------- 1文字表示
void LCD_dat(char chr){
i2cByteWrite(0x7C, 0x40, chr);
__delay_us(50); // 50μsec
}
//-------- コマンド出力
void LCD_cmd(char cmd){
i2cByteWrite(0x7C, 0x00, cmd);
if(cmd & 0xFC) // 上位6ビットに1がある命令
__delay_us(50); // 50usec
else
__delay_ms(2); // 2msec ClearおよびHomeコマンド
}
//-------- 全消去
void LCD_clr(void){
LCD_cmd(0x01); //Clearコマンド出力
}
//-------- カーソル位置指定
void LCD_posyx(char ypos, char xpos){
unsigned char pcode;
switch(ypos & 0x03){
case 0: pcode=0x80;break;
case 1: pcode=0xC0;break;
}
LCD_cmd(pcode += xpos);
}
//-------- 初期化
void LCD_int(void){
__delay_ms(100);
LCD_cmd(0x38); // 8bit 2行 表示命令モード
LCD_cmd(0x39); // 8bit 2行 拡張命令モード
LCD_cmd(0x14); // OSC BIAS 設定1/5
// コントラスト設定
LCD_cmd(0x70 + (CONTRAST & 0x0F));
LCD_cmd(0x5C + (CONTRAST >> 4));
LCD_cmd(0x6B); // Ffollwer
__delay_ms(100);
__delay_ms(100);
LCD_cmd(0x38); // 表示命令モード
LCD_cmd(0x0C); // Display On
LCD_cmd(0x01); // Clear Display
}
//-------- Rom 文字列出力
void LCD_ROMstr(const char *str){
while(*str) //文字列の終わり(00)まで継続
LCD_dat(*str++); //文字出力しポインタ+1
}