機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
EM78系列單片機(jī)的子程序
EM78系列單片機(jī)的子程序
 更新時間:2008-7-26 20:11:00  點擊數(shù):2
【字體: 字體顏色
 

一 二進(jìn)制數(shù)轉(zhuǎn)換為ASCⅡ碼
                   將一個字節(jié)的二進(jìn)制數(shù)轉(zhuǎn)換為兩位16進(jìn)制數(shù)的ASCⅡ碼
                  main: MOV  a,@0x9f  二進(jìn)制數(shù)為0x9f
                  MOV  0x30,a  二進(jìn)制數(shù)存入0x30
                  MOV  a,@0x02
                  MOV  0x10,a  0x10中存放轉(zhuǎn)換次數(shù)
                  MOV  a,@0x31
                  MOV  0x04,a  0x04中為轉(zhuǎn)換后數(shù)據(jù)存放地址
                  MOV  a,0x30
                  B1:  and  a,@0x0f  取a低4位
                  MOV  0x00,a
                  sub  a,@0x09  低4位大于9跳往B2
                  jbs  0x03,0
                  jmp  B2
                  MOV  a,0x00  低4位不大于9則加0x30
                  add  a,@0x30
                  MOV  0x00,a  將ASCⅡ碼存入0X04所指單元
                  jmp  B3
                  B2:  MOV  a,0x00  大于9則加0X37
                  add  a,@0x37
                  MOV  0x00,a
                  B3:  swapa 0x30   將0X30高4位換入A低4位
                  inc  0x04   存儲地址加1
                  djz  0x10   循環(huán)次數(shù)減1,為0則返回
                  jmp  B1   不為0繼續(xù)轉(zhuǎn)換

                  self:  jmp  self
                  eop
                  

                  二 多字節(jié)二進(jìn)制加法
                  
            0X20,0X21中的二進(jìn)制無符號數(shù)與0X22,0X23中的二進(jìn)制無符號數(shù)相加,結(jié)果放在0X24,0X25,0X26中,低地址中放低字節(jié)數(shù)據(jù)。
                   Main: MOV   a,@0x78  賦值
                  MOV  0x20,a
                  MOV  a,@0xc6
                  MOV  0x21,a
                  MOV  a,@0x86
                  MOV  0x22,a
                  MOV  a,@0x9e
                  MOV  0x23,a
                  MOV  a,@0x0   0x26單元清0
                  MOV  0x26,a
                  MOV  a,0x21
                  add  a,0x23
                  MOV  0x25,a   高字節(jié)相加,結(jié)果送0x25
                  jbc  0x03,0
                  inc  0x26     有進(jìn)位則0x26加1
                  MOV  a,0x20
                  add  a,0x22
                  MOV  0x24,a   低字節(jié)相加,結(jié)果送0x24
                  jbs  0x03,0
                  jmp   self    無進(jìn)位跳self
                  inc  0x25    有進(jìn)位0x25加1
                  jbc  0x03,0
                  inc  0x26     有進(jìn)位0x26加1
                  self:   jmp  self
                  eop

                  三 多字節(jié)二進(jìn)制減法
                   0x20,0x21中的二進(jìn)制無符號數(shù)減0x22,0x23中的二進(jìn)制無符號數(shù), 低地址中放低字節(jié)數(shù)據(jù)。假設(shè)被減數(shù)大于減數(shù)。
                  注意:(1)sub指令減出結(jié)果為正時,c標(biāo)志置1。
                   (2)sub指令減出結(jié)果為0時,c標(biāo)志也置1。
                  即,sub指令執(zhí)行后,c標(biāo)志清0表示結(jié)果為負(fù)。
                  main: MOV  a,@0x67 賦值
                  MOV  0x20,a
                  MOV  a,@0xff
                  MOV  0x21,a
                  MOV  a,@0xe8
                  MOV  0x22,a
                  MOV  a,@0x44
                  MOV  0x23,a   高字節(jié)相減
                  sub  a,0x21
                  MOV  0x25,a  結(jié)果存0x25
                  MOV  a,0x22  低字節(jié)相減
                  sub  a,0x20
                  MOV  0x24,a
                  jbs  0x03,0
                  dec  0x25   有借位則0x25減1
                  self:  jmp  self
                  eop

                  四 二進(jìn)制乘法運算
                  
            EM78單片機(jī)沒有乘法指令,所以乘法運算需要轉(zhuǎn)化為加法運算。0X20單元數(shù)據(jù)乘以0X21單元數(shù)據(jù),結(jié)果放在0X22,0X23中。
                  main: MOV  a,@0x0  0x22,0x23單元清0
                  MOV  0x22,a
                  MOV  0x23,a
                  MOV  a,@0x3f  賦值
                  MOV  0x20,a
                  MOV  a,@0x22
                  MOV  0x21,a
                  mul1: MOV  a,0x20  ;0x20與0x22內(nèi)容相加
                  add  0x22,a
                  jbc  0x03,0
                  inc  0x23   有進(jìn)位0x23加1
                  djz  0x21   0x21中次數(shù)減到0則結(jié)束
                  jmp  mul1  沒減到0則繼續(xù)
                  self:  jmp  self
                  eop

                  五 二進(jìn)制除法運算
                  多字節(jié)二進(jìn)制除法
                  被除數(shù)為3個字節(jié),在0x20、0x21、0x22單元中,0x22.7為最高位,0x20.0為最低位。
                  除數(shù)為2個字節(jié),在0x30、0x31中。
                  算法:EM78單片機(jī)沒有除法指令,而且本例中除法為多字節(jié)除法,可采用如下算法。
                 
            將被除數(shù)擴(kuò)充一個字節(jié)0X23,0X23清0。被除數(shù)左移1位,0X23、0X22中數(shù)據(jù)減去0X31、0X30中數(shù)據(jù),夠減則減且0X20.0置1,減出結(jié)果存入0X23、0X22;不夠減則0X23、0X22保持不變,0X20.0清0。然后被除數(shù)再左移1位,重復(fù)上述過程。共循環(huán)16次,最后0X23、0X22中得相減余數(shù),0X21、0X20中得商。注意,若被除數(shù)左移后C標(biāo)志為1,則不比較0X23、0X22與0X31、0X30數(shù)據(jù)大小關(guān)系而直接相減。
                  main:  MOV  a,@0x55  被除數(shù)賦值
                  MOV  0x20,a
                  MOV  0x21,a
                  MOV  0x22,a
                  MOV  a,@0x0  被除數(shù)擴(kuò)充1字節(jié)并清0
                  MOV  0x23,a
                  MOV  a,@0x12  除數(shù)賦值
                  MOV  0x30,a
                  MOV  0x31,a

                  MOV  a,@0x10  循環(huán)次數(shù)為16
                  MOV  0x32,a
                  again:  call  rt_sub  調(diào)移位除法子程
                  djz  0x32   16次循環(huán)完成則結(jié)束
                  jmp  again  未完成則繼續(xù)

                  self:   jmp  self

                  rt_sub:
                  bc  0x03,0  c標(biāo)志清0
                  rlc  0x20   被除數(shù)左移1位
                  rlc  0x21
                  rlc  0x22
                  rlc  0x23
                  jbc  0x03,0
                  jmp  rt3   c標(biāo)志為1則直接相減
                  MOV  a,0x23  c標(biāo)志為0則先比較大小
                  MOV  0x25,a
                  MOV  a,0x22
                  MOV  0x24,a
                  MOV  a,0x31  先比較高位
                  sub  0x25,a
                  jbc  0x03,2
                  jmp  rt1   高位相等跳rt1比較低位
                  jmp  rt2   高位不等跳rt2
                  rt1:   MOV  a,0x30  比較低位
                  sub  0x24,a
                  jbc  0x03,2
                  jmp  rt3   低位也相等則跳rt3,相減,上1
                  rt2:   jbs  0x03,0
                  ret     減數(shù)大則返回,減數(shù)小則相減,上1
                  rt3:   bs  0x20,0  上1
                  call  sub_2b  調(diào)2字節(jié)減法子程
                  ret

                  sub_2b:
                  MOV  a,0x31  高字節(jié)相減
                  sub  0x23,a
                  MOV  a,0x30  低字節(jié)相減
                  sub   0x22,a
                  jbc  0x03,2
                  ret     低字節(jié)相等,無借位,返回
                  jbc  0x03,0
                  ret     無借位,返回
                  dec  0x23   低字節(jié)相減有借位,高字節(jié)結(jié)果減1
                  ret
                  eop

                  六 BCD數(shù)轉(zhuǎn)換為二進(jìn)制數(shù)
                   兩字節(jié)壓縮BCD碼轉(zhuǎn)換為兩字節(jié)二進(jìn)制數(shù)。算法如下:
                 
            BCD碼abcd=1000a+100b+10c+d=10{10[10a+b]+c}+d,將各位BCD碼分離出之后,即可根據(jù)此式轉(zhuǎn)換為二進(jìn)制數(shù)。涉及到乘法運算和多字節(jié)加法運算。
                   0X20,0X21中為BCD碼,0X21高4位為最高位。轉(zhuǎn)換結(jié)果放在0X30,0X31中。
                  main:  MOV  a,@0x79
                  MOV  0x20,a
                  MOV  a,@0x54
                  MOV  0x21,a  賦值
                  MOV  a,0x20
                  and  a,@0x0f
                  MOV  0x22,a
                  swapa 0x20
                  and  a,@0x0f
                  MOV  0x23,a
                  MOV  a,0x21
                  and  a,@0x0f
                  MOV  0x24,a
                  swapa 0x21
                  and  a,@0x0f
                  MOV  0x25,a  BCD碼展開后存于0X22,0X23,0X24,0X25
                  MOV  a,0x25,  0X25為最高位
                  MOV  0x30,a
                  MOV  a,@0x0  多字節(jié)加法高位為0
                  MOV  0x31,a
                  MOV  a,0x24
                  MOV  0x32,a
                  call  a_b  調(diào)子程
                  MOV  a,0x23
                  MOV  0x32,a
                  call  a_b
                  MOV  a,0x22
                  MOV  0x32,a
                  call  a_b
                  self:   jmp  self

                  a_b:
                  MOV  a,@0x0  0X34,0X35存儲中間結(jié)果
                  MOV  0x34,a
                  MOV  0x35,a
                  MOV  a,@0x0a  實現(xiàn)乘10
                  MOV  0x33,a
                  a1:   MOV  a,0x35  兩字節(jié)二進(jìn)制加法,在本例中高字節(jié)肯定無進(jìn)位
                  add  a,0x31
                  MOV  0x35,a
                  MOV  a,0x34
                  add  a,0x30
                  MOV  0x34,a
                  jbc  0x03,0
                  inc  0x35
                  djz  0x33
                  jmp  a1
                  MOV  a,0x32
                  add  0x34,a
                  jbc  0x03,0
                  inc  0x35
                  MOV  a,0x34
                  MOV  0x30,a
                  MOV  a,0x35
                  MOV  0x31,a
                  ret
                  eop

                  七 二進(jìn)制數(shù)轉(zhuǎn)換為BCD碼
                   本例為單字節(jié)二進(jìn)制數(shù)(0X20)轉(zhuǎn)換為非壓縮BCD碼,存在0X25,0X24,0X23中,0X25為百位,0X23為個位。
                  main: MOV  a,@0xa4  賦值
                  MOV  0x20,a
                  MOV  0x21,a
                  MOV  0x22,a
                  MOV  a,@0x0  0x23,0x24,0x25單元清0
                  MOV  0x23,a
                  MOV  0x24,a
                  MOV  0x25,a
                  MOV  a,@0x64  對100的個數(shù)計數(shù)
                  MOV  0x26,a
                  MOV  a,@0x25  百位存在0x25中
                  MOV  0x04,a
                  call  a0   調(diào)計數(shù)子程
                  MOV  a,@0x0a  對10的個數(shù)計數(shù)
                  MOV  0x26,a
                  dec  0x04   個位存在0x24中
                  call  a0
                  MOV  a,0x22  除去百位,十位,余下的即個位,存入0x23
                  MOV  0x23,a
                  self:  jmp  self

                  a0:       計數(shù)子程
                  MOV  a,0x26
                  sub  0x22,a
                  jbs  0x03,2
                  jmp  a1
                  inc  0x00   無余數(shù)則對應(yīng)位加1
                  MOV  a,@0x0  0x21與0x22在返回時應(yīng)保持相同
                  MOV  0x21,a
                  ret
                  a1:  jbs  0x03,0  小于則跳a2
                  jmp  a2
                  inc  0x00   大于則計數(shù)值加1
                  MOV  a,0x22
                  MOV  0x21,a  將0x22保存到0x21中
                  jmp  a0   跳回a0繼續(xù)計數(shù)
                  a2:  MOV  a,0x21  0x21中保存的減之前的數(shù)據(jù),此時恢復(fù)到0x22
                  MOV  0x22,a
                  ret
                  eop

  • 上一篇: EMC單片機(jī)控制的HT1380實時時鐘程序
  • 下一篇: EMC單片機(jī)寫的I2C程序
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1