1.代码选择
有时我们需要6个数码管显示我们想要看到的数字,比如计算结果呈现在数码管上,然而当要显示的数为“520”时又不想前面的3个数码管亮(也就是高位为0不显示),我们把这部分功能代码封装为带参数的函数,传入的参数就是要显示的数值。参数定义的是unsigned long类型,也就是支持0~4294967296的数值(2的32次方等于4294967296)。
示例1:
void ShowNumber(unsigned long num) { LedBuff[0]=LedChar[num%10]; LedBuff[1]=LedChar[num/10%10]; LedBuff[2]=LedChar[num/100%10]; LedBuff[3]=LedChar[num/1000%10]; LedBuff[4]=LedChar[num/10000%10]; LedBuff[5]=LedChar[num/100000%10]; if(num<100000)LedBuff[5] = 0xFF; if(num<10000) LedBuff[4] = 0xFF; if(num<1000) LedBuff[3] = 0xFF; if(num<100) LedBuff[2] = 0xFF; if(num<10) LedBuff[1] = 0xFF; }
示例2:
void ShowNumber(unsigned long num) { unsigned long i; unsigned char x=5;//每次被调用都会从5开始 for(i=100000;i>0;i/=10) { if(num<i)LedBuff[x] = 0xFF; else LedBuff[x]=LedChar[(num/i)%10]; x--; } }
这两段代码都能实现我们想要的功能,示例1可读性强,让人一看就明白了代码的作用。而示例2书写量少,比较简洁,但在阅读理解上需要我们转一下弯,笔者测试了这两段代码的执行时间,发现示例1比示例2快5ms左右,这种情况下毫无疑问我们肯定是选择示例1暂时作为实用代码。
可是在后期的教程中用到定时器中断来扫描数码管显示时,示例1的代码效果不尽人意,关于漏洞在哪大家后面可以尝试自己寻找。
在使用示例2时虽然显示效果比示例1的好,但是费时长,所以这两段代码都不是实用型代码。
2.代码参考
参考了宋老师的这部分代码以及测试结果都非常高效,所以我们选择这部分代码作为实用型代码。
void ShowNumber(u32 num) { char i;//取值范围-128~127 u8 buf[6]; for (i=0; i<6; i++) //把长整型数转换为6位十进制的数组 { buf[i] = num % 10; num = num / 10;//舍掉个位数,重新装载 } for (i=5; i>=1; i--) //从最高位起,遇到0填充不显示的代码,遇到非0则退出循环 { if (buf[i] == 0) LedBuff[i] = 0xFF; else break; } for ( ; i>=0; i--) //剩余低位都如实转换为数码管显示字符 { LedBuff[i] = LedChar[buf[i]]; } }
这部分代码我们来举个例子理解,假如传入的参数为125,第一个for循环就是实现以下功能
buf[5]=0; buf[4]=0; buf[3]=0; buf[2]=1; buf[1]=2; buf[0]=5;
第二个for循环i等于2之后就退出了循环,第三个for循环i是等于2,然后填充好要显示的1,2,5给数码管缓存区。
本文固定URL:https://www.dotcpp.com/course/359