#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; bcd[3] = 0; bcd[4] = 0;
for (i = 0; i < 16; i++) {
// Коррекция.
for (j = 0; j < 5; j++) {
bcd[j] = (bcd[j] >= 0x05) ? (bcd[j] + (uint8_t) 0x03) : bcd[j];
}
// Сдвиг.
bcd[4] = (bcd[4] << 1) | (bcd[3] >> 3);
bcd[3] = (bcd[3] << 1) | (bcd[2] >> 3);
bcd[2] = (bcd[2] << 1) | (bcd[1] >> 3);
bcd[1] = (bcd[1] << 1) | (bcd[0] >> 3);
bcd[0] = (bcd[0] << 1) | (input >> 15);
input <<= 1;
for (j = 0; j < 5; j++) {
bcd[j] &= 0x0F;
}
}
}
int test_bcd() {
uint16_t i;
uint8_t bcd[5];
char str1[10];
char str2[10];
for (i = 0; i < 0xFFFF; i++) {
uint16_to_bcd(i, bcd);
sprintf(str1
, "%X%X%X%X%X", bcd
[4], bcd
[3], bcd
[2], bcd
[1], bcd
[0]); return -1;
}
return 0;
}
int main() {
uint8_t bcd[3];
uint16_to_bcd(12345, bcd);
printf("example 1: %X %X %X %X %X\n", bcd
[4], bcd
[3], bcd
[2], bcd
[1], bcd
[0]);
uint16_to_bcd(54679, bcd);
printf("example 2: %X %X %X %X %X\n", bcd
[4], bcd
[3], bcd
[2], bcd
[1], bcd
[0]);
if (test_bcd())
else
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRpbnQuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdm9pZCB1aW50MTZfdG9fYmNkKHVpbnQxNl90IGlucHV0LCB1aW50OF90ICpiY2QpIHsKICAgIHVpbnQ4X3QgaSwgajsKICAgIGJjZFswXSA9IDA7IGJjZFsxXSA9IDA7IGJjZFsyXSA9IDA7IGJjZFszXSA9IDA7IGJjZFs0XSA9IDA7CiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgewogICAgICAgIC8vINCa0L7RgNGA0LXQutGG0LjRjy4KICAgICAgICBmb3IgKGogPSAwOyBqIDwgNTsgaisrKSB7CiAgICAgICAgICAgIGJjZFtqXSA9IChiY2Rbal0gPj0gMHgwNSkgPyAoYmNkW2pdICsgKHVpbnQ4X3QpIDB4MDMpIDogYmNkW2pdOwogICAgICAgIH0KICAgICAgICAvLyDQodC00LLQuNCzLgogICAgICAgIGJjZFs0XSA9IChiY2RbNF0gPDwgMSkgfCAoYmNkWzNdID4+IDMpOwogICAgICAgIGJjZFszXSA9IChiY2RbM10gPDwgMSkgfCAoYmNkWzJdID4+IDMpOwogICAgICAgIGJjZFsyXSA9IChiY2RbMl0gPDwgMSkgfCAoYmNkWzFdID4+IDMpOwogICAgICAgIGJjZFsxXSA9IChiY2RbMV0gPDwgMSkgfCAoYmNkWzBdID4+IDMpOwogICAgICAgIGJjZFswXSA9IChiY2RbMF0gPDwgMSkgfCAoaW5wdXQgPj4gMTUpOwogICAgICAgIGlucHV0IDw8PSAxOwogICAgICAgIGZvciAoaiA9IDA7IGogPCA1OyBqKyspIHsKICAgICAgICAgICAgYmNkW2pdICY9IDB4MEY7CiAgICAgICAgfQogICAgfQp9CgppbnQgdGVzdF9iY2QoKSB7CiAgICB1aW50MTZfdCBpOwogICAgdWludDhfdCBiY2RbNV07CiAgICBjaGFyIHN0cjFbMTBdOwogICAgY2hhciBzdHIyWzEwXTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgMHhGRkZGOyBpKyspIHsKICAgICAgICB1aW50MTZfdG9fYmNkKGksIGJjZCk7CiAgICAgICAgc3ByaW50ZihzdHIxLCAiJVglWCVYJVglWCIsIGJjZFs0XSwgYmNkWzNdLCBiY2RbMl0sIGJjZFsxXSwgYmNkWzBdKTsKICAgICAgICBzcHJpbnRmKHN0cjIsICIlMDVkIiwgaSk7CiAgICAgICAgaWYgKHN0cmNtcChzdHIxLCBzdHIyKSkKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCmludCBtYWluKCkgewogICAgdWludDhfdCBiY2RbM107CiAgICB1aW50MTZfdG9fYmNkKDEyMzQ1LCBiY2QpOwogICAgcHJpbnRmKCJleGFtcGxlIDE6ICVYICVYICVYICVYICVYXG4iLCBiY2RbNF0sIGJjZFszXSwgYmNkWzJdLCBiY2RbMV0sIGJjZFswXSk7CgogICAgdWludDE2X3RvX2JjZCg1NDY3OSwgYmNkKTsKICAgIHByaW50ZigiZXhhbXBsZSAyOiAlWCAlWCAlWCAlWCAlWFxuIiwgYmNkWzRdLCBiY2RbM10sIGJjZFsyXSwgYmNkWzFdLCBiY2RbMF0pOwoKICAgIGlmICh0ZXN0X2JjZCgpKQogICAgICAgIHByaW50ZigiQkNEIHRlc3Q6IEZBSUxFRCIpOwogICAgZWxzZQogICAgICAgIHByaW50ZigiQkNEIHRlc3Q6IE9LIik7Cn0K