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

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
Curiosity LCD表示器
2017-11-12

Curiosity開発ボードには、ユーザーが追加回路を簡単に取り付けられる拡張用コネクターの準備があります。今回はそのコネクターに取り付ける 8文字 x 2行のLCD表示器を作成します。

 

 

使用部品

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基板とユニバーサルボードの間はシリコンボンドで接着しました。

 

組み立てと注意事項

下図を参考に組み立ててください。

  1. ピンヘッダーを基板に取り付けます。
  2. LCDモジュールの取り付け部位以外の配線を完了します。
  3. 画面がボードと水平になるようピンヘッダー基礎部分だけを取り出して、スペーサーとし画面裏に接着します。
  4. 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
}