• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 基于EM78系列單片機的數值轉換子程序

    基于EM78系列單片機的數值轉換子程序

    作者: 時間:2012-07-18 來源:網絡 收藏

    本文引用地址:http://www.czjhyjcfj.com/article/171138.htm

    一 二進制數為ASCⅡ碼
    將一個字節的二進制數為兩位16進制數的ASCⅡ碼
    main: mov a,@0x9f ;二進制數為0x9f
    mov 0x30,a ;二進制數存入0x30
    mov a,@0x02
    mov 0x10,a ;0x10中存放轉換次數
    mov a,@0x31
    mov 0x04,a ;0x04中為轉換后數據存放地址
    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 ;循環次數減1,為0則返回
    jmp B1 ;不為0繼續轉換
    self: jmp self
    eop

    二 多字節二進制加法
    0X20,0X21中的二進制無符號數與0X22,0X23中的二進制無符號數相加,結果放在0X24,0X25,0X26中,低地址中放低字節數據。
    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 ;高字節相加,結果送0x25
    jbc 0x03,0
    inc 0x26 ; 有進位則0x26加1
    mov a,0x20
    add a,0x22
    mov 0x24,a ;低字節相加,結果送0x24
    jbs 0x03,0
    jmp self ;無進位跳self
    inc 0x25 ;有進位0x25加1
    jbc 0x03,0
    inc 0x26 ; 有進位0x26加1
    self: jmp self
    eop
    三 多字節二進制減法
    0x20,0x21中的二進制無符號數減0x22,0x23中的二進制無符號數,
    低地址中放低字節數據。假設被減數大于減數。
    注意:(1)sub指令減出結果為正時,c標志置1。
    (2)sub指令減出結果為0時,c標志也置1。
    即,sub指令執行后,c標志清0表示結果為負。
    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 ; 高字節相減
    sub a,0x21
    mov 0x25,a ;結果存0x25
    mov a,0x22 ;低字節相減
    sub a,0x20
    mov 0x24,a
    jbs 0x03,0
    dec 0x25 ;有借位則0x25減1
    self: jmp self
    eop
    四 二進制乘法運算
    沒有乘法指令,所以乘法運算需要轉化為加法運算。0X20單元數據乘以0X21單元數據,結果放在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內容相加
    add 0x22,a
    jbc 0x03,0
    inc 0x23 ;有進位0x23加1
    djz 0x21 ;0x21中次數減到0則結束
    jmp mul1 ;沒減到0則繼續
    self: jmp self
    eop
    五 二進制除法運算
    多字節二進制除法
    被除數為3個字節,在0x20、0x21、0x22單元中,0x22.7為最高位,0x20.0為最低位。
    除數為2個字節,在0x30、0x31中。
    算法:沒有除法指令,而且本例中除法為多字節除法,可采用如下算法。
    將被除數擴充一個字節0X23,0X23清0。被除數左移1位,0X23、0X22中數據減去0X31、0X30中數據,夠減則減且0X20.0置1,減出結果存入0X23、0X22;不夠減則0X23、0X22保持不變,0X20.0清0。然后被除數再左移1位,重復上述過程。共循環16次,最后0X23、0X22中得相減余數,0X21、0X20中得商。注意,若被除數左移后C標志為1,則不比較0X23、0X22與0X31、0X30數據大小關系而直接相減。
    main: mov a,@0x55 ;被除數賦值
    mov 0x20,a
    mov 0x21,a
    mov 0x22,a
    mov a,@0x0 ;被除數擴充1字節并清0
    mov 0x23,a
    mov a,@0x12 ;除數賦值
    mov 0x30,a
    mov 0x31,a
    mov a,@0x10 ;循環次數為16
    mov 0x32,a
    again: call rt_sub ;調移位除法子程
    djz 0x32 ;16次循環完成則結束
    jmp again ;未完成則繼續
    self: jmp self
    rt_sub:
    bc 0x03,0 ;c標志清0
    rlc 0x20 ;被除數左移1位
    rlc 0x21
    rlc 0x22
    rlc 0x23
    jbc 0x03,0
    jmp rt3 ;c標志為1則直接相減
    mov a,0x23 ;c標志為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 ;減數大則返回,減數小則相減,上1
    rt3: bs 0x20,0 ;上1
    call sub_2b ;調2字節減法子程
    ret
    sub_2b:
    mov a,0x31 ;高字節相減
    sub 0x23,a
    mov a,0x30 ;低字節相減


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 庆城县| 达拉特旗| 邢台县| 金坛市| 图木舒克市| 沂南县| 青河县| 丰都县| 仁化县| 隆回县| 泾阳县| 肥乡县| 扎囊县| 涿鹿县| 波密县| 莱西市| 尉氏县| 盐津县| 丹东市| 金门县| 白河县| 灌云县| 华宁县| 南投县| 霸州市| 永清县| 磐石市| 宜兴市| 永春县| 碌曲县| 巴塘县| 慈溪市| 武功县| 临安市| 深水埗区| 彭山县| 屯昌县| 江津市| 大姚县| 上栗县| 南城县|