/***********************************************************************/ /* */ /* FILE :LCD16x2_27.c */ /* DATE :2008/04/15 */ /* DESCRIPTION :LCD16x2 関連 */ /* */ /* 2008/04/15 Version 1.00 */ /* */ /***********************************************************************/ #include "sfr_r827.h" #define LCD_CLEAR 0x01 // LCD Clear Command #define LCD_L1_TOP 0x80 // LCD Line1 Start Address #define LCD_L2_TOP 0xC0 // LCD Line1 Start Address #define LCD_CURSOR_ON 0x0E // カーソルON #define LCD_CURSOR_OFF 0x0C // カーソルOFF #define LCD_CURSOR_BLINK 0x0D // カーソルBLINK #define LCD_CURSOR_LEFT 0x10 // カーソルLEFT #define LCD_CURSOR_RIGHT 0x14 // カーソルRIGHT #define LCD_MODE_DISP_ON 0x04 // LCD Disp On MODE #define LCD_MODE_2LINE 0x08 // LCD 2Line Mode #define LINE1 0 // 1ラインめの開始位置 #define LINE2 16 // 2ラインめの開始位置 #define CTRL_SET 0 // LCD Control Set Mode #define DATA_SET 1 // LCD Data Set Mode #define RS_PIN p3_6 // LCD RS Pin 元はP3_3 #define EN_PIN p3_4 // LCD EN Pin // 関数プロトタイプ宣言 void InitLCD( void ); void LCD_write(unsigned char data_com_sel, unsigned char uc_char); void LCD_4bit_write(unsigned char data_com_sel, unsigned char uc_char); void LCD_data_set(unsigned char uc); void Delay_Lcd(unsigned long int units); //----------------------------------------------------------------------- // LCD Port を設定する //----------------------------------------------------------------------- void DispLCD16x2_Init(void){ pd3_4 = 1; // ポートP3_4 出力モードに設定 (LCD E) pd3_6 = 1; // ポートP3_6 出力モードに設定 (LCD RS) 元はP3_3 InitLCD(); // LCD 初期化 } //----------------------------------------------------------------------- // LCD を初期化する //----------------------------------------------------------------------- void InitLCD( void ) { EN_PIN = 1; // LCD EN Delay_Lcd(8000); // 電源投入後DELAY 15mSec以上 EN_PIN = 0; LCD_4bit_write(CTRL_SET,0x03); // Function Set LCD_4bit_write(CTRL_SET,0x03); // Function Set Delay_Lcd(46); // Delay 100uSec以上 LCD_4bit_write(CTRL_SET,0x03); // LCD Config Set LCD_4bit_write(CTRL_SET,0x02); // 4 Bit I/F Mode LCD_4bit_write(CTRL_SET,(LCD_MODE_DISP_ON | LCD_MODE_2LINE )); LCD_4bit_write(CTRL_SET,(LCD_MODE_DISP_ON | LCD_MODE_2LINE )); Delay_Lcd(46); // Delay 100uSec以上 LCD_write(CTRL_SET,LCD_CURSOR_OFF); // カーソルOFF Delay_Lcd(46); // Delay 100uSec以上 LCD_write(CTRL_SET,LCD_CLEAR); // LCD Clear Delay_Lcd(1800); // Delay 1.64mSec以上 LCD_write(CTRL_SET,0x06); // Cursor Increment LCD_write(CTRL_SET,LCD_L1_TOP); // Set Disp Line1 Top } //----------------------------------------------------------------------- // LCD 表示ルーチン //----------------------------------------------------------------------- void DispLCD16x2(unsigned char pos,_far char * str){ if(pos < LINE2){ LCD_write(CTRL_SET, (unsigned char)(LCD_L1_TOP + pos) ); // Line 1 表示 }else{ LCD_write(CTRL_SET, (unsigned char)(LCD_L2_TOP + pos - LINE2) ); // Line 2 表示 } do { LCD_write(DATA_SET,*str++); // 表示データ 書き込み } while(*str); } //----------------------------------------------------------------------- // LCD 4Bit DATA 表示ルーチン //----------------------------------------------------------------------- void LCD_write(unsigned char data_com_sel, unsigned char uc_char) { LCD_4bit_write(data_com_sel, (uc_char & 0xF0) >> 4); // 上位4bit Write LCD_4bit_write(data_com_sel, (uc_char & 0x0F)); // 下位4bit Write } //----------------------------------------------------------------------- // LCD 4Bit Mode 書き込み //----------------------------------------------------------------------- void LCD_4bit_write(unsigned char data_com_sel, unsigned char uc_char) { unsigned char uc_w_char; if (data_com_sel == DATA_SET){ RS_PIN = 1; // Data Set }else{ RS_PIN = 0; // Command Set } Delay_Lcd(3); // 120nSEC Delay EN_PIN = 1; // LCD EN Delay_Lcd(3); // 120nSEC Delay LCD_data_set(uc_char); // Data Write Delay_Lcd(20); // Data 書き込み Delay Min 40uSec EN_PIN = 0; // Data Latch Delay_Lcd(20); // Data 書き込み Delay Min 40uSec if (data_com_sel == CTRL_SET){ Delay_Lcd(0x7FF); // 制御データ書き込み時 Delay } } //----------------------------------------------------------------------- // DATA をポートに書き込む //----------------------------------------------------------------------- void LCD_data_set(unsigned char uc) { p1 = uc; // LCD // p1_0 = (uc & 0x01); // LED L1,LCD D4 // p1_1 = ((uc >> 1) & 0x01); // LED L2,LCD D5 // p1_2 = ((uc >> 2) & 0x01); // LED L3,LCD D6 // p1_3 = ((uc >> 3) & 0x01); // LED L4,LCD D7 } //----------------------------------------------------------------------- // LCD 制御信号 Delay //----------------------------------------------------------------------- void Delay_Lcd(unsigned long int long_delay) { unsigned long ul_ct = long_delay * 0x20; while(ul_ct--){ asm("nop"); } }