検索条件
全2件
(1/1ページ)
/** cnv_byte_to_bcd 1バイトバイナリデータを1バイトBCDに変換 */
unsigned char cnv_byte_to_bcd(unsigned char bval) {
union {
struct {
unsigned char bcd ; // 変換後の値
unsigned char hex ; // 変換対象バイナリ
} conv ;
unsigned short buf ;
} convbcd ;
unsigned char bitcnt ;
if (bval >= 100) return (bval) ; // バイナリ値 100 以上は BCD に変換不可のため、そのままリターン。
convbcd.buf = 0 ; // 使用領域は予めゼロクリアしておく。
convbcd.conv.hex = bval ; // 変換対象のバイナリ値を置数。
for (bitcnt = 0 ; bitcnt < 8 ; bitcnt++) {
if (((convbcd.conv.bcd & 0x0f) + 0x03) >= 0x08) convbcd.conv.bcd += 0x03 ;
if (((convbcd.conv.bcd & 0xf0) + 0x30) >= 0x80) convbcd.conv.bcd += 0x30 ;
convbcd.buf <<= 1 ;
}
return convbcd.conv.bcd ;
}
肝になる部分は、union 共用体の部分で、メンバ bcd と メンバ hex の順番は重要です。
/** cnv_bcd_to_byte 1バイトBCDデータを1バイトバイナリに変換 */
unsigned char cnv_bcd_to_byte(unsigned char bval) {
unsigned char convbin ;
convbin = ((bval & 0xf0) >> 4) * 10 + (bval & 0x0f) ;
return convbin ;
}


