Если я правильно понял задачу. Из двоичного получить BCD.
Ф-ии реализовывывал сам, "наразвес". Давно.
Метод не помню как называется, кажется в термине присутствует "даббл дубл" или похоже.Исходные ссылки брал в Wiki. - линк внизу поста.
Работает быстро, за счет чисто двоичной математики.
ps int == 16-разрядный
SUPPORT.C
Код
#include "support.h"
// unsigned int bin2BCD( unsigned int in_word ) { return bin2BCD( (unsigned char ) in_word ); }
// unsigned int bin2BCD( int in_word ) { return bin2BCD( (unsigned char ) in_word ); }
char bin2BCD( int in_word )
{
static unsigned char arr[2]; // результат
unsigned char *c_ptr = (unsigned char *) &in_word;
memset( arr, 0x00, sizeof(arr));
bin8_to_bcd( arr, c_ptr[0] );
return arr[0];
}
// преобразование из 8-битного двоичного arg_bin8 в упакованный BCD - в массиве bcd3[2]
void bin8_to_bcd( unsigned char *bcd3, unsigned char arg_bin8 )
{
unsigned long i_src; // рабочий регистр
unsigned char *arr;
arr = (unsigned char *) &i_src;
i_src = 0;
arr[0] = arg_bin8; // младший байт раб.регистра - исходное bin число
unsigned char test1;
for(int i=0; i<8; i++)
{ i_src = i_src << 1;
if( i >= 7 ) break;
test1 = arr[1] & 0x0F; if( test1 >= 5 ) add_3( &arr[1], B_LOW );
test1 = (arr[1] >> 4 ) & 0x0F; if( test1 >= 5 ) add_3( &arr[1], B_HI );
test1 = arr[2] & 0x0F; if( test1 >= 5 ) add_3( &arr[2], B_LOW );
test1 = (arr[2] >> 4 ) & 0x0F; if( test1 >= 5 ) add_3( &arr[2], B_HI );
test1 = arr[3] & 0x0F; if( test1 >= 5 ) add_3( &arr[3], B_LOW );
test1 = (arr[3] >> 4 ) & 0x0F; if( test1 >= 5 ) add_3( &arr[3], B_HI );
}
bcd3[1] = arr[2]; // старший разряд BCD
bcd3[0] = arr[1]; // 2 младших разряда BCD
}
// вспомогательная ф-я прибавки 3 к тетраде (без переноса)
// обрабатывается байт по c_ptr, sw1 - указывает какя тетрада обрабатывается B_LOW / B_HI
void add_3( unsigned char *c_ptr, int sw1 )
{
unsigned char ch1, ch2;
ch2 = *c_ptr;
if( sw1 == B_LOW ) // младшая тетрада в ch1
{ ch1 = *c_ptr & 0x0F;
ch1 += 3;
*c_ptr = ( ch2 & 0xF0 ) | ( ch1 & 0x0F );
}
else // старшая тетрада в ch1
{ ch1 = *c_ptr & 0xF0;
ch1 += 0x30;
*c_ptr = ( ch1 & 0xF0 ) | ( ch2 & 0x0F );
}
}
SUPPORT_H
Код
#ifndef SUPPORT_H
#define SUPPORT_H
#include <string.h>
. . . .
// Вспомогательные ф-ии
// переключатель террад
#define B_HI 1
#define B_LOW 2
// вспомогательная ф-я прибавки 3 к тетраде (без переноса)
// второй параметр - переключатель тертрады B_HI / B_LOW
void add_3( unsigned char *, int );
// ф-я конвертации из bin в упакованный BCD
// ( вызывает add_3() )
void bin8_to_bcd( unsigned char *, unsigned char);
// ф-я конвертации из bin в упакованный BCD
// ( вызывает bin8_to_bcd() )
// unsigned int si1 = bin2BCD( 123 );
// (si1) == 0x0123
//unsigned int bin2BCD( unsigned char );
//unsigned int bin2BCD( unsigned int );
char bin2BCD( int );
#endif
Wiki
Double_dabble