打印
[AVR单片机]

二进制转十进制(BCD)码汇编算法(适用汇编初学者)

[复制链接]
17363|38
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
宇宙飞船|  楼主 | 2010-8-1 01:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
假若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

相关帖子

沙发
hotpower| | 2010-8-1 01:45 | 只看该作者
先占位

使用特权

评论回复
板凳
hotpower| | 2010-8-1 02:38 | 只看该作者
**中俺也会BCD码,可惜就差在AVR汇编上实现了,很是可惜~~~

http://www.google.com.hk/search? ... mp;oq=&gs_rfai=

使用特权

评论回复
地板
宇宙飞船|  楼主 | 2010-8-1 12:58 | 只看该作者
弄清楚单片机硬件之后,一但掌握了这个算法,就有了抛开C编译器,设计出一个数字显示的电子钟的能力。
一般在网络上找到的资料,基本上就是汇编代码的堆砌,既没有公式,又没有流程图,对于初学汇编算法者,就象是看天书,有误人子弟之谦凝。

使用特权

评论回复
5
aweyfan| | 2010-8-1 20:50 | 只看该作者
90s能用的,mega下未必是最优的

这种简单的算法,用汇编,简直
算了,不说

使用特权

评论回复
6
apex_ch| | 2010-8-1 22:39 | 只看该作者
垃圾,看不下去了,还是用74系列的来搭个CPU来用比较有技术含量些

使用特权

评论回复
7
宇宙飞船|  楼主 | 2010-8-1 22:51 | 只看该作者
有几种人怕俺飞船做AVR的版主,
第一种 以写C语言的书为生的人。
第二种 写了一些汇编语言的书,但没有教人真技术之的人。
第三种 以开单片机技术培训斑为生的人。
第四种 AVR的商业竟争对手
第五种 掌握一点嵌入式皮毛,只求混饭的人。
第六种 怕这些基础技术大扩散的过来人。

使用特权

评论回复
8
lpcfans| | 2010-8-2 08:37 | 只看该作者
第七种 买不到芯片的人。

使用特权

评论回复
9
xuyiyi| | 2010-8-2 08:59 | 只看该作者
第八种 只会说老祖宗语之人。


比如俺,看不懂飞船大虾的满篇大幅外来语,恐怕连混饭吃都没人要。 ;P

使用特权

评论回复
10
123jj| | 2010-8-2 10:47 | 只看该作者
AVR真烂,连51中基本的DA指令都没有。

使用特权

评论回复
11
123jj| | 2010-8-2 10:49 | 只看该作者
垃圾,看不下去了,还是用74系列的来搭个CPU来用比较有技术含量些
apex_ch 发表于 2010-8-1 22:39


LS牛X!
用74系列来搭个CPU,高技术含量!
期待!

使用特权

评论回复
12
潜艇8421| | 2010-8-2 10:53 | 只看该作者
A = 2^15+2^14+.....2^1+2^0    //这条公式也只有飞船才放上来,好象在单片机坛子中也发过。
口决更加是空前绝后。
最看不过眼就是那些自以为是的所谓单片机高手,其实就是一个草包。

使用特权

评论回复
13
ZRL700424| | 2010-8-2 10:55 | 只看该作者
AVR真烂,连51中基本的DA指令都没有。
123jj 发表于 2010-8-2 10:47


如果按有没有DA指令来判断单片机烂不烂,那除了51及少数单片机外,其他的都很烂?比如:PIC、三星、AVR、ST等等?

使用特权

评论回复
14
123jj| | 2010-8-2 16:32 | 只看该作者
偶的《AVR汇编百例大全》怎样?

详见:[AVR 单片机] 主题:哈哈!热闹,俺也想当AVR斑竹!不知是否迟了?

什么飞船、潜艇、航母还有什么半吊子汇编好玩?

哈哈! ;P

使用特权

评论回复
15
论坛游客| | 2010-8-2 17:47 | 只看该作者
支持123jj

使用特权

评论回复
16
hotpower| | 2010-8-3 03:06 | 只看该作者
据考古发现,凡有飞船出没的地方,必有粉丝和潜艇游荡~~~

使用特权

评论回复
17
123jj| | 2010-8-3 08:12 | 只看该作者
据考古发现,凡有飞船出没的地方,必有潜艇和航母游荡~~~

使用特权

评论回复
18
Loo_jack| | 2010-8-3 14:14 | 只看该作者
搞点正整的玩意好不好

使用特权

评论回复
19
lh8008| | 2010-8-3 14:44 | 只看该作者
听说飞船汇编很N,今天学习啦.

使用特权

评论回复
20
123jj| | 2010-8-3 15:41 | 只看该作者
偶只听说过HOT  C++很N

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:技术是玩出来的!

75

主题

1664

帖子

4

粉丝