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

    EEPW首頁 > 嵌入式系統 > 設計應用 > AVR單片機定點運算及數制轉換子程序

    AVR單片機定點運算及數制轉換子程序

    作者: 時間:2012-04-05 來源:網絡 收藏

    問世以來,獲得廣泛關注。它是一種采用精簡指令集、以時鐘周期為機器周期的高速。它采用快速寄存器文件(共有32個寄存器 R0~R31,其中R16~R31具有較強通用功能)、快速單周期指令。另外在存儲器技術(Flash存儲器、EEPROM)、低功耗、系統可靠性、定時 /計數器功能多樣化等方面也都具特色。但由于采用精簡指令集,它沒有一般8位機的DAA指令。因BCD碼加減法數制都要用到DAA功能,故給使用匯編語言研發帶來不便。本文重點介紹用軟件實現DAA的方法。

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

    計算機采用的十進制操作數一般都為壓縮型8421 BCD碼,每個BCD碼表示1位十進制數。每2位BCD碼共存于同一字節單元中,故BCD涉及狀態寄存器SREG的進位C(第0位)和半進位H(第5 位)。它們分別為高、低位BCD的進(借)位。在進行BCD碼加減時,計算機是按二進制數對待的,因此會產生與十進制運算規則不相符合的情況:一是當產生進(借)位(C=1或H=1)時,該進(借)位等于16(對所涉及的1位BCD碼而言),而在十進制運算中應等于10;二是可能產生非法BCD碼(值大于9)。軟件DAA即為糾正以上錯誤而設的。

    1 軟件DAA的實現方法

    1.1 實現加法DAA功能ADAA和ADAA1的設計方法

    經實踐考查,BCD碼加法運算,可產生以下3種情況:

    ① 不須調整,特點是既不產生進位,也不產生非法BCD碼。如$22+$11=$33。

    ② 產生非法BCD碼,必須加6調整。特點是BCD碼相加后不產生進位,但加6調整后產生進位。如
    $36+$37=$6D(產生非法BCD),加6調整后變為$73(產生半進位H)。$68+$87=$EF,加$66調整后變為$155(產生進位C和半進位H)等。

    ③ 產生進位,必須加6調整。特點是BCD碼相加只產生進位,不會同時產生非法BCD碼;而加6調整后既不會再產生進位/半進位(而是清除了原來的進位/半進位),也不會產生非法BCD碼。例:
    $99+$88=$121,進位C和半進H位都置位,故加$66來調整:$21+$66=$87,并要恢復進位C。

    綜合以上3種情況,得出下面加法DAA之實現方法:首先保存BCD碼相加后的狀態寄存器SREG(保存其中的進位C和半進位H,稱為Co和Ho)。再將 BCD碼之和加上$66,產生出新的進位Cn及半進位Hn。若Co、Cn中有1個置位(只能有1個!),說明高位BCD滿足調整條件并調整完畢,否則為不夠調整條件,應減$60恢復;若Ho、Hn中有1個(只能有1個!)置位,說明低位BCD滿足調整條件并調整完畢,否則為不夠調整條件,應減6恢復。程序中是將新、舊進位和半進位對應或起來,只對或結果進行判斷。注意,軟件DAA功能既要保證本字節壓縮BCD碼相加值的正確性,又要保證對高位 BCD產生進位的正確性,故要將Co∨Cn的結果返還給SREG,以使下一步能正確實現高位BCD帶進位加。

    ADAA為BCD碼相加調整,使用寄存器R20作為工作單元(使用R22、R11、R10等3個寄存器作為輔助工作單元),所有調整工作都在此單元內進行。

    ADAA1為數制程序中實現BCD碼左移調整的,為加法DAA之特例:它在R20工作單元內實施BCD碼帶進位位自加并完成對和的調整。

    1.2 實現減法DAA功能子程序SDAA的設計方法

    由實踐可知,減法DAA要比加法來得簡單:只須對產生借位的BCD碼進行調整。BCD碼減法運算,只有以下2種情況:

    ① 不產生借位,不須調整,如 $22-$11=$11。

    ② 產生借位,此時不論有否非法BCD碼產生,一律對產生借位的BCD碼加$A調整。但沒有加字節型立即數指令,改為減6調整,要注意加原和減補對進位的影響是相反的。為保證多字節壓縮BCD碼運算的正確性,若調整后清除了借位C,必須將其恢復。例如$22-$54=$CE,因C、H皆置位,用減去$66來調整$CE-$66=$68,調整后清除了借位C,故子程序中還要加SEC 指令來恢復借位C。

    注:MCS-51單片機減法DAA子程序很容易按此移植(半進位為AC)。

    1.3 實現右移DAA功能子程序RDAA的設計方法

    見3 數制子程序中對BCD碼右移調整的說明。

    2 運算子程序

    (1)多字節壓縮BCD碼加法子程序ADBCD

    加法在寄存器內直接完成,以R20為DAA工作單元。BCD碼相加后,將和送到R20,調用ADAA子程序,實現對和的調整(返回主程序后再回送調整結果)。

    (2)多字節壓縮BCD碼減法子程序SUBCD

    減法在寄存器內直接完成,以R20為DAA工作單元。BCD碼相減后,將差送至R20,調用SDAA子程序,實現對差的調整(返回主程序后再回送調整結果)。

    (3)乘法子程序MUL16

    操作:(R13,R12)×(R15,R14)→ R17,R16,R15,R14

    采用字乘字無符號數運算。采取逐次右移部分積和乘數,當乘數移出位等于1時將被乘數加入部分積的方法完成計算。可視為16位整數×16位整數→32位整數,也可視為16位整數×16位小數→16位整數,或視為16位小數×16位小數→32位小數。可加上舍入處理。

    (4)除法子程序DIV16

    操作:(R17,R16,R15,R14)÷(R13,R2)→R15,R14

    采用雙字除以字無符號數運算。采取逐次左移被除數與除數相減、試商、記商的方法完成計算。可視為雙字型整數÷字型整數→字型整數,也可視為小數÷小數→ 小數。要求 (R17,R16)<(R13,R12)。可加上舍入處理,但要注意可能產生舍入溢出(例如$7FFFC000÷$8000=$FFFF.8,舍入取整即產生溢出)。


    上一頁 1 2 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 喀什市| 宁强县| 贡嘎县| 蛟河市| 邮箱| 美姑县| 同江市| 阿荣旗| 陆丰市| 万全县| 文安县| 新和县| 旺苍县| 麻城市| 敦化市| 容城县| 远安县| 抚州市| 高邑县| 连南| 华容县| 赤壁市| 惠水县| 藁城市| 丰城市| 库车县| 扎兰屯市| 连江县| 厦门市| 镇赉县| 廊坊市| 互助| 曲阜市| 睢宁县| 名山县| 黑河市| 龙山县| 文成县| 阜平县| 加查县| 永登县|