/**************************************************/ /* シリアル通信テスト RIKIYA 2000/05/19 */ /* sertest1.c */ /* H8-3048/F */ /* パソコンのハイパーターミナルでシリアル通信を */ /* 行なう。AKI-H8側はSCIチャンネル1を使い、開発時 */ /* と同じ環境で通信する。 */ /* 通信条件は以下の通り */ /* ボーレート 9600bps */ /* データ長 8bit */ /* ストップビット 1 */ /* パリティ 無し */ /* フロー制御 無し */ /**************************************************/ #include <3048f.h> void main(void){ int i; char rx_data; char tx_data[16]; timer_init(); /* タイマー初期化 */ lcd_init(); /* LCD初期化 */ sci1_init(); /* sci1初期化 */ sci1_strtx("ARE YOU READY?"); /* パソコンにメッセージ送信 */ lcd_locate(0,1); lcd_print("OK! READY GO!"); /* 液晶にメッセージ表示 */ while(1){ for(i=0;i<16;i++){ /* tx_data[]の初期化 */ tx_data[i] = '\0'; } i = 0; /* 変数iで文字数を数える */ lcd_locate(0,0); /* 液晶表示位置指定 */ sci1_tx('\r'); /* パソコンカーソル先頭 */ sci1_tx('\n'); /* パソコン改行 */ /* リターンが入力されるまでの処理 */ do{ rx_data = sci1_rx(); /* 1文字受信 */ if(rx_data != '\r'){ sci1_tx(rx_data); /* 1文字送信 */ lcd_write4(rx_data,1); /* 1文字液晶表示 */ tx_data[i] = rx_data; /* 1文字を文字列に格納 */ i++; /* iをプラス1する */ } }while(rx_data != '\r'); /* リターン入力を検出 */ /* 入力された文字列を送信し、液晶表示する */ sci1_tx('\r'); /* パソコンカーソル先頭 */ sci1_tx('\n'); /* パソコン改行 */ sci1_strtx(tx_data); /* 文字列を送信する */ lcd_write4(0x01,0); /* 画面クリア */ lcd_locate(0,1); /* 液晶表示位置指定2行目*/ lcd_print(tx_data); /* 液晶に文字列を表示 */ } } /* シリアル通信初期化*******************************/ 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のリセット動作*/ 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; } /********** 待ち時間発生 **********/ /* 待ち時間発生初期化 */ 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