/**************************************************** * 液晶表示器制御ライブラリ for PIC24FJシリーズ * 内蔵関数は以下 * delay_us() ----- usec単位ディレイ * delay_ms() ----- msec単位ディレイ * lcd_init() ----- 初期化 * lcd_cmd(cmd) ----- コマンド出力 * lcd_data(chr) ----- 1文字表示出力 * lcd_clear() ----- 全消去 *****************************************************/ #include "LCD_Lib3.h" //////// データ出力サブ関数 void lcd_out(char code, char flag){ // Set upper 4 bits Data on LATB12-LATB15 LCD_DATA = (LCD_DATA & 0x0FFF) | ((unsigned int)(code & 0xF0)<<8); if (flag == 0) LCD_RS = 1; // 表示データの場合 else LCD_RS = 0; // コマンドデータの場合 delay_us(1); // セットアップ時間確保 LCD_E = 1; // E(STB)出力High delay_us(1); // パルス幅確保 LCD_E = 0; // E(STB)出力Low } /////// 初期化関数 void lcd_init(void){ // delay_ms(20); /// Mod // Allow a delay(minimamum is 15ms) // delay_ms(25); // Error LCD Movement (The cause of Low Temperrature) delay_ms(30); 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 B=D=1 C=0 lcd_cmd(0x06); // entry I/D=1 S=0 lcd_cmd(0x02); // cursor home } //////// 1文字表示関数 void lcd_data(char asci){ lcd_out(asci, 0); // 上位4ビット出力 lcd_out(asci<<4, 0); // 下位4ビット出力 delay_us(50); // 50μsec待ち } /////// コマンド出力関数 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); // 50usec待ち } /////// 全消去関数 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 } } //////// usec単位ディレイ関数 void delay_us(int usec){ usec = (int)(CLOCK*usec)/ 10; while(usec) { asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); asm("NOP"); usec--; } } /////// msec単位ディレイ関数 void delay_ms(int msec){ int i; for(i=0; i< msec; i++) delay_us(1000); }