目次

printfの代行

 マイコンのライブラリには、printfが用意されていないことが多い。

 シリアルを利用して数字のやりとりをする場合には、10進数表示、
 16進数表示が必要になる場面が多い。


10進数表示

 2バイトの数値を、数字で表現する場合には、符号ありとなしで  扱わないとならない。  符号なしの数値numを5個の数字で表現する場合、次のように  桁ごとに分割すればよい。
  1. *(stmp+0) = (num / 10000) + '0' ; num %= 10000 ;
  2. *(stmp+1) = (num / 1000 ) + '0' ; num %= 1000 ;
  3. *(stmp+2) = (num / 100 ) + '0' ; num %= 100 ;
  4. *(stmp+3) = (num / 10 ) + '0' ;
  5. *(stmp+4) = (num % 10 ) + '0' ;
 関数にまとめると、以下。 void put_digits(UWORD x) { UBYTE stmp[5] ; /* separate */ *(stmp+0) = (x / 10000) + '0' ; x %= 10000 ; *(stmp+1) = (x / 1000 ) + '0' ; x %= 1000 ; *(stmp+2) = (x / 100 ) + '0' ; x %= 100 ; *(stmp+3) = (x / 10 ) + '0' ; *(stmp+4) = (x % 10 ) + '0' ; /* send */ rs_put( *(stmp+0) ) ; rs_put( *(stmp+1) ) ; rs_put( *(stmp+2) ) ; rs_put( *(stmp+3) ) ; rs_put( *(stmp+4) ) ; }  符号ありの数値numは、2の補数で表現されているのでMSBが0か1  を判定してから、数値を5個の数字で表現すればよい。
  1. MSBが、1のとき、2の補数とする。*(stmp+0) = '-' ;
  2. MSBが、0のとき、符号をつけない。*(stmp+0) = ' ' ;
  3. *(stmp+1) = (num / 10000) + '0' ; num %= 10000 ;
  4. *(stmp+2) = (num / 1000 ) + '0' ; num %= 1000 ;
  5. *(stmp+3) = (num / 100 ) + '0' ; num %= 100 ;
  6. *(stmp+4) = (num / 10 ) + '0' ;
  7. *(stmp+5) = (num % 10 ) + '0' ;
 関数にまとめると、以下。 void put_signed_digits(UWORD x) { UBYTE stmp[6] ; UWORD num ; /* check */ *(stmp+0) = ' '; if ( x & 0x8000 ) { *(stmp+0) = '-'; num = x ^ 0xffff ; num++ ; } /* separate */ *(stmp+1) = (num / 10000) + '0' ; num %= 10000 ; *(stmp+2) = (num / 1000 ) + '0' ; num %= 1000 ; *(stmp+3) = (num / 100 ) + '0' ; num %= 100 ; *(stmp+4) = (num / 10 ) + '0' ; *(stmp+5) = (num % 10 ) + '0' ; /* send */ rs_put( *(stmp+0) ) ; rs_put( *(stmp+1) ) ; rs_put( *(stmp+2) ) ; rs_put( *(stmp+3) ) ; rs_put( *(stmp+4) ) ; rs_put( *(stmp+5) ) ; }

16進数表示

 2バイトの数値は、4けたの16進数表示になる。  4ビットごとに区切って、'0'〜'9'、'A'〜'F'で表現すればよい。  4個の数字で表現する場合、次のように桁ごとに分割すればよい。
  1. *(stmp+0) = (num >> 12) & 0x0f ; *(stmp+0) = dhex[*(stmp+0)] ;
  2. *(stmp+1) = (num >> 8) & 0x0f ; *(stmp+2) = dhex[*(stmp+2)] ;
  3. *(stmp+2) = (num >> 4) & 0x0f ; *(stmp+2) = dhex[*(stmp+2)] ;
  4. *(stmp+3) = num & 0x0f ; *(stmp+3) = dhex[*(stmp+3)] ;
 関数にまとめると、以下。 typdef unsigned char UBYTE ; UBYTE dhex[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; void put_hex(UWORD x) { UBYTE stmp[4] ; /* separate */ *(stmp+0) = dhex[(num >> 12) & 0x0f] ; *(stmp+2) = dhex[(num >> 8) & 0x0f] ; *(stmp+2) = dhex[(num >> 4) & 0x0f] ; *(stmp+3) = dhex[num & 0x0f] ; /* send */ rs_put( *(stmp+0) ) ; rs_put( *(stmp+1) ) ; rs_put( *(stmp+2) ) ; rs_put( *(stmp+3) ) ; rs_put( *(stmp+4) ) ; }

目次

inserted by FC2 system