Dotcpp  >  编程教程  >    >  数码管显示函数

数码管显示函数

点击打开在线编译器,边学边练

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

Dotcpp在线编译      (登录可减少运行等待时间)