假若A是16位的二进制数字,转换的数学表达式如下:

A = 2^15+2^14+.....2^1+2^0

在转换的时候,待转换的数是16位(两字节),环路计数器是16次,最大的结果因有65535,所以至少要用2.5字节存结果,取整之后就是3个字节做结果储存。

转换要领如下:结果字节首先清零,

然后待转换字节与结果字节同时向左移,移出待转换字节的最高位,逢1结果翻一翻,见0结果原封不动,环路计数器减1,重复以上过程,直到环路计数器减到零。

注:在逢1结果翻一翻中还是加6修正,51中是有直接指令DA,但精简指令内核的MCU

都没有这条指令,因此处理上就完全不同,可以参考以下代码。看看是用了哪些技巧代替了DA指令。

-----对于单片机汇编算法的初学者,该如何把转换两字节改成转换多字节?-----

以下附上来自AVR stduio 自带的bin2 to BCD 例程。

;****************************************

;* "bin2BCD16" - 16-bit Binary to BCD conversion

;*

;* This subroutine converts a 16-bit number (fbinH:fbinL) to a 5-digit

;* packed BCD number represented by 3 bytes (tBCD2:tBCD1:tBCD0).

;* MSD of the 5-digit number is placed in the lowermost nibble of tBCD2.

;*

;* Number of words :25

;* Number of cycles :751/768 (Min/Max)

;* Low registers used :3 (tBCD0,tBCD1,tBCD2)

;* High registers used  :4(fbinL,fbinH,cnt16a,tmp16a)

;* Pointers used :Z

;*

;***************************************************************************

;***** Subroutine Register Variables

.equ   AtBCD0 =13    ;address of tBCD0

.equ   AtBCD2 =15    ;address of tBCD1

.def   tBCD0 =r13     ;BCD value digits 1 and 0

.def   tBCD1 =r14     ;BCD value digits 3 and 2

.def   tBCD2 =r15     ;BCD value digit 4

.def   fbinL =r16       ;binary value Low byte

.def   fbinH =r17       ;binary value High byte

.def   cnt16a =r18     ;loop counter

.def   tmp16a =r19    ;temporary value

;***** Code

bin2BCD16:

ldi     cnt16a,16      ;Init loop counter

clr     tBCD2           ;clear result (3 bytes)

clr     tBCD1

clr     tBCD0

clr     ZH                ;clear ZH (not needed for AT90Sxx0x)

bBCDx_1:lsl fbinL    ;shift input value

rol     fbinH            ;through all bytes

rol     tBCD0  ;

rol     tBCD1

rol     tBCD2

dec    cnt16a         ;decrement loop counter

brne   bBCDx_2    ;if counter not zero

ret   ;   return

bBCDx_2:  ldi   r30,  AtBCD2+1   ;Z points to result MSB + 1

bBCDx_3:

ld     tmp16a,-Z           ;get (Z) with pre-decrement

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

;For AT90Sxx0x, substitute the above line with:

;

; dec ZL

; ld tmp16a,Z

;

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

subi  tmp16a,-$03   ;add 0x03

sbrc  tmp16a,3        ;if bit 3 not clear

st     Z,tmp16a       ; store back

ld      tmp16a,Z       ;get (Z)

subi   tmp16a,-$30  ;add 0x30

sbrc  tmp16a,7        ;if bit 7 not clear

st     Z,tmp16a        ; store back

cpi     ZL,AtBCD0     ;done all three?

brne  bBCDx_3        ;loop again if not

rjmp  bBCDx_1

