/**************************************************/ /* 液晶表示テスト RIKIYA 2001.5.17 */ /* lcdtest1.c */ /* H8-3048/F*/ /* AKI-H8開発キットの液晶表示器(LCD)に */ /* 文字列を表示させる */ /**************************************************/ #include <3048f.h> void main(void){ char moji[16] = "AKI-H8"; timer_init(); /* タイマーの初期化 */ lcd_init(); /* 液晶表示器の初期化 */ lcd_locate(0,0); /* カーソル位置の指定 */ lcd_print("HELLO!"); /* 文字列の表示 */ lcd_locate(3,1); /* カーソル位置の指定 */ lcd_print(moji); /* 文字列変数の中身を表示 */ while(1){} /* 無限ループ */ } /* lcdのリセット動作**********************************/ lcd_init(void){ P3.DDR = 0xff; /*P3全bit出力モード*/ wait(50); P3.DR.BIT.B4 = 0; /*RS clear*/ lcd_write8(0x23); /*X,X,E,RS,7,6,5,4 = 0010 0011*/ P3.DR.BIT.B4 = 0; /*RS clear*/ lcd_write8(0x23); /*X,X,E,RS,7,6,5,4 = 0010 0011*/ P3.DR.BIT.B4 = 0; /*RS clear*/ lcd_write8(0x23); /*X,X,E,RS,7,6,5,4 = 0010 0011*/ P3.DR.BIT.B4 = 0; /*RS clear*/ lcd_write8(0x22); /*X,X,E,RS,7,6,5,4 = 0010 0010*/ lcd_write4(0x28,0); /*X,X,E,RS,7,6,5,4 = 0010 1000*/ lcd_write4(0x0e,0); /*X,X,E,RS,7,6,5,4 = 0000 1110*/ lcd_write4(0x06,0); /*X,X,E,RS,7,6,5,4 = 0000 0110*/ return; } /* lcdに8bitデータを書き込む*************************/ lcd_write8(char str){ P3.DR.BIT.B5 = 1; /*E-bitを1とする */ P3.DR.BYTE = str; /*strをport3に出力 */ wait(2); P3.DR.BIT.B5 = 0;/*E-bitを0とし、このタイミングで書き込む */ wait(2); return; } /* lcdに4bitデータを書き込む *************************/ lcd_write4(int str,int rs){ /*str:文字列、rs:データ/コマンド識別*/ int dummy = str; int status = 0; switch (rs){ case 1: /* rs = 1 データ */ P3.DR.BIT.B4 = 1; break; case 0: /* rs = 0 コマンド*/ P3.DR.BIT.B4 = 0; break; default: break; } /*上位4bitの転送*/ P3.DR.BIT.B5 = 1; /*E-bitを1とする */ dummy = dummy>>4; /*上位4bitを下位4bitにシフトする*/ dummy &= 0x0f; /*上位4bitをマスクする*/ status = P3.DR.BYTE & 0xf0; /* E,RS信号以外をマスク */ P3.DR.BYTE = status | dummy; /* statusとdummyの合成を出力 */ wait(2); P3.DR.BIT.B5 = 0; /*このタイミングでlcdに書き込み*/ wait(2); /*下位4bitの転送*/ P3.DR.BIT.B5 = 1; /*E-bitを1とする */ dummy = str; dummy &= 0x0f; /*上位4bitをマスクする*/ status = P3.DR.BYTE & 0xf0; /* E,RS信号以外をマスク */ P3.DR.BYTE = status | dummy; /* statusとdummyの合成を出力 */ wait(2); P3.DR.BIT.B5 = 0; /*このタイミングでlcdに書き込み*/ wait(2); return; } /* lcd書き込み位置指定 x:0,y:0,1*******************/ lcd_locate(int x,int y){ lcd_write4(0x80+x+y*0x40,0); } /* lcdへの文字列書き込み */ lcd_print(char *str){ while(*str != 0){ /* 文字列の最後eof(0)を検出 */ lcd_write4(*str,1); /* 文字の書き込み */ str++; /* 次の文字ポインタに移動 */ } return; } /* 待ち時間発生 *******************************/ /* 待ち時間発生初期化 */ timer_init(void){ ITU0.TCR.BYTE = 0x23; /* GRAコンペアマッチ clock 1/8 */ ITU0.GRA = 0x07d0; /* GRAを2000に設定 */ ITU.TSTR.BIT.STR0 = 0; /* カウント停止状態 */ return; } /* 待ち時間発生 引数に必要なミリ秒を指定する */ wait(int msec){ int i; ITU.TSTR.BIT.STR0 = 1; /* ITU0 TCNTカウント開始 */ for(i=0;i