目录
一、问题情境
在开发 MAX7219 级联点阵屏全屏刷写的时候,发现屏幕显示的逻辑和正常的操作逻辑有些出入,用的 LedControl 驱动库,年纪越大人越懒,不想自己写驱动了,所以也就顺着驱动库的逻辑,想着将两者之间融合一下。期间遇到的就是如何在“1字节和8位之间进行拆分和组合”,现将实现进行记录。
二、拆分字节到位
假设字节内容为 00111111(即0x3f),要将每个位都提取出来,即bit7~bit0的值。
此处用到位运算中的与(&),00111111 & 00000001 = 00000001,简化一下就是 00111111 & 0x01 = 1,由此取得最低位即 bit0 = 1,同理只要将其他的位往右推(使用 >> 运算),再去 &0x01,就能拆分出所有的位。
int byte_comb = 0b00111111;
int bit7 = (byte_comb >> 7) & 0x01;
int bit6 = (byte_comb >> 6) & 0x01;
int bit5 = (byte_comb >> 5) & 0x01;
int bit4 = (byte_comb >> 4) & 0x01;
int bit3 = (byte_comb >> 3) & 0x01;
int bit2 = (byte_comb >> 2) & 0x01;
int bit1 = (byte_comb >> 1) & 0x01;
int bit0 = (byte_comb >> 0) & 0x01;
printf("%d %d %d %d %d %d %d %d ", bit7, bit6, bit5, bit4, bit3, bit2, bit1, bit0);
三、组合位到字节
同样的,有拆就有装,现在要将8个位组合成1个字节,核心思想就是用或运算(|),当然与拆分时往右边位移相反,现在要将数据使用 << 运算从最低位挪回相应的位置。
int bit7 = 0;
int bit6 = 0;
int bit5 = 1;
int bit4 = 1;
int bit3 = 1;
int bit2 = 1;
int bit1 = 1;
int bit0 = 1;
int comb = (bit7 << 7) | (bit6 << 6) | (bit5 << 5) | (bit4 << 4) | (bit3 << 3) | (bit2 << 2) | (bit1 << 1) | (bit0 << 0);
printf("0x%x", comb);
四、结尾
由于代码不多,容易理解,也就不放仿真结果,实际代码均经过验证。