#include <stdio.h>
#include <stdint.h>
#include <string.h>
void uint16_to_bcd(uint16_t input, uint8_t* bcd) {
uint8_t i, j;
bcd[0] = 0; bcd[1] = 0; bcd[2] = 0;
for (i = 0; i < 16; i++) {
// Коррекция.
for (j = 0; j < 2; j++) {
bcd[j] = ((bcd[j] & 0x0F) >= 0x05) ? (bcd[j] + (uint8_t) 0x03) : bcd[j];
bcd[j] = ((bcd[j] & 0xF0) >= 0x50) ? (bcd[j] + (uint8_t) 0x30) : bcd[j];
}
// Сдвиг.
bcd[2] = (bcd[2] << 1) | (bcd[1] >> 7);
bcd[1] = (bcd[1] << 1) | (bcd[0] >> 7);
bcd[0] = (bcd[0] << 1) | (input >> 15);
input <<= 1;
}
}
int test_bcd() {
uint16_t i;
uint8_t bcd[3];
char str1[10];
char str2[10];
for (i = 0; i < 0xFFFF; i++) {
uint16_to_bcd(i, bcd);
sprintf(str1
, "%02X%02X%02X", bcd
[2], bcd
[1], bcd
[0]); return -1;
}
return 0;
}
int main() {
uint8_t bcd[3];
uint16_to_bcd(12345, bcd);
printf("example 1: %02X %02X %02X\n", bcd
[2], bcd
[1], bcd
[0]);
uint16_to_bcd(54679, bcd);
printf("example 2: %02X %02X %02X\n", bcd
[2], bcd
[1], bcd
[0]);
if (test_bcd())
else
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCB1aW50MTZfdG9fYmNkKHVpbnQxNl90IGlucHV0LCB1aW50OF90KiBiY2QpIHsKICAgIHVpbnQ4X3QgaSwgajsKICAgIGJjZFswXSA9IDA7IGJjZFsxXSA9IDA7IGJjZFsyXSA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgIC8vINCa0L7RgNGA0LXQutGG0LjRjy4KICAgICAgICBmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CiAgICAgICAgICAgIGJjZFtqXSA9ICgoYmNkW2pdICYgMHgwRikgPj0gMHgwNSkgPyAoYmNkW2pdICsgKHVpbnQ4X3QpIDB4MDMpIDogYmNkW2pdOwogICAgICAgICAgICBiY2Rbal0gPSAoKGJjZFtqXSAmIDB4RjApID49IDB4NTApID8gKGJjZFtqXSArICh1aW50OF90KSAweDMwKSA6IGJjZFtqXTsKICAgICAgICB9CiAgICAgICAgLy8g0KHQtNCy0LjQsy4KICAgICAgICBiY2RbMl0gPSAoYmNkWzJdIDw8IDEpIHwgKGJjZFsxXSA+PiA3KTsKICAgICAgICBiY2RbMV0gPSAoYmNkWzFdIDw8IDEpIHwgKGJjZFswXSA+PiA3KTsKICAgICAgICBiY2RbMF0gPSAoYmNkWzBdIDw8IDEpIHwgKGlucHV0ID4+IDE1KTsKICAgICAgICBpbnB1dCA8PD0gMTsKICAgIH0KfQoKaW50IHRlc3RfYmNkKCkgewogICAgdWludDE2X3QgaTsKICAgIHVpbnQ4X3QgYmNkWzNdOwogICAgY2hhciBzdHIxWzEwXTsKICAgIGNoYXIgc3RyMlsxMF07CgogICAgZm9yIChpID0gMDsgaSA8IDB4RkZGRjsgaSsrKSB7CiAgICAgICAgdWludDE2X3RvX2JjZChpLCBiY2QpOwogICAgICAgIHNwcmludGYoc3RyMSwgIiUwMlglMDJYJTAyWCIsIGJjZFsyXSwgYmNkWzFdLCBiY2RbMF0pOwogICAgICAgIHNwcmludGYoc3RyMiwgIiUwNmQiLCBpKTsKICAgICAgICBpZiAoc3RyY21wKHN0cjEsIHN0cjIpKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKSB7CiAgICB1aW50OF90IGJjZFszXTsKICAgIHVpbnQxNl90b19iY2QoMTIzNDUsIGJjZCk7CiAgICBwcmludGYoImV4YW1wbGUgMTogJTAyWCAlMDJYICUwMlhcbiIsIGJjZFsyXSwgYmNkWzFdLCBiY2RbMF0pOwoKICAgIHVpbnQxNl90b19iY2QoNTQ2NzksIGJjZCk7CiAgICBwcmludGYoImV4YW1wbGUgMjogJTAyWCAlMDJYICUwMlhcbiIsIGJjZFsyXSwgYmNkWzFdLCBiY2RbMF0pOwoKICAgIGlmICh0ZXN0X2JjZCgpKQogICAgICAgIHByaW50ZigiQkNEIHRlc3Q6IEZBSUxFRCIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiQkNEIHRlc3Q6IE9LIik7Cn0K