我是SUNNY!本人經(jīng)過一年多的學(xué)習(xí),掌握了很多單片機(jī)編程技巧,例如C語言嵌入?yún)R編等。俗話說得好,熟能生巧!的確如此,本人很喜歡鉆研,達(dá)到很好的效果。在進(jìn)行程序編程時(shí),在某些場合,我們要進(jìn)行BCD碼調(diào)整。例如0x09+0x01,其結(jié)果是0x0a,因?yàn)檫@個(gè)是16進(jìn)制運(yùn)算,而這個(gè)不是我們想要的結(jié)果,我們是要0x10這個(gè)結(jié)果。那怎么辦呢?其實(shí)這些運(yùn)算在某些地方運(yùn)用還是比較常見的,比如在時(shí)鐘芯片DS1302中就要用到。如果采用轉(zhuǎn)換10進(jìn)制的方法來解決,不但程序長,效率低,占用資源也嚴(yán)重。如果采用匯編語言就簡單了,匯編語言中已經(jīng)考慮到這個(gè)地方,可以采用DA A這個(gè)指令來完成,如下面這個(gè)例子:
假設(shè)內(nèi)存中30H的值為0x09,求加上1后的BCD碼,下面是程序和解釋:
MOV A,30H 把30H的值先送人累加器A,這時(shí)累加器的值為0x09
ADD A,#01H 累加器的值加上1,這時(shí)累加器的值為0x0a
DA A 累加器BCD碼調(diào)整,這時(shí)累加器A的值為0x10
MOV 30H,A 把累加器A的值送回30H,實(shí)現(xiàn)BCD調(diào)整
RET
上面是加法的BCD碼調(diào)整,比較簡單,因?yàn)閰R編語言已經(jīng)提供了這個(gè)功能,但是減法呢?很遺憾,匯編語言并沒有提供減法的BCD碼調(diào)整,那是不是就沒轍了呢?答案是否定的!我們知道,一個(gè)數(shù)如果低位不夠減時(shí),要向高位借1,在51單片機(jī)中,其借位標(biāo)志就是AC,我們可以利用AC是否為1來進(jìn)行判斷,如果出現(xiàn)借位,就要進(jìn)行BCD碼調(diào)整。但是減法并沒有調(diào)整指令,怎么辦?我們知道,16進(jìn)制與10進(jìn)制其實(shí)只是相差6,只要在發(fā)生借位時(shí)將值減去6就OK了!哈哈...我是不是很聰明?哈哈...自夸一下!好了,光說沒有用,做出來才是真的!下面看例子:
假設(shè)內(nèi)存中30H的值為0x10,求減去1的BCD碼。下面是程序和解釋:
MOV A,30H 將30H的值送人累加器A
SUBB A,#01H 累加器A的值減去1 ,這時(shí)累加器的值為0x0f
JB AC,NEXT 判斷借位標(biāo)志,如果為1說明發(fā)生借位,進(jìn)行下一步處理
MOV 30H,A 借位為0,直接送回30H
RET
NEXT:
SUBB A,#06H 發(fā)生借位,減去6,調(diào)整為BCD碼,這時(shí)累加器A的值為0x09
MOV 30H,A 把值送回30H,OK!搞定
CLR AC 清除標(biāo)志位,以便下次使用
RET
上面的兩個(gè)例子經(jīng)過本人實(shí)踐運(yùn)用,十分有用,大家可以參考一下!