/*
* 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_ */
コメント
コメントを投稿