/////////////////////////////////////////////
PUBLIC Bin_BCD
// Исходный байт в R16. Диапазон: 0...255
// Возвращает unsigned int (2 байта), R17(H),R16(L)
// B pезультатe - упакованные тетрады:
// R17(7...4) - 0000
// R17(3...0) - сотни
// R16(7...4) - десятки
// R16(3...0) - единицы
/////////////////////////////////////////////
RSEG CODE
/////////////////////////////////////////////
Bin_BCD:
//--- BCD-преобразованиe
clr R17
cpi R16,100
brcs Bin_BCD_0
subi R16, 100
inc r17
cpi R16,100
brcs Bin_BCD_0
subi R16, 100
inc r17
Bin_BCD_0:
ldi R19,0xce // 206 * 2 = 412. Можно множитель 410,411,412,413
mul R16,R19
mov R18,R1
add R18,R18
andi R18,0xf0
ldi R19,0xa0 // 160
mul R18,R19
sub R16,R1
or R16,R18
ret
/////////////////////////////////////////////
extern unsigned int Bin_BCD(unsigned char t);
int main( void )
{
// Проверка...
printf("%03x\n",Bin_BCD(100));
printf("%03x\n",Bin_BCD(25));
printf("%03x\n",Bin_BCD(255));
printf("%03x\n",Bin_BCD(90));
printf("%03x\n",Bin_BCD(199));
printf("%03x\n",Bin_BCD(128));
printf("%03x\n",Bin_BCD(88));
printf("%03x\n",Bin_BCD(1));
printf("%03x\n",Bin_BCD(5));
printf("%03x\n",Bin_BCD(45));
printf("%03x\n",Bin_BCD(65));
}