2615|5

1071

帖子

7

TA的资源

纯净的硅(中级)

楼主
 

一种比较新颖的思路实现 [复制链接]

            最近看代码的时候发现一个比较巧妙的地方。

            平时用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--;
        }

可能我描述的不是很详细,大家可以仔细的分析下代码,就会发现这个方法的巧妙之处


此帖出自51单片机论坛

最新回复

a = Data%10; b = Data/10; 如果date是100,那么,ab都是0  详情 回复 发表于 2014-11-29 14:49
点赞 关注(1)
 

回复
举报

105

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
每个人的算法都不一样,看个人的思路了。
此帖出自51单片机论坛
 
 
 

回复

301

帖子

2

TA的资源

一粒金砂(中级)

板凳
 
咱就是一直用除10取模的啦!
此帖出自51单片机论坛

点评

那楼上思维就是比咱比较灵活的了  详情 回复 发表于 2014-11-29 15:24
 
 
 

回复

2453

帖子

19

TA的资源

五彩晶圆(中级)

4
 
a = Data%10;
b = Data/10;

如果date是100,那么,ab都是0
此帖出自51单片机论坛

点评

a = 100%10 = 0; b = 100/10 = 10; 哪有都是零  详情 回复 发表于 2014-11-29 15:22
 
个人签名    懒得很
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

5
 
zca123 发表于 2014-11-29 14:49
a = Data%10;
b = Data/10;

a = 100%10 = 0;
b = 100/10 = 10;
哪有都是零

此帖出自51单片机论坛
 
 
 

回复

1071

帖子

7

TA的资源

纯净的硅(中级)

6
 
dwdsp 发表于 2014-11-29 13:40
咱就是一直用除10取模的啦!


那楼上思维就是比咱比较灵活的了

此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表