//for LCD control define port and Pin ///////////////////////////////////////////////////////////////////////////// #define rs PIN_E1 // chip select #define rw PIN_C6 // read/write #define stb PIN_E2 // strobe #define Bmode 0x0F // 0x00:全てOUTPUT #define input_x input_B // RBポート設定 #define output_x output_B // RBポート設定 #define set_tris_x set_tris_B // RBポートの入出力設定 //define function ///////////////////////////////////////////////////////////////////////////// void lcd_xy (unsigned char x, unsigned char y); void lcd_out (int code, int flag); void lcd_data(int asci); void lcd_cmd (int cmd); void lcd_clear(); void lcd_init (); // LCD driver ///////////////////////////////////////////////////////////////////////////// void lcd_out(int code, int flag) // { // //output_x((code & 0xF0) | (input_x() & 0x0F)); // データ出力 output_x((code & 0xFF) | (input_x() & 0x0F)); // データ出力 if (flag == 0) // Flag=0:表示データの場合 { // output_low(rw); // RWはLo固定 delay_cycles(2); // 400ns待ち output_high(rs); // RSをHiに delay_cycles(2); // 400ns待ち output_high(stb); // EをHiに delay_cycles(3); // 600ns待ち(450ns以上待つ) output_low(stb); // EをLoに delay_cycles(2); // 400ns待ち output_low(rs); // RSをLoに delay_cycles(2); // 400ns待ち } // else // Flag=1:コマンドデータの場合 { // output_low(rw); // RWはLo固定 delay_cycles(2); // 400ns待ち output_low(rs); // RSをLoに delay_cycles(2); // 400ns待ち output_high(stb); // EをHiに delay_cycles(3); // 600ns待ち(450ns以上待つ) output_low(stb); // EをLoに delay_cycles(2); // 400ns待ち } // } // // //////// 1文字表示関数 void lcd_data(int asci) // { if (asci == '^') asci = 0x7F; // ~:→ ^:← lcd_out(asci, 0); // 上位4ビット出力 lcd_out(asci<<4, 0); // 下位4ビット出力 delay_us(50); // 50usec待ち } /////// コマンド出力関数 void lcd_cmd(int cmd) // { // lcd_out(cmd, 1); // 上位4ビット出力 lcd_out(cmd<<4, 1); // 下位4ビット出力 delay_ms(2); // 2msec待ち } /////// 全消去関数 void lcd_clear() // { // lcd_cmd(0x01); // 初期化コマンド出力 delay_ms(5); // 5msec待ち(15ms必要?) } /////// 初期化関数 void lcd_init() // { // set_tris_x(Bmode); // 全ピン出力 delay_ms(15); // 15ms待ち lcd_out(0x30,1); // 8bit mode set(0011 0000) delay_ms(5); // 5ms待ち lcd_out(0x30,1); // 8bit mode set(0011 0000) delay_ms(1); // 1ms待ち lcd_out(0x30,1); // 8bit mode set(0011 0000) delay_ms(1); // 1ms待ち lcd_out(0x20,1); // 4bit mode set(0010 0000) delay_ms(1); // 1ms待ち lcd_cmd(0x2C); // DL=0 4bit mode delay_us(50); // 50us待ち lcd_cmd(0x08); // display off C=D=B=0 delay_us(50); // 50us待ち lcd_cmd(0x0C); // display on D=1 B=C=0 delay_us(50); // 50us待ち lcd_cmd(0x06); // entry I/D=1 S=0 delay_us(50); // 50us待ち lcd_cmd(0x02); // カーソルをホームポジションへ delay_ms(2); // 2ms待ち } //////// カーソル移動 //////// ホームポジション:1,1 右下:16,2 void lcd_xy( unsigned char x, unsigned char y ) { unsigned char address=0x80; if(y!=1) address=0xC0 ; lcd_cmd(address +x - 1); delay_us(40); }