微控制器程式裡 帶進位減法怎樣進行十進位制調整

2021-04-21 05:14:25 字數 3898 閱讀 7533

1樓:匿名使用者

如果是51微控制器的抄話,做襲

十進位制減法運算,只能用add和addc指令做,因為只有這兩條加法指令運算的結果才能用da a指令進行十進位制調整。方法是:如y=a-b,變成y=a+(-b),做加法之前將-b變成補碼就可以了。

提倡用keilc寫程式,就不用考慮什麼十進位制調整了,也不管是加法還是減法了,多好哇。

2樓:做而論道

51微控制器的da a指令du,放在subb指令後面,是不起作用zhi的;

必須把daosubb指令變換版成add指令,才能用權da a指令進行調整。

這裡提到了「減法」變換成「加法」,就要借用時鐘「倒撥」變成「正撥」的方法,倒撥15分鐘,和正撥45分鐘,效果相同。15和45就是以60為模的互補的數。

兩位十進位制數,是以100為模的,減去60,和加上40,效果是相同的。

100,可以分解,寫成99+1,按照十六進位制,可以寫成9ah。

那麼,將a和60相減,程式如下:

mov r0, a ;儲存被減數.

mov a, #9ah ;100

clr c

subb a, #60h ;減去減數,得到100的補數.

add a, r0 ;使用加法即可.

da a ;調整為bcd數.;完

求微控制器組合語言怎樣程式設計才能實現將一個十六進位制數轉換為十進位制數 20

3樓:匿名使用者

程式經過**除錯通過,如下所示:

mov r0, tl0

mov r1, th0

clr a

mov r2, a;先清零

mov r3, a

mov r4, a,

mov r5, #16;共轉換十六位數loop:

clr c

mov a, r0;從待轉換數的高階移出一位到cyrlc a

mov r0, a

mov a, r1

rlc a

mov r1, a

mov a, r4;送到bcd碼的低端addc a, r4;帶進位加。自身相加,相當於左移一位da a ;十進位制調整,變成bcd碼mov r4, a

mov a, r3

addc a, r3

da a

mov r3, a

mov a, r2

addc a, r2

mov r2, a

djnz r5, loop;共轉換十六位數;-------至此,已經把th1 tl1中的數字,轉換成bcd碼,送到了r2 r3 r4。

;-------下面,分別存入r4 r3 r2 r1 r0。

mov a, r4

mov b, #16

div ab

mov r1, a

mov r0, b

mov a, r2

mov r4, a

mov a, r3

mov b, #16

div ab

mov r3, a

mov r2, b

ret希望對你有所幫助!

4樓:匿名使用者

用除法例如 0xff 轉換成十進位制數,百位十位個位分別存在r1、r2、r3中

在51微控制器中暫存器a中的數除以暫存器b中的數,商存在a,餘數存在bmov a,#0ffh

mov b,#100

mul a,b

mov r1,a //存百位mov b,a

mov b,#10

mul a,b

mov r2,a //存十位mov r3,b //存個位

5樓:

mov r6,#00h;存轉化後的數的低位mov r5,#00h;存轉化後的數的高位mov r7,#0ffh;為要轉化的

mov a,r7

cjne a,#00h,loop;判斷要轉化的數是否為0ajmp loop1

loop;mov a,r6

add a,#01h

da a

mov r6,a

addc a,#00h

da a

mov r5,a

djnz r7,loop

loop1:sjmp $

6樓:做而論道

一樓的,是在什麼地方抄的吧?文字註釋,看著眼熟。

呵呵,原來是我以前寫的答案。

7樓:匿名使用者

你確定你要的是十六進位制轉換成十進位制的程式?不是二進位制轉成十進位制的嗎?微控制器中的資料可都是二進位制的,只是通常用十六進位制表示罷了,我以前也犯過這個錯誤

關於微控制器彙編的十進位制調整指令。

8樓:做而論道

是不是做加法,凡是遇到上述情況都得修正?--是bcd碼的加法,就必須修正。

那為什麼我看到的某些加法運算沒有修正啊?--那就不是bcd碼的加法。

一般時,是用四位二進位制數,表示一位16進位制數(0~16),即0000~1111。

bcd碼,是用四位二進位制數,表示一位十進位制數 (0~9),即0000~1001。

如果是bcd碼的加法,就必須修正,否則就可能出現16進位制數,這個結果就不是bcd碼了。

9樓:藏在水中的人

由於bcd碼在微控制器中是以16進位制的形式儲存的,我們觀測到的值和微控制器實際儲存的值是不一樣的,例如bcd碼10,我們看到的值是10,但是微控制器實際儲存的值16,微控制器的運算也都是以16進位制的形式進行的,因此用微控制器進行bcd的運算都需要修正。不是bcd碼的運算,就不需要修正了。例如兩個正常的十進位制數 15+17=32;15對應的16進位制數是0fh,17對應的16進位制數是11h

相加寫成

mov a,#0fh

add a, #11h

結果為20h對應是進位制數為32

也可以寫成

mov a,#15d

add a, #17d ;結果一樣

10樓:匿名使用者

微控制器彙編的十進位制調整指令, 是為了讓程式設計簡單化, 可以直接以 十進位制 運算, 如

15+56=

mov a, #15h ; a = 15h ( 注意 要以 十六進位制 寫成 15h)

add a, #56h ; a = 15h+56h = 6bh

da a ; a = 6bh + 06h = 71h c = 0 進位標誌

68+75=

mov a, #68h

add a, #75h ; a = 68h+75h = ddh

da a ; a = ddh + 66h = 43h c = 1 = 143

; 注 十進位制調整指令 必須跟在加法指令後面

; 否則會出錯。

11樓:山魚

如果是bcd碼,就必須修正,這樣得到的結果才是bcd碼

12樓:匿名使用者

只有bcd碼相加才用

13樓:筱悠

要具體看程式的要求的,有的程式不是用的bcd碼的話就不用這樣的。。。多看看多想想就清楚了

微控制器程式解釋,微控制器程式解釋

222222222222222222222222222222222222 cnta equ 30h 定義cnta為暫存器30h count equ 31h 定義count為暫存器31h org 00h 程式開始 ljmp start 開始程式入口 org 0bh 定時器t0中斷程式入口地址,不過最好...

微控制器程式問題,微控制器程式問題

其實現在有部分高階的微控制器都有flash儲存區,不過我們一般是作為儲存程式用的,但其實也可以作為少量的資料區使用。但一般普通的51系列微控制器是不能的,只能外部擴充套件加eeprom,或者flash。只不過現在很多微控制器是內部由eeprom,擴充套件的資料flash,按照晶片的公司提供的data...

微控制器程式註釋

iint1 push acc push psw push dph push dpl 保護 acc psw dptr 內容 clr ea 關中斷 mov a,40h mov dptr,5fffh movx dptr,a 將 40h送5fffh mov dptr,5effh movx a,dptr mo...