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