#freeze
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
*I2C通信LCD表示法(16F1827:XC8) [#b8c238ab]

信号線2本で接続できるI2C通信の液晶ディスプレイ(LCD:Liquid Crystal Display)
が2012年4月から秋月で販売を開始した。
ACM1602NI-FLW-FBW-M01 800円
http://akizukidenshi.com/catalog/g/gP-05693/
以前のLCDは7本の信号線を必要としていたので信号線が2本のみは、配線が非常に
シンプルになり、LCDがとても使い易いアイテムになりました。

今回↓このページを参考に
http://sky.geocities.jp/home_iwamoto/P16F145x/P16_L02a.htm
16F1827で、8MHzで、I2C通信プルアップをPICのウィークプルアップを利用し
I2C通信LCDの稼働を確認してみました。プログラム言語はXC8です。 2013/12/29

|&attachref(TS3V0003.JPG,zoom,200x300,button){新しい写真添付};|&attachref(16F1827ピン配置.JPG,zoom,200x250,button){新しい写真添付};|

 //  データをI2C LCDに表示する。
 //    秋月(ACM1602NI)I2C LCD表示器\800への書き込み
 //    http://akizukidenshi.com/catalog/g/gP-05693/
 //    「LCD Disp Test」と液晶表示する。
 //     1)Define I/O PORT
 //                   --PIC16F1827--
 //           SDA  :  SDA1:PORTB(1) pin7
 //           SCL  :  SCL1:PORTB(4) pin10
 //     2)OSC
 //         8MHz (内部クロック)
 //
 //    Language: MPLABX v1.90  XC8 v1.20
 //    Target: PIC16F11827 電源:3.3V
 // 参考ページ:http://sky.geocities.jp/home_iwamoto/P16F145x/P16_L02a.htm
 // Copyright (c) 2012 iwamoto All Rights Reserved
 //*********************************************************
 #include <xc.h>
 #define _XTAL_FREQ 8000000 //PICのクロックをHzで設定(8MHz)
 
 //************* Config  ***********************************
 #pragma config FOSC = INTOSC, WDTE = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
 #pragma config PLLEN = OFF, STVREN = OFF, LVP = OFF
 
 //********************************************************
 void i2cByteWrite(char, char, char);    // i2c byte送信
 void i2cTxData(char);                   // i2c SSPBUF セット
 void LCD_dat(char);                     // 1文字表示
 void LCD_cmd(char);                     // コマンド出力
 void LCD_clr(void);                     // 全消去
 void LCD_int(void);                     // 初期化
 void LCD_str(char *);                   // 文字列表示
 void LCD_ROMstr(const char *);          // ROM文字列表示
 void LCD_posyx(char,char);              // カーソル位置指定
 void LCD_hex(char);                     // 16進文字変換表示
 
 //////////// Main //////////////////////////////////
 void main(void){
     char msgStart[] ="LCD Test";
     unsigned char num = 0;
     OSCCON = 0b01110000;           // PLL:OFF, 内部クロック8MHzで駆動
     ANSELB = 0b00000000;           // RB7(AN6)-RB1(AN11)は全て0:デジタルI/Oとする
     TRISB  = 0b11111111;           // PortBを全て1:入力I/Oにする
     OPTION_REGbits.nWPUEN = 0;     // 0:PORTB内部プルアップ利用に設定
     WPUBbits.WPUB1 = 1;            // RB1をI2C通信のウィークプルアップ
     WPUBbits.WPUB4 = 1;            // RB4をI2C通信のウィークプルアップ
     SSPCON1 = 0b00101000;          // I2Cマスターモード指定
     SSPSTAT = 0b00000000;          // I2C STATUSの設定
     SSPADD  = 19;                  // I2Cクロック周波数100KHz(=(19+1)*4/8MHz)
     LCD_int();                     // LCD初期化
     // ------------------------------------------------------
     LCD_str(msgStart);             // 1行目に表示
     LCD_dat(' ');
     LCD_dat('!');
     // ------------------------------------------------------
     LCD_posyx(1,0);                // 2行目に表示
     LCD_ROMstr("1234567890123456");
     while(1){
         LCD_posyx(0,14);           // 1行14文字目に表示
         LCD_hex(num++);            // 数値を表示し、+1する
         __delay_ms(1000);          // 1000msec
     }
 }
 
 //-------- i2cで1byteデータを送信する -----------------------
 //  以下の引数が必要
 //  addr : Slaveのアドレス
 //  cont : Slaveへ制御コード
 //  data : 送信するデータ
 //  NACKやBus衝突などの対応は行っていない
 // -----------------------------------------------------------
 void i2cByteWrite(char addr, char cont, char data){
     SSPCON2bits.SEN = 1;           // Start condition 開始
     while(SSPCON2bits.SEN);        // Start condition 確認
     i2cTxData(addr);               // アドレス送信
     i2cTxData(cont);               // 制御コード送信
     i2cTxData(data);               // データ送信
     SSP1IF = 0;                    // 終了フラグクリア
     SSPCON2bits.PEN = 1;           // Stop condition 開始
     while(SSPCON2bits.PEN);        // Stop condition 確認
 }
 
 //-------- SSPBUFに1文字保存し送信終了を待つ -----------------
 void i2cTxData(char data){
     SSP1IF = 0;                    // 終了フラグクリア
     SSPBUF = data;                 // データセット
     while(!SSP1IF);                // 送信終了待ち
 }
 
 //-------- 1文字表示 --------------------------------------
 void LCD_dat(char chr){
     i2cByteWrite(0xA0, 0x80, chr);
     __delay_us(60);                // 60μsec
 }
 //-------- コマンド出力 --------------------------------------
 void LCD_cmd(char cmd){
     i2cByteWrite(0xA0, 0x00, cmd);
     if(cmd & 0xFC)                 // 上位6ビットに1がある命令
         __delay_us(60);            // 60usec
     else
         __delay_ms(3);             // 3msec 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;  // 1行目
         case 1: pcode=0xC0;break;  // 2行目
         case 2: pcode=0x94;break;  // 3行目
         case 3: pcode=0xD4;break;  // 4行目
     }
     LCD_cmd(pcode += xpos);        // 横位置を加える
 }
 //-------- 文字列出力 -----------------------------------------
 void LCD_str(char *str){
     while(*str)                    //文字列の終わり(00)まで継続
         LCD_dat(*str++);           //文字出力しポインタ+1
 }
 //-------- Rom 文字列出力 ------------------------------------
 void LCD_ROMstr(const char *str){
     while(*str)                    //文字列の終わり(00)まで継続
         LCD_dat(*str++);           //文字出力しポインタ+1
 }
 //-------- 16進文字変換表示 --------------------------------
 void LCD_hex(char c){
     const char hexch[] ="0123456789ABCDEF";
     LCD_dat(hexch[c >> 4]);        //上位4bit表示
     LCD_dat(hexch[c & 0xF]);       //下位4bit表示
 }
 
 //-------- 初期化 --------------------------------------
 void LCD_int(void){
     __delay_ms(100);               // 電源安定するまでの時間
     LCD_cmd(0x38);                 // 8bit 2行 表示命令モード
     LCD_cmd(0x0C);                 // Display on Cursor=0 Blink=0
     LCD_cmd(0x06);                 // Entry Inc/Dec=1 Shift=0
     LCD_cmd(0x01);                 // Clear Display
 }


★この情報は役に立ちましたか?
#vote(はい[9],普通[0],いいえ[0])

#comment_nospam