/************************************************** my_function.h RIKIYA 2001.06.20 ■SCI1シリアル通信関連 sci1_init(void) sci1通信初期化 sci1_rx(void) sci1から1文字受信 sci1_tx(char data) sci1に1文字送信 sci1_strtx(char *str) sci1に文字列送信 ■LCD表示関連 lcd_init(void) LCDの初期化 lcd_write8(char str) 8bitデータ書き込み lcd_write4(char str,int rs) 4bitデータ書き込み lcd_locate(int x,int y) LCDカーソル位置指定 lcd_print(char *str) LCDへの文字列書き込み ■時間稼ぎタイマー関連 void timer_init(void) itu0のタイマー初期化 void wait(int msec) itu0の時間稼ぎ void timer1_init(void) itu1のタイマー初期化 void wait1(int msec) itu1の時間稼ぎ ****************************************************/ /**************************************************** SCI1シリアル通信初期化 *****************************************************/ sci1_init(void){ SCI1.SCR.BYTE = 0x00; /* SCI1設定 stop,内部クロック */ SCI1.SMR.BYTE = 0x00; /* data8.stop1,pari non */ SCI1.BRR = 51; /* 9600bps */ wait(1); SCI1.SCR.BYTE = 0x30; /* Tx,Rx有効 ,割込み無効 */ SCI1.SSR.BYTE &= 0x80; /* エラーフラグのクリア */ return; } /**************************************************** SCI1から1文字受信する *****************************************************/ sci1_rx(void){ char data; while((SCI1.SSR.BYTE & 0x78)==0); /* 受信とエラーのフラグが立つまで待つ*/ if(SCI1.SSR.BIT.RDRF == 1){ /* データ受信が正常 */ data = SCI1.RDR; /* データを受け取りdataに保存 */ SCI1.SSR.BIT.RDRF = 0; /* 受信フラグのクリア*/ return(data); } else{ /* データ受信にエラー発生 */ SCI1.SSR.BYTE &= 0xc7; /* エラーフラグをクリア */ return(0xff); /* エラー時はFFを返す */ } } /***************************************************** SCI1に1文字送信する /*****************************************************/ sci1_tx(char data){ while(SCI1.SSR.BIT.TDRE == 0); /*未送信データが送られるまで待つ*/ SCI1.TDR = data; /*送信データのセット*/ SCI1.SSR.BIT.TDRE = 0; /*送信フラグのクリア*/ return; } /****************************************************** SCI1に文字列を送信する 文字列の最後は'\0' *******************************************************/ sci1_strtx(char *str){ while(*str != '\0'){ /* 文字が\0になるまで繰り返す */ sci1_tx(*str); /* 1文字送信*/ str++; /* 次の文字に移る*/ } return; } /****************************************************** 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(char str,int rs){ char 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'){ /* 文字列の最後を検出 */ lcd_write4(*str,1); /* 文字の書き込み */ str++; /* 次の文字ポインタに移動 */ } return; } /****************************************************** 待ち時間発生初期化 *******************************************************/ void timer_init(void){ ITU0.TCR.BYTE = 0x23; /* GRAコンペアマッチ clock 1/8 */ ITU0.GRA = 0x07d0; /* GRAを2000に設定 */ ITU.TSTR.BIT.STR0 = 0; /* カウント停止状態 */ return; } void timer1_init(void){ ITU1.TCR.BYTE = 0x23; /* GRAコンペアマッチ clock 1/8 */ ITU1.GRA = 0x07d0; /* GRAを2000に設定 */ ITU.TSTR.BIT.STR1 = 0; /* カウント停止状態 */ return; } /******************************************************* 待ち時間発生 引数に、必要なミリ秒を指定する *******************************************************/ void wait(int msec){ int i; ITU.TSTR.BIT.STR0 = 1; /* ITU0 TCNTカウント開始 */ for(i=0;i