/******************************************************************************************** * 液晶表示器制御ライブラリ for PIC18F * 内蔵関数は以下 * lcd_init() ----- 初期化 * lcd_cmd(cmd) ----- コマンド出力 * lcd_data(chr) ----- 1文字表示出力 * lcd_clear() ----- 全消去 * lcd_str() ----- 文字列表示 * lcd_cg_ram_user_set() ----- ユーザーキャラクタ書込み(追加) * lcd_posyx() ----- 位置指定 180702追加 * lcd_hex() ----- 16進表示 * * * 後閑さん作成の、 PIC24F用の液晶ライブラリ:LCD_Lib3.cを基に、 * PIC18用(XC8)に修正しました。 * * 2018/7/5 N.Ishii *********************************************************************************************/ #include #include "LCD_Lib_xc8.h" /// lcd char_gane ram user data table:追加 150209 char lcd_cg_ram_data[] = { 0,0x0e,0x11,0x11,0x11,0x0e,0,0, // White circle 0,0x0e,0x1f,0x1f,0x1f,0x0e,0,0, // Black circle /* 0x0a,0x1f,0x1f,0x1f,0x1f,0x0e,0x04,0, // harat 0,0x04,0x0e,0x1f,0x0e,0x04,0,0, // Dia 0x04,0x0e,0x1f,0x1f,0x1f,0x04,0x0e,0, // Spades 0x0e,0x0e,0x15,0x1f,0x15,0x04,0x0e,0, // Clover */ 0x1f,0x0e,0x04,0x04,0x04,0x04,0x04,0, // Ant 0,0,0,0,0,0x0f,0x0f,0, // Low Level 0,0,0,0x0f,0x0f,0x0f,0x0f,0, // Mid Level 0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0x0f,0, // Hi Level 0x15,0x0a,0x15,0x0a,0x15,0x0a,0x15,0, // Checkered 0x02,0x13,0x1f,0x1f,0x1c,0x14,0x14,0 // Smole Dog }; //------------------------------------------------------------ //////// データ出力サブ関数 void lcd_out(char code, char flag){ /// 液晶データ4bit(RC7,6,5,4)以外の機能ビットも同じRCポート上(RC3,2,1,0)に混在 /// するため、他の機能ビットの論理を変えないで、与えられた4bitコードを、RCポートの /// 上位4bitに与えるために、このような、AND, ORの操作が必要になる。 LCD_DATA = (LCD_DATA & 0x0F) | (code & 0xF0); if (flag == 0) LCD_RS = 1; // データの場合 else LCD_RS = 0; // コマンドデータの場合 __delay_us(1); LCD_E = 1; // strobe out __delay_us(1); LCD_E = 0; // reset strobe } //////// 1文字表示関数 void lcd_data(char asci){ lcd_out(asci, 0); // 上位4ビット出力 lcd_out(asci<<4, 0); // 下位4ビット出力 __delay_us(50); } /////// コマンド出力関数 void lcd_cmd(char cmd){ lcd_out(cmd, 1); // 上位4ビット出力 lcd_out(cmd<<4, 1); // 下位4ビット出力 if((cmd & 0x03) != 0) // Clear homeの場合 __delay_ms(2); // 2msec待ち else __delay_us(50); } /////// 全消去関数 void lcd_clear(void){ lcd_cmd(0x01); // 初期化コマンド出力 __delay_ms(15); // 15msec待ち } /////// 文字列出力関数 void lcd_str(char *str){ while(*str != 0x00){ // 文字列の終わり判定 lcd_data(*str); // 文字列1文字出力 str++; // ポインタ+1 } } /////// 初期化関数 void lcd_init(void){ __delay_ms(20); lcd_out(0x03, 1); // 8bit mode set __delay_ms(5); lcd_out(0x03, 1); // 8bit mode set __delay_ms(1); lcd_out(0x03, 1); // 8bit mode set __delay_ms(1); lcd_out(0x02, 1); // 4bit mode set __delay_ms(1); lcd_cmd(0x2E); // DL=0 4bit mode lcd_cmd(0x08); // display off C=D=B=0 // lcd_cmd(0x0D); // display on C=D=1 B=0 lcd_cmd(0x0C); // 表示ON・カーソルOFF lcd_cmd(0x06); // entry I/D=1 S=0 // lcd_cmd(0x02); // cursor home lcd_cmd(0x01); // 表示全クリア } ////////// カーソル位置指定 void lcd_posyx(char ypos, char xpos){ unsigned char pcode; switch(ypos){ case 0: pcode=0x80;break; case 1: pcode=0xC0;break; } lcd_cmd(pcode += xpos); } //////////// 16進文字変換表示 void lcd_hex(char c){ const char hexch[] ="0123456789ABCDEF"; lcd_data(hexch[c >> 4]); lcd_data(hexch[c & 0xF]); } //////// ユーザーキャラクタ書込み(表示)関数 void lcd_cg_ram_user_set(void) { unsigned char cg_ram_address; for (cg_ram_address = 0 ; cg_ram_address != 64 ; ++cg_ram_address) // 8*8 { lcd_cmd(cg_ram_address + 0x40); // CG RAM Address Set(cgramadd:8*3char) lcd_data(lcd_cg_ram_data[cg_ram_address]); } // this function excute after is from cg_ram }