最近看代码的时候发现一个比较巧妙的地方。
平时用12864或1602显示数字的时候相信大家都是先把他拆开,转成相应的ASCII码后给液晶显示。比如要显示2014的时候把它拆成‘2’、‘0’、‘1’、‘4’的
符形式在发给液晶。这样的话首先需要知道这个数字有多少位,比如2014有4位数,65536有五位数,四位的话先对1000取整把2取出来,然后对1000取余再对
100取整把0取出来,同样用这个方法可以分别把1、4取出来。取出来之后分别给他们加上‘0’转成ASCII码再给液晶显示。具体代码可以这样写:
void Send_Num(unsigned long dat) //显示数字
{
unsigned char i,j=10;
unsigned long n=1000000000;
if(dat!=0)
{
while(!(dat/n)) //这个while循环是实现求出所要发送数字的位数,如2014是四位,65536是五位......
{
j--;
for(n=1,i=j-1;i>0;i--)
n = n*10;
}
while(j--) //这个while循环是实现把数字拆开并转成ASCII码
{
for(n=1,i=j;i>0;i--)
n = n * 10;
Send_Char(dat/n + 0x30);
dat = dat % n;
}
}
else
Send_Char('0');
}
这是我之前的一种处理方式,应该算是比较好的方法了。
但别人是怎么做的呢。我看的那段代码他是这样处理的,比如同样要显示的数据Data = 2014。他先让
a = Data%10;
b = Data/10;
接着判断a、b是否为零,若不为零,把a转成ASCII码然后保存到一个缓存空间去,再用同样的方法把剩下的数字取出来放到缓存中。
大家注意到没有他这样处理是从尾部开始取的,即2014他先把4取出来,“a = Data%10; b = Data/10;”这两条语句得到a=4;b=201,通过判断a和b的值来确定
是否取道最后一位,这样做的好处是不管你要发送的数字有多少位我都可以把不需要知道发送数字位数的情况下把它拆出来。具体代码他是这样实现的
if(data == 0) GuiBuffer[y][x] = '0';
while (data)
{
remainder = data % 10;
data = data / 10;
if (data ||remainder)
GuiBuffer[y][x] = HexToAscii(remainder); //这里实现的功能是把数字转成ASCII码,如 2->'2'
if(x) x--;
}
可能我描述的不是很详细,大家可以仔细的分析下代码,就会发现这个方法的巧妙之处
|