C程序中最值二进制LED显示函数的技术说明撰写需求
嘿,咱们把这两个控制LED显示二进制的函数说明梳理清楚,让每一步逻辑都明明白白:
函数功能总览
这两个函数的核心目标都是将一个0-255的十进制数转换为8位二进制形式,并通过pinArray数组中的8个LED引脚(索引7对应二进制最高位,索引0对应最低位)点亮对应位的LED,以此直观显示数值的二进制形态。其中binaryLowestNumber处理排序后的数组最小值lowArray,binaryHighestNumber处理最大值highArray。
void binaryLowestNumber()
这个函数采用从高位到低位逐位判断的方式实现十进制转8位二进制:
void binaryLowesttNumber() { int remainder = lowArray; /* remainder为扣除引脚对应数值后的剩余值,初始设为排序后的最小值 */ int j = 128; // 引脚对应的二进制数值(初始为2^7,即最高位权重) int i = 7; // 当前引脚的索引(对应最高位引脚) while (i >= 0) { if (remainder >= j) // 若剩余值大于等于当前引脚对应的数值 { digitalWrite(pinArray[i], HIGH); // 点亮当前引脚的LED remainder = remainder - j; // 从剩余值中扣除当前引脚的数值 j = j >> 1; // 将j的值减半(对应下一个更低位的权重) i--; // 切换至下一个引脚 } else { j = j >> 1; // 将j的值减半 i--; // 切换至下一个引脚 } } }
具体执行流程:
- 初始化
remainder为要转换的最小值lowArray,j从二进制最高位权重128(2^7)开始,i从最高位对应的引脚索引7开始。 - 循环遍历8个引脚(从索引7到0):
- 如果当前剩余值
remainder大于等于当前位的权重j,说明该二进制位为1,点亮对应LED,同时从remainder中减去该权重,再移动到下一个低位。 - 如果
remainder小于j,说明该二进制位为0,直接移动到下一个低位。
- 如果当前剩余值
- 循环结束后,8个LED的亮灭状态就精准对应了最小值的8位二进制表示。
void binaryHighestNumber()
这个函数和前一个函数的核心目标完全一致,只是采用了双层循环的写法来实现十进制转8位二进制:
void binaryHighestNumber() { int remainder = highArray; // 与binaryLowestNumber函数逻辑一致,仅remainder初始设为排序后的最大值 int i = 128; int thisPin = 7; while (remainder > 0) { while (remainder >= i) { double j = i / 2; digitalWrite(pinArray[thisPin], HIGH); remainder = remainder - i; i = i - j; thisPin--; } while (remainder < i) { int j = i / 2; if (j >= 1) { i = i - j; thisPin--; } else { i = 0; } } } }
具体执行流程:
- 初始化
remainder为要转换的最大值highArray,i从最高位权重128开始,thisPin从最高位引脚索引7开始。 - 外层循环持续到
remainder减至0(所有二进制位处理完成):- 第一个内层循环:当
remainder大于等于当前权重i时,点亮对应LED,减去该权重,将i减半(i = i - j,其中j=i/2),并移动到下一个引脚。 - 第二个内层循环:当
remainder小于当前权重i时,直接将i减半,移动到下一个引脚,直到i变为0或者找到小于等于remainder的权重。
- 第一个内层循环:当
- 最终同样通过8个LED的亮灭状态,展示最大值的8位二进制形式。
两个函数的异同点
- 相同点:都是将0-255的十进制数转8位二进制,通过LED引脚输出,核心逻辑都是基于二进制权重的逐位判断。
- 不同点:实现结构不同,
binaryLowestNumber用单层循环遍历所有8位,binaryHighestNumber用双层循环,在剩余值归0时提前结束循环(不过因为最大值也是0-255,最终都会遍历完8位)。
内容的提问来源于stack exchange,提问作者JavaScr
相关产品推荐
相关产品推荐

