通过左移位将16位模式转移到另一寄存器中



我正在用C语言实现双达贝算法,以执行二进制到BCD表示法。我用的是pic16f876a。我不确定,但我想没有默认的操作来做这件事,所以我想以这种方式一次从原始寄存器转移/左移一位到另一位:

0000 0000 0000   11110011   Initialization
0000 0000 0001   11100110  < Left Shift
0000 0000 0011   11001100   <Left Shift
0000 0000 0111   10011000  < Left Shift
add 3 to nibble with 7/111 result ...

我将从创建16位寄存器开始我应该屏蔽原始数字的MSB并将其放在另一个寄存器的LSB上吗?然后lef移位原始寄存器?

并最终得到他的最终BCD结果

BCD          (Binary)
100s Tens Ones    Original 
0010 0100 0011   11110011

我不知道如何拖动每一点此外,我知道当半字节大于4时,我必须加3,但也许掩码可以完成任务。当寄存器为1111111111111111时,我将在7段显示中显示从0000到3000的四位数字。

感谢的建议

或者,这里有一种将整数转换为BCD的简单方法(不使用double-damble算法(。它使用sprintf+strtod:

unsigned to_BCD(unsigned x) {
char s[20]; // enough even for 64-bits integers !
sprintf(s, "0x%u", x);
return (unsigned) strtod(s, NULL); 
}

这里有一个简单的解决方案。main()以十六进制显示结果(必须与初始十进制整数相对应(。

注意:您可以用任何无符号整数类型替换所有unsigned。例如,对于16位整数的uint16_t(不要忘记#include <stdint.h>(

#include <stdio.h>
unsigned double_dabble(unsigned x) {
unsigned r = 0, mask, d;
int k = 0, nibbles, n, bit;
for(mask = 1 << (sizeof(x) * 8 - 1); mask; mask >>= 1) {
nibbles = (++k + 3) / 4;
for(n = 0; n < nibbles; n++) {
d = r & (0b1111 << (n * 4));
if (d > (4 << (n * 4)))
r += 3 << (n * 4);
}
bit = ((x & mask) != 0);
r = (r << 1) | bit;
}
return r;
}
int main() {
unsigned x = 0b11110011; // 423
printf("x: %d -> BCD: %xn", x, double_dabble(x));
}

最新更新