在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序。

.

说它经典,不仅是因为它已经流传已久,重要的是它的编程思路十分清晰,十分易于延伸推广。做而论道曾经利用它的思路,很容易的编写出了48位二进制数变换成16位BCD码的程序。

但是这个程序有个明显的缺点,就是执行时间太长,转换16位二进制数,就必须循环16遍,转换48位二进制数,就必须循环48遍。

上述的HEX2BCD子程序,虽然长度仅仅为26字节,执行时间却要用331个机器周期。

.

单片机系统多半是用于各种类型的控制场合,很多时候都是需要“争分夺秒”的,在低功耗系统设计中,也必须考虑因为运算时间长而增加系统耗电量的问题。

为了提高整机运行的速度,在多年前,做而论道就另外编写了一个转换程序,程序的长度为81字节,执行时间是81个机器周期,(这两个数字怎么这么巧!) 执行时间仅仅是经典程序的1/4!

.

近来,在网上发现了一个链接:http://www.mcu123.com/news/Article/uc/uc8051/200803/4751.html,也对这个经典转换程序进行了改进,话是说了不少,只是没有实质性的东西。这篇文章提到的程序,一直也没有找到,也难辩真假。

这篇文章好像是选自某个著名杂志,但是在术语的使用上,有着明显的漏洞,不像是专业人员的手笔。比如说文中提到的:“使用51条指令代码,但执行这段程序却要耗费312个指令周期”,就是败笔。51条指令代码,真不知道说的是什么,指令周期是因各种机型和指令而异的,也不能表示确切的时间。

.

下面说说做而论道的编程思路。

;-----------------------------------------------------------------------

;已知16位二进制整数n以b15~b0表示,取值范围为0~65535。

;那么可以写成:

; n = [b15 ~ b0]

;把16位数分解成高8位、低8位来写,也是常见的形式:

; n = [b15~b8] * 256 + [b7~b0]

;那么,写成下列形式,也就可以理解了:

; n = [b15~b12] * 4096 + [b11~b0]

;式中高4位[b15~b12]取值范围为0~15,代表了4096的个数;

;上式可以变形为:

; n = [b15~b12] * 4000 + {[b15~b12] * (100 - 4) + [b11~b0]}

;用x代表[b15~b12],有:

; n =   x * 4000 + {x * (100 - 4) + [b11~b0]}

;即:

; n =   4*x (千位) + x (百位) + [b11~b0] - 4*x

;写到这里,就可以看出一点BCD码变换的意思来了。

;

;上式中后面的位:[b11~b0] - 4*x,如果小于256,那就太简单了,马上就可以去按照常规转换BCD了。

;如果数值较大,就要把[b11~b7]看成128的个数y;在百位中加上y、在十位加上3*y、并在[b6~b0]中减去2*y。

;那么就有:

; n = 4*x (千位) + x (百位) + [b11~b0] - 4*x

; n = 4*x (千位) + (x + y) (百位) + 3*y (十位) + [b6~b0] - 2*y

;由此,就可以明确由高9位[b15~b7]变换出来十进制的各个位的数值,可能大于9,到最后整理一下即可。

;剩下的低7位[b6~b0],已经是单字节数据,变换成BCD码那就十分简单了。

;-----------------------------------------------------------------------

从最后的表达式中可以看出,高9位变换的计算方法极为简单,只是使用左移、加减等指令即可,基本上不涉及多字节的运算。

编程的时候,要充分利用单字节、单周期的指令,使程序的长度和执行时间尽量缩短。

做而论道的编程思路已经给出,程序代码还是过一段时间再公布,给大家留下一个发挥的时间。

感兴趣的网友可以留言,写出自己编写的程序。

