- 追加された行はこの色です。
- 削除された行はこの色です。
#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(はい[21],普通[0],いいえ[0])
#vote(はい[22],普通[0],いいえ[0])
- このプログラムを動かしてからG先生の本を読むと理解が進みます GOOD! -- [[あっこちゃん]] &new{2015-05-10 (日) 17:51:08};
#comment_nospam