/*----------------------------------------------------------* SCI processing function Ver2.1 for BTC060 H8 Tiny CPU Board Last Edit '02 06/22 Copyright (c) 2000 BestTechnology CO.,LTD. *----------------------------------------------------------*/ #ifndef _sci_c_ #define _sci_c_ #include <3664.h> #ifdef __cplusplus extern "C" { #endif #include typedef enum { // ボーレート設定リスト br2400 = 207, br4800 = 103, br9600 = 51, br19200 = 25, br31250 = 15, br38400 = 12, br57600 = 8 } BaudRate; void InitSCI3 (BaudRate); // SCI初期化 void rs_putc (char); // 1文字送信 void rs_puts (char *); // 文字列送信 char rs_getc (void); // 受信データバッファより1文字読み出し char *IntToHex (long, _BYTE, char *); // long->16進数文字列変換 char *IntToDec (long, _BYTE, char *); // long->10進数文字列変換 char *IntToBin (long, _BYTE, char *); // long->2進数文字列変換 /*-----------------------------------------------*/ /* 通信関係 */ /*-----------------------------------------------*/ // SCI初期化 void InitSCI3 (BaudRate b) { volatile int i; // RS232Cコミュニケーション設定 IO.PMR1.BIT.TXD = 1 ; // P22をTXD端子として使う設定 SCI3.SCR3.BYTE =0; SCI3.SMR.BYTE = 0; SCI3.BRR = b; // ボーレート設定 for (i = 0; i < 5; i++) ; // ダミーウェイト SCI3.SCR3.BIT.RIE = 0; // 受信割り込み禁止 SCI3.SCR3.BIT.TE = 1; // 送信許可 SCI3.SCR3.BIT.RE = 1; // 受信許可 SCI3.SSR.BYTE &= 0x80; // ステータスクリア } // 1文字送信 void rs_putc (char c) { while (SCI3.SSR.BIT.TDRE == 0) ; SCI3.TDR = c; } // 文字列送信 void rs_puts (char *st) { while (*st) rs_putc (*st++); } // 受信データバッファより1文字読み出し char rs_getc (void) { char c; while (!((SCI3.SSR.BYTE & 0x78) != 0)) ; // 受信バッファ|エラーフラグ待 if (SCI3.SSR.BIT.RDRF == 1) { c = SCI3.RDR; // データ取り出し SCI3.SSR.BIT.RDRF = 0; // 受信フラグクリア } else { SCI3.SSR.BYTE &= 0x80; // エラーフラグクリア c = 0; } return c; } /*-----------------------------------------------*/ /* 文字列操作 */ /*-----------------------------------------------*/ // long->16進数文字列変換 char *IntToHex (long v, _BYTE len, char *s) { char hex[] = "0123456789ABCDEF"; // 16進数文字列リスト s[len--] = 0; do { s[len] = hex[v & 0xf]; v >>= 4; } while (len--); return s; } // long->10進数文字列変換 char *IntToDec (long v, _BYTE len, char *s) { int i; int f; f = v < 0; v = labs(v); for (i = 0; i < len; i++) s[i] = ' '; s[len--] = 0; do { if (v < 10) break; s[len] = (v % 10) + '0'; v /= 10; } while (len--); s[len--] = v + '0'; if (f) s[len] = '-'; return s; } // long->2進数文字列変換 char *IntToBin (long v, _BYTE len, char *s) { char bin[] = "01"; // 2進数文字列リスト s[len--] = 0; do { s[len] = bin[v % 2]; v = v / 2; } while (len--); return s; } #ifdef __cplusplus } #endif #endif // _sci_c_