バイナリの数値データをテキストの文字列にするプログラム

 /*

* Bin2Bcd.c

*

* Created on: 2020/02/06

* Author: IZUMO Lab

*/



//#include "r_cg_macrodriver.h"

//#include "r_cg_cgc.h"

//#include "r_cg_serial.h"

//#include "r_cg_userdefine.h"

#include "main.h"

#include "Bin2Bcd.h"


/////////////////////////////////////

// バイナリの変数をBCD変換します。

// 4桁 0~9999までの対応になります。

// 負の数は多分対応できません。

uint16_t Bin2Bcd4(uint16_t bin){


uint16_t bcd;

uint32_t calbuf32; //変換作業に使う箱

uint16_t calbuf16h; //変換作業に使う箱

uint16_t calbuf16l; //変換作業に使う箱

uint8_t i;


calbuf32 = (uint32_t)bin;


//////////////////////////

/// 正直なんでこれで変換できるのか不明

/// ひどいソースだが、カッコよくすると何してるか

/// 全くわからなくなりそうなのでこのまま残す

for(i=0;i<16;i++){

calbuf16h = (uint16_t)(calbuf32>>16); //上16bitの取り出し

calbuf16l = (uint16_t)(calbuf32&0xffff); //下16bitの取り出し


//1の位

calbuf16h += 0x0003; //10の位に3を足して

if((calbuf16h&0x0008) != 0x0008){ //足した結果が8より大きいかチェック

calbuf16h -= 0x0003; //8を超えてなかったら3を減算(元に戻す)

}

//10の位

calbuf16h += 0x0030; //各位について実施

if((calbuf16h&0x0080) != 0x0080){

calbuf16h -= 0x0030;

}

//100の位

calbuf16h += 0x0300;

if((calbuf16h&0x0800) != 0x0800){

calbuf16h -= 0x0300;

}

//1000の位

calbuf16h += 0x3000;

if((calbuf16h&0x8000) != 0x8000){

calbuf16h -= 0x3000;

}

calbuf32 = (uint32_t)calbuf16h; //上半分をいれて

calbuf32 = calbuf32<<16; //上に詰めて

calbuf32 += (uint32_t)calbuf16l; //下半分を入れて

calbuf32 = calbuf32<<1; //最後に1bit左にシフト

}


bcd = (uint16_t)(calbuf32>>16);



return bcd;

}


/////////////////////////////////////

// バイナリの変数をBCD変換します。

// 8桁版 0~99999999までの対応になります。

// 負の数は多分対応できません。

uint32_t Bin2Bcd8(uint32_t bin32){


uint32_t calbuf32_bcd; //変換作業に使う箱

uint32_t val3_32 = 3U;

uint32_t val8_32 = 8U;


uint8_t i,digit;


calbuf32_bcd = 0;


//////////////////////////

///

///

for(i=0;i<32;i++){


for(digit = 0;digit<8;digit++){

calbuf32_bcd += (val3_32<<(4*digit)); //10の位に3を足して

if((calbuf32_bcd&(val8_32<<(4*digit))) == 0x0){ //足した結果が8より大きいかチェック

calbuf32_bcd -= (val3_32<<(4*digit)); //8を超えてなかったら3を減算(元に戻す)

}

}

calbuf32_bcd = (calbuf32_bcd<<1)+((bin32>>31)&(uint32_t)1U); //calbuf32_bcdを1ビットシフトしてbin32の先頭bitをいれる

bin32 = bin32<<1;

}




return calbuf32_bcd;

}


///////////////////////////////////////

/// バイナリの数値を4桁の10進数(ascii)に変換して配列に格納します。

/// 4桁以上のの配列を食わせること

void Trance_Bcd4(uint16_t bin,uint8_t * array){


uint16_t calbuf16;

uint8_t i;


calbuf16 = Bin2Bcd4(bin);


for(i=0;i<4;i++){

array[3-i] = (uint8_t)((calbuf16>>(i*4))&0xf)+0x30;

}



}

///////////////////////////////////////

/// バイナリの数値を8桁の10進数(ascii)に変換して配列に格納します。

/// 8桁以上のの配列を食わせること

void Trance_Bcd8(uint32_t bin32,uint8_t * array){


uint32_t calbuf32;

uint8_t i;


calbuf32 = Bin2Bcd8(bin32);


for(i=0;i<8;i++){

array[7-i] = (uint8_t)((calbuf32>>(i*4))&0xf)+0x30;

}



}



/*

* Bin2Bcd.h

*

* Created on: 2020/02/06

* Author: IZUMO Lab.

*/


#ifndef BIN2BCD_H_

#define BIN2BCD_H_


uint16_t Bin2Bcd4(uint16_t bin);

void Trance_Bcd4(uint16_t bin,uint8_t * array);

uint32_t Bin2Bcd8(uint32_t bin32);

void Trance_Bcd8(uint32_t bin32,uint8_t * array);


#endif /* BIN2BCD_H_ */



コメント