目次
前
次
printfの代行
マイコンのライブラリには、printfが用意されていないことが多い。
シリアルを利用して数字のやりとりをする場合には、10進数表示、
16進数表示が必要になる場面が多い。
10進数表示
2バイトの数値を、数字で表現する場合には、符号ありとなしで
扱わないとならない。
符号なしの数値numを5個の数字で表現する場合、次のように
桁ごとに分割すればよい。
- *(stmp+0) = (num / 10000) + '0' ; num %= 10000 ;
- *(stmp+1) = (num / 1000 ) + '0' ; num %= 1000 ;
- *(stmp+2) = (num / 100 ) + '0' ; num %= 100 ;
- *(stmp+3) = (num / 10 ) + '0' ;
- *(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個の数字で表現すればよい。
- MSBが、1のとき、2の補数とする。*(stmp+0) = '-' ;
- MSBが、0のとき、符号をつけない。*(stmp+0) = ' ' ;
- *(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' ;
関数にまとめると、以下。
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個の数字で表現する場合、次のように桁ごとに分割すればよい。
- *(stmp+0) = (num >> 12) & 0x0f ; *(stmp+0) = dhex[*(stmp+0)] ;
- *(stmp+1) = (num >> 8) & 0x0f ; *(stmp+2) = dhex[*(stmp+2)] ;
- *(stmp+2) = (num >> 4) & 0x0f ; *(stmp+2) = dhex[*(stmp+2)] ;
- *(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) ) ;
}
目次
前
次