//******************************************************************** // ソフトウエア I2C 液晶表示器 // LCD_int() ----- 初期化 // LCD_cmd(cmd) ----- コマンド出力 // LCD_dat(chr) ----- 1文字表示 // LCD_str(*str) ---- 文字列表示 // LCD_posyx(y,x) ---- カーソル位置指定、行 y、横位置 x // LCD_ROMstr(*str) --- ROM文字列表示 // LCD_clr() ----- 全消去 // LCD_icon_on(icn) --- 指定アイコンON // LCD_icon_off(icn) -- 指定アイコンOFF // LCD_icon_clrf() ---- 全アイコンOFF // LCD_hex(chr) ------ 16進文字変換表示 // ******************************************************************* #include #include #include "SW_i2cLCD.h" // ******************************************************************* // i2c 関連 // ******************************************************************* // i2c Start Condiotion ------------------------------------ void StartSwI2c(void){ SDA_out = 0; SDA_dir = 0; // SDAにLow出力 } // i2c Stop Condition -------------------------------------- void StopSwI2c(void){ SCL_out = 0; // SCL Low SDA_out = 0; // SDA Low SDA_dir = 0; // 出力モードに戻す SDA =Low Delay10TCYx(1); // 時間合わせ SCL_out = 1; // SCLをHigh Nop(); SDA_out = 1; // その後DAをHigh } // I2C 1バイト出力 ---------------------------------------- void WriteSwI2c( char data){ char bitMask; SDA_dir = 0; // SDA出力モード bitMask = 0x80; // ビット位置初期値 while(bitMask){ SCL_out = 0; // SCL Low if(data & bitMask) // 各ビットの確認 SDA_out = 1; // SDA Hi else SDA_out = 0; // SDA Low bitMask = bitMask >> 1; // ビット位置移動 SCL_out = 1; // SCL Hiに戻す Nop(); // 時間合わせ Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); Nop(); } // Ack Check SCL_out = 0; // SCL Low SDA_dir = 1; // OpenモードでACK確認 Delay10TCYx(1); // Ack Checkは行わない SCL_out = 1; // SCL Highに戻す } // --------- 表示データを送付 ------------------------------ void LCD_dat( char data){ StartSwI2c(); // スタート WriteSwI2c(0x7C); // アドレス WriteSwI2c(0x40); // 表示データ指定 WriteSwI2c(data); // データ出力 StopSwI2c(); // ストップ delay_30us; // 遅延 } // --------- 制御コマンドを送付 ---------------------------- void LCD_cmd( char cmd){ StartSwI2c(); // スタート WriteSwI2c(0x7C); // アドレス WriteSwI2c(0x00); // コマンド指定 WriteSwI2c(cmd); // コマンド出力 StopSwI2c(); // ストップ /* ClearかHomeか */ if((cmd == 0x01)||(cmd == 0x02)) delay_2ms; // 2msec待ち else delay_30us; // 30μsec待ち } // --------- 初期化関数 ------------------------------------ void LCD_int(void){ TRISpwr = 0; // LCD Power Pinを出力にする LCD_pwr = 1; // LCD Powerを供給する SCL_out = 1; // Clock をHighにする SDA_dir = 1; // SDAをOpen出力にする SCL_dir = 0; // SCLを出力にする delay_100ms; LCD_cmd(0x38); // 8bit 2line Normal mode LCD_cmd(0x39); // 8bit 2line Extend mode LCD_cmd(0x14); // OSC 183Hz BIAS 1/5 /* コントラスト設定 */ LCD_cmd(0x70 + (CONTRAST & 0x0F)); LCD_cmd(0x5C + (CONTRAST >> 4)); // LCD_cmd(0x6A); // Follower for 5.0V LCD_cmd(0x6B); // Ffollwer for 3.3V delay_100ms; delay_100ms; delay_100ms; LCD_cmd(0x38); // Set Normal mode LCD_cmd(0x0C); // Display On LCD_cmd(0x01); // Clear Display } // --------- 全消去関数 ------------------------------------ void LCD_clr(void){ LCD_cmd(0x01); //初期化コマンド出力 } //-------- カーソル位置指定 -------------------------------- void LCD_posyx(char ypos, char xpos){ unsigned char pcode; switch(ypos & 0x03){ case 0: pcode=0x80;break; // 最上位行 case 1: pcode=0xC0;break; // 2行目 case 2: pcode=0x94;break; // 3行目 case 3: pcode=0xD4;break; // 最上位行 } LCD_cmd(pcode += xpos); // 横位置指定 } //-------- 文字列出力 -------------------------------------- void LCD_str(char *str){ while(*str) //文字列の終わり(00)まで継続 LCD_dat(*str++); //文字表示 } //-------- Rom 文字列出力 ---------------------------------- void LCD_ROMstr(rom const char *str){ while(*str) //文字列の終わり(00)まで継続 LCD_dat(*str++); //文字出力しポインタ+1 } //-- 指定アイコン ON --------------------------------------- void LCD_icon_on(int icn){ LCD_cmd(0x39); // 拡張命令モード LCD_cmd(icn >> 8); // Icon アドレス LCD_dat(icn & 0xFF); // Icon ビット LCD_cmd(0x38); // 表示命令モード } //-- 指定アイコン OFF -------------------------------------- void LCD_icon_off(int icn){ LCD_cmd(0x39); // 拡張命令モード LCD_cmd(icn >> 8); // Icon アドレス LCD_dat(0x00); // Icon ビット LCD_cmd(0x38); // 表示命令モード } //-- 全アイコン OFF ---------------------------------------- void LCD_icon_clr(void){ unsigned char icn = 0x40; LCD_cmd(0x39); // 拡張命令モード while(icn <= 0x4F){ LCD_cmd(icn++); // Icon アドレス LCD_dat(0x00); // Icon ビット } LCD_cmd(0x38); // 表示命令モード } //-------- 16進文字変換表示 void LCD_hex(char c){ LCD_hxH(c); LCD_hxL(c); } //**************************************************************** // LCD_hxL(char) 引数の下位4ビットの16進文字を表示 // LCD_hxH(char) 引数の上位4ビットの16進文字を表示 //**************************************************************** char LCD_hxL(char c){ c = c & 0x0F; // 下位4ビットを取り出す if(c < 10){ // 9以下なら c += 0x30; // '0'の文字コードを加える }else{ // 10以上なら c += (0x41-10); // (c-10)に } // 'A'の文字コードを加える LCD_dat(c); } char LCD_hxH(char c){ // 上位4ビットを下位に移動し return LCD_hxL(c >> 4); // 下位の16進文字を返す }