// // LCD表示用ヘッダファイル // #ifndef _KCB1_PIO_LCD #define _KCB1_PIO_LCD #include // 液晶端子アサイン #define LCD_RS p7_6 #define LCD_RW p7_7 #define LCD_E p8_0 #define LCD_BL p8_1 #define LCD_DB0 p7_2 #define LCD_DB1 p7_3 #define LCD_DB2 p7_4 #define LCD_DB3 p7_5 // プロトタイプ宣言 void lcd_init(); void lcd_initcmd(BYTE, unsigned long waitTime = 1000); void lcd_cmd(BYTE, unsigned long waitTime = 1000); void lcd_data(BYTE, unsigned long waitTime = 1000); BYTE lcd_bf_stat(); BYTE lcd_get_stat(); void lcd_clear(); void lcd_home(); void lcd_cursor(BYTE, BYTE); void lcd_putchar(BYTE); void lcd_puts (BYTE, BYTE, BYTE far *); // イニシャライズ処理 void lcd_init() { // ポート出力設定 pd7_6 = 1; // LCD_RS pd7_7 = 1; // LCD_RW pd8_0 = 1; // LCD_E pd8_1 = 1; // LCD_BL pd7_2 = 1; // LCD_DB0 pd7_3 = 1; // LCD_DB1 pd7_4 = 1; // LCD_DB2 pd7_5 = 1; // LCD_DB3 wait(100000); lcd_initcmd(0x03, 2647); // 8Bit Mode wait:4.1msec Wait lcd_initcmd(0x03, 63); // 8Bit Mode wait:100usec Wait lcd_initcmd(0x03, 63); // 8Bit Mode lcd_initcmd(0x02, 63); // 4Bit Mode lcd_cmd(0x2c); // ファンクション設定 lcd_cmd(0x08); // 表示OFF lcd_cmd(0x0C); // 表示ON lcd_cmd(0x06); // エントリーモードセット lcd_cmd(0x01); // 表示クリア } // イニシャライズコマンド処理 void lcd_initcmd( BYTE cmd, unsigned long waitTime ) { if((cmd & 0x01) != 0) LCD_DB0 = 1; else LCD_DB0 = 0; if((cmd & 0x02) != 0) LCD_DB1 = 1; else LCD_DB1 = 0; if((cmd & 0x04) != 0) LCD_DB2 = 1; else LCD_DB2 = 0; if((cmd & 0x08) != 0) LCD_DB3 = 1; else LCD_DB3 = 0; // 4ビット書込 LCD_RW = 0; LCD_RS = 0; LCD_E = 1; LCD_E = 0; wait(waitTime); } // コマンド処理 void lcd_cmd( BYTE cmd, unsigned long waitTime ) { BYTE cmd_h, cmd_l; cmd_l = cmd & 0x0F; cmd_h = (cmd >> 4) & 0x0F; if((cmd_h & 0x01) != 0) LCD_DB0 = 1; else LCD_DB0 = 0; if((cmd_h & 0x02) != 0) LCD_DB1 = 1; else LCD_DB1 = 0; if((cmd_h & 0x04) != 0) LCD_DB2 = 1; else LCD_DB2 = 0; if((cmd_h & 0x08) != 0) LCD_DB3 = 1; else LCD_DB3 = 0; // 上位4ビット書込 LCD_RW = 0; LCD_RS = 0; LCD_E = 1; LCD_E = 0; if((cmd_l & 0x01) != 0) LCD_DB0 = 1; else LCD_DB0 = 0; if((cmd_l & 0x02) != 0) LCD_DB1 = 1; else LCD_DB1 = 0; if((cmd_l & 0x04) != 0) LCD_DB2 = 1; else LCD_DB2 = 0; if((cmd_l & 0x08) != 0) LCD_DB3 = 1; else LCD_DB3 = 0; // 下位4ビット書込 LCD_RW = 0; LCD_RS = 0; LCD_E = 1; LCD_E = 0; wait(waitTime); while(lcd_bf_stat()); } // データ処理 void lcd_data( BYTE cmd, unsigned long waitTime ) { BYTE cmd_h, cmd_l; cmd_l = cmd & 0x0F; cmd_h = (cmd >> 4) & 0x0F; if((cmd_h & 0x01) != 0) LCD_DB0 = 1; else LCD_DB0 = 0; if((cmd_h & 0x02) != 0) LCD_DB1 = 1; else LCD_DB1 = 0; if((cmd_h & 0x04) != 0) LCD_DB2 = 1; else LCD_DB2 = 0; if((cmd_h & 0x08) != 0) LCD_DB3 = 1; else LCD_DB3 = 0; // 上位4ビット書込 LCD_RW = 0; LCD_RS = 1; LCD_E = 1; LCD_E = 0; if((cmd_l & 0x01) != 0) LCD_DB0 = 1; else LCD_DB0 = 0; if((cmd_l & 0x02) != 0) LCD_DB1 = 1; else LCD_DB1 = 0; if((cmd_l & 0x04) != 0) LCD_DB2 = 1; else LCD_DB2 = 0; if((cmd_l & 0x08) != 0) LCD_DB3 = 1; else LCD_DB3 = 0; // 下位4ビット書込 LCD_RW = 0; LCD_RS = 1; LCD_E = 1; LCD_E = 0; //wait(waitTime); while(lcd_bf_stat()) { } wait(10); } // ビジーフラグ処理 BYTE lcd_bf_stat() { BYTE stat= 0; // 入力設定 LCD_DB0 = 0; // LCD_DB0 LCD_DB1 = 0; // LCD_DB1 LCD_DB2 = 0; // LCD_DB2 LCD_DB3 = 0; // LCD_DB3 // 上位4ビット読込 LCD_RW = 1; LCD_RS = 0; LCD_E = 1; if(LCD_DB3 != 0) stat = 1; else stat = 0; LCD_E = 0; // 下位4ビット読込 LCD_RW = 1; LCD_RS = 0; LCD_E = 1; LCD_E = 0; // 出力設定 LCD_DB0 = 1; // LCD_DB0 LCD_DB1 = 1; // LCD_DB1 LCD_DB2 = 1; // LCD_DB2 LCD_DB3 = 1; // LCD_DB3 return(stat); } // ステータス取得処理 BYTE lcd_get_stat() { BYTE stat= 0; // 入力設定 LCD_DB0 = 0; // LCD_DB0 LCD_DB1 = 0; // LCD_DB1 LCD_DB2 = 0; // LCD_DB2 LCD_DB3 = 0; // LCD_DB3 // 上位4ビット読込 LCD_RW = 1; LCD_RS = 0; LCD_E = 1; LCD_E = 0; if(LCD_DB0 != 0) stat = 0x10; if(LCD_DB1 != 0) stat = stat + 0x20; if(LCD_DB2 != 0) stat = stat + 0x40; if(LCD_DB3 != 0) stat = stat + 0x80; // 下位4ビット読込 LCD_RW = 1; LCD_RS = 0; LCD_E = 1; LCD_E = 0; if(LCD_DB0 != 0) stat = stat + 0x01; if(LCD_DB1 != 0) stat = stat + 0x02; if(LCD_DB2 != 0) stat = stat + 0x04; if(LCD_DB3 != 0) stat = stat + 0x08; // 出力設定 LCD_DB0 = 1; // LCD_DB0 LCD_DB1 = 1; // LCD_DB1 LCD_DB2 = 1; // LCD_DB2 LCD_DB3 = 1; // LCD_DB3 return(stat); } // 表示クリア処理 void lcd_clear() { lcd_cmd(0x01); // 表示クリア } // カーソルホーム処理 void lcd_home() { lcd_cmd(0x02); // ホーム } // カーソル位置指定処理 void lcd_cursor( BYTE curX, // 0-15 BYTE curY // 0-1 ) { BYTE cmd; cmd = 0x80; if(curY > 0) cmd = cmd + curX +0x40; else cmd = cmd + curX; lcd_cmd(cmd); } // 1文字表示処理 void lcd_putchar ( BYTE data ) { lcd_data(data); } // 文字列表示処理 void lcd_puts ( BYTE curX, // 0-15 BYTE curY, // 0-1 BYTE far *data // 文字列 ) { lcd_cursor(curX, curY); // 表示位置指定 while (*data != '\0') { lcd_putchar(*data++); } } #endif // _KCB1_PIO_LCD