c语言二进制转bcd,二进制转十进制(BCD)码汇编算法(适用汇编初学者)相关推荐

  1. 二进制转换为十进制c语言编程,将二进制IP地址转换成十进制(C语言程序实现)

    将二进制IP地址转换成十进制(C语言程序实现) /* * Name: IP Address * Funcion: To convert binary numbers to decimal number ...

  2. bcd转十进制java_BCD码转十进制C语言实现

    #include #include #define uchar unsigned char uchar BCD_Decimal(uchar bcd) ; int main(void) { uchar ...

  3. 计算机中十进制转二进制逻辑原理,.计算机中为什么要采用二进制?及二进制的基本运算规则,还有.二进制数据与十进制、八进制、十六进制数据之间的转换方法?...

    满意答案 sqq212527 2013.04.11 采纳率:46%    等级:12 已帮助:10556人 编辑本段简介 20世纪被称作第三次科技革命的重要标志之一的计算机的发明与应用,其运算模式正是 ...

  4. python十进制转换其他进制直到输入q结束,python二进制转换,python将十进制转为二进制,题目描述:输入一个整...

    python二进制转换,python将十进制转为二进制,题目描述:输入一个整 题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 分析: python没有unsignedin ...

  5. 为什么二进制按权展开就是十进制?彻底搞懂原理

    为什么二进制按权展开就是十进制?彻底搞懂原理 防盗声明 原文链接:https://blog.csdn.net/weixin_44331765/article/details/122337936 版权声 ...

  6. 二进制,八进制,十进制,十六进制转换算法

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 进制转换算法(Convert) (二.八.十六进制) → (十进制) 二进制 → 十进制 八进 ...

  7. 二进制转化为十进制和二进制转化为二进制

    大家都知道我们平时生活中用的都是十进制,但是计算机使用二进制,那么二进制与十进制如何进行相互转化.下面我们来看一看. 我们以 -1 为例 十进制 1 的二进制是 0000 0001 大致算法如下: 1 ...

  8. 为什么二进制无法精确表达部分十进制的小数

    小数可以想象为把1拆成10份,或者两份,就是十进制和二进制的差别. 比如 0.111(二进制)<0.9<0.1111(二进制) 1/3,十进制表示不出来,三进制为0.1

  9. int / uint 的 取值范围、二进制表示形式、与十进制转换方法

    int / uint 类型 的取值范围: int8: -128 ~ 127 int16: -32768 ~ 32767 int32: -2147483648 ~ 2147483647 int64: - ...

最新文章

  1. 如何释放电脑被限制的20%网速?
  2. log4j2在spring中的配置
  3. 【Matlab 控制】矩阵、图像操作基础
  4. java高级工程师开放面试题集一
  5. Rethink Technology预测看好VVC
  6. java修饰类的关键字_JAVA中的修饰关键字
  7. 使用Spring WebFlux构建反应性REST API –第1部分
  8. 网页Request Headers请求头和Response Headers响应头
  9. 今天的弹指一瞬间的飞鸽传书
  10. SpringBoot+拦截器+自定义异常+自定义注解+全局异常处理简单实现接口权限管理...
  11. JAVA day27,28 线程池
  12. the difference between a material and an effect
  13. 201703-1-分蛋糕
  14. redis实现分布式锁代码片段
  15. 帆软JS鼠标悬停列标题高亮显示/改变选中行行高
  16. hudson构建配置
  17. iOS几款实用的工具类demo
  18. Ajax核心:XMLHTTP组件相关技术资料
  19. FreeFileSync 文件夹比较与同步软件
  20. 酒吧手机游戏java_酒吧里24种常见游戏的玩法

热门文章

  1. 日本首富——孙正义的传奇
  2. 华为鸿蒙布局发展大会,华为开发者大会:全球瞩目的“鸿蒙”面子和里子大格局...
  3. 游戏关键字070805
  4. java中equals的反义词_equals是什么意思_equals怎么读_equals翻译_用法_发音_词组_同反义词_同样的人( equal的名词复数 )-新东方在线英语词典...
  5. sql根据汉字内容自动产生拼音和五笔首字母
  6. java支票金额转换
  7. 五大券商研报:逢大跌买入这些股
  8. 单片机在微型计算机系统中的作用,单片机在智能仪器仪表中的应用
  9. Html+Css+js实现带有雪花飘落的许愿墙效果
  10. 哪些行业需要用到高防服务器