我目前正在制作草图,将数据发送到3个TLC5971 LED驱动程序。我需要接受uint16_t
形式的亮度级别,然后将该值转换为两个8位十六进制数字以传递给LED驱动程序。
示例65535
- > 0xFF
和0xFF
有没有相对简单的方法呢?我发现了几种返回字符数组的方法,但它们看起来并不容易实现。
有没有人有过做类似事情的经验?
答案 0 :(得分:3)
试试这个:
uint16_t value;
uint8_t msb = (value & 0xFF00U) >> 8U;
uint8_t lsb = (value & 0x00FFU);
编辑1:
您可能会使问题复杂化并使用结构:
struct MSB_LSB
{
unsigned int MSB : 8;
unsigned int LSB : 8;
};
uint16_t value = 0x55aa;
uint8_t msb = ((MSB_LSB)(value)).MSB;
uint8_t lsb = ((MSB_LSB)(value)).LSB;
BTW,十进制,十六进制和八进制是表示的示例。这些陈述是供人类理解的。计算机内部以便于处理器的表示形式存储数字。因此,当您指定十进制数时,编译器会将十进制数转换为更适合处理器的值。我们人类可以用最容易理解的表示形式表示数字。
答案 1 :(得分:1)
uint16_t value = 0x1234; // Use example with different high/low byte values
unsigned char high_byte = value >> 8; // = 0x12
unsigned char low_byte = value & 0xFF; // = 0x34
答案 2 :(得分:0)
使用联合:
typedef union
{
unsigned short s;
unsigned char b[2];
} short2bytes_t;
unsigned short value=65535;
unsigned char MSB, LSB;
short2bytes_t s2b;
s2b.s = value;
MSB=s2b.b[1];
LSB=s2b.b[0];
printf("%d -> 0x%02X 0x%02X\n", value, MSB, LSB);