51单片机二进制转bcd码c语言,16位二进制数转换成BCD码的的快速算法-51单片机...相关推荐

  1. 16位二进制数转换成BCD码的的快速算法-51单片机

    在做而论道上篇博文中,回答了一个16位二进制数转换成BCD码的问题,给出了一个网上广泛流传的经典转换程序. 程序可见:http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5 ...

  2. c语言16进制转换成文本显示,文本如何转换成16进制字节集数据

    .版本 2 .子程序 取十进制, 整数型, , 将非十进制的标准格式文本转换成十进制整数值 .参数 欲转换的值, 文本型, , 欲转换的值,文本型! .参数 数值类型, 整数型, 可空, 0,#十六进 ...

  3. 用计算机国标码转机内码,区位码2850怎么转换成国标码和机内码

    2014-09-21 回答 1.机内码与区位码 机内码高位字节=(区号)H+A0H 机内码低位字节=(位号)H+A0H 2.国标码与区位码 国标码高位字节=(区号)H+20H 国标码低位字节=(位号) ...

  4. 16进制转换成ASCII码值

    public String convertHexToString(String hex){StringBuilder sb = new StringBuilder();//49204c6f766520 ...

  5. asic码转16进制c语言,十六进制数转换成ascii码

    本文收集整理关于十六进制数转换成ascii码的相关议题,使用内容导航快速到达. 内容导航: Q1:一个十六进制数转换成ASCII码的单片机程序 HASC:MOVA,R0:从R0中取一个16进制(二进制 ...

  6. 单片机c语言位运算写法,单片机与嵌入式系统中C语言的位运算小记

    原标题:单片机与嵌入式系统中C语言的位运算小记 编了个PIC的项目,对里的还是蛮有感悟的,特此记录一下. 譬如说,在程序中定义了一个char类型的变量, purge_short_enable_flag ...

  7. c语言实现补码(负数)转换成原码

    1.基础知识 (1)负数在计算机中是以补码的形式存储的: (2)有符号数的最高位为1表示为负数,为0表示正数: (3)反码:等于原码除过符号位,其余位取反: (4)补码:等于反码加1. 2.以-62为 ...

  8. c语言将字母转换成ascii码,c语言函数toascii()怎么把整数转换成合法的ASCII码字符...

    c语言函数toascii()怎么把整数转换成合法的ASCII码字符?函数需要引入的头文件:#include 定义toascii()函数:int toascii(int c); toascii()函数使 ...

  9. 16位转10位c语言,10进制数转换为16位二进制数

    写在前面: 题解是对具体题目的编程实现,不会具体讲解C语言语法.请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~).在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以 ...

最新文章

  1. [BZOJ2796][Poi2012]Fibonacci Representation
  2. 不符合核销规则条件_1136家建筑企业资质核查不符合条件,复查合格率仅50
  3. 题目1028:继续畅通工程
  4. 【python】数据结构与算法—哈希表
  5. 实例:ABAP权限对象设计与权限检查的实现
  6. Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
  7. boost::hana::keys用法的测试程序
  8. DDOS***类型以及iptables防范ddos脚本
  9. Matlab 卷积函数 ——conv2
  10. 错误:未启用当前数据库的SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker。...
  11. Django表单提交数据与网页跳转
  12. 机器人学基础——运动学研究的问题及DH建系
  13. 大学计算机网络实训目的,计算机专业大学生毕业实习目的
  14. matlab将txt转成dat,将matlab中数据保存为txt或dat格式
  15. 浏览器打开163邮箱提示“登录环境异常,暂时无法登录”?可能是电脑在念旧……(NET::ERR_CERT_DATE_INVALID)
  16. 【题解】LuoGu5423:[USACO19OPEN]Valleys P
  17. FB_LLC 死区时间计算(保证ZVS)
  18. css文字怎么显示在一起,css如何让文字成排显示
  19. WordPress批量修改数据库内文章内容文字关键字标题
  20. neogeo模拟器 linux,neogeo模拟器

热门文章

  1. Redis学习(一)之 持久化、主从与哨兵架构
  2. Win10系统开始菜单无法点击解决方法分享
  3. MATLAB中拉氏变换/拉氏反变换如何代入数值求解具体结果(简析syms函数和sym类型)
  4. 英文已如此搞笑,翻译却更加残暴
  5. 阿里大老带你了解“计算机“的初识
  6. 【ubuntu】virtualbox安装增强功能时【未能加载虚拟光盘】
  7. 研报网站waitu.com介绍
  8. php resque 计划任务,后台任务和PHP-Resque的使用(四) 使用Worker
  9. HTTPS SSL证书
  10. PS 玻璃及透明材质图层蒙板扣图