當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀]AVR單片機(jī)問世以來,獲得廣泛關(guān)注。它是一種采用精簡(jiǎn)指令集、以時(shí)鐘周期為機(jī)器周期的高速單片機(jī)。它采用快速寄存器文件(共有32個(gè)寄存器 R0~R31,其中R16~R31具有較強(qiáng)通用功能)、快速單周期指令。另外在存儲(chǔ)器技術(shù)(F

AVR單片機(jī)問世以來,獲得廣泛關(guān)注。它是一種采用精簡(jiǎn)指令集、以時(shí)鐘周期為機(jī)器周期的高速單片機(jī)。它采用快速寄存器文件(共有32個(gè)寄存器 R0~R31,其中R16~R31具有較強(qiáng)通用功能)、快速單周期指令。另外在存儲(chǔ)器技術(shù)(Flash存儲(chǔ)器、EEPROM)、低功耗、系統(tǒng)可靠性、定時(shí) /計(jì)數(shù)器功能多樣化等方面也都具特色。但由于采用精簡(jiǎn)指令集,它沒有一般8位機(jī)的DAA指令。因BCD碼加減法運(yùn)算及定點(diǎn)數(shù)制轉(zhuǎn)換都要用到DAA功能,故給使用匯編語(yǔ)言研發(fā)帶來不便。本文重點(diǎn)介紹用軟件實(shí)現(xiàn)DAA的方法。

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

1 軟件DAA的實(shí)現(xiàn)方法

1.1 實(shí)現(xiàn)加法DAA功能子程序ADAA和ADAA1的設(shè)計(jì)方法

經(jīng)實(shí)踐考查,BCD碼加法運(yùn)算,可產(chǎn)生以下3種情況:

① 不須調(diào)整,特點(diǎn)是既不產(chǎn)生進(jìn)位,也不產(chǎn)生非法BCD碼。如$22+$11=$33。

② 產(chǎn)生非法BCD碼,必須加6調(diào)整。特點(diǎn)是BCD碼相加后不產(chǎn)生進(jìn)位,但加6調(diào)整后產(chǎn)生進(jìn)位。如
$36+$37=$6D(產(chǎn)生非法BCD),加6調(diào)整后變?yōu)?73(產(chǎn)生半進(jìn)位H)。$68+$87=$EF,加$66調(diào)整后變?yōu)?155(產(chǎn)生進(jìn)位C和半進(jìn)位H)等。

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

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

ADAA為BCD碼相加調(diào)整子程序,使用寄存器R20作為工作單元(使用R22、R11、R10等3個(gè)寄存器作為輔助工作單元),所有調(diào)整工作都在此單元內(nèi)進(jìn)行。

ADAA1為數(shù)制轉(zhuǎn)換程序中實(shí)現(xiàn)BCD碼左移調(diào)整的子程序,為加法DAA之特例:它在R20工作單元內(nèi)實(shí)施BCD碼帶進(jìn)位位自加并完成對(duì)和的調(diào)整。

1.2 實(shí)現(xiàn)減法DAA功能子程序SDAA的設(shè)計(jì)方法

由實(shí)踐可知,減法DAA要比加法來得簡(jiǎn)單:只須對(duì)產(chǎn)生借位的BCD碼進(jìn)行調(diào)整。BCD碼減法運(yùn)算,只有以下2種情況:

① 不產(chǎn)生借位,不須調(diào)整,如 $22-$11=$11。

② 產(chǎn)生借位,此時(shí)不論有否非法BCD碼產(chǎn)生,一律對(duì)產(chǎn)生借位的BCD碼加$A調(diào)整。但AVR單片機(jī)沒有加字節(jié)型立即數(shù)指令,改為減6調(diào)整,要注意加原和減補(bǔ)對(duì)進(jìn)位的影響是相反的。為保證多字節(jié)壓縮BCD碼運(yùn)算的正確性,若調(diào)整后清除了借位C,必須將其恢復(fù)。例如$22-$54=$CE,因C、H皆置位,用減去$66來調(diào)整$CE-$66=$68,調(diào)整后清除了借位C,故子程序中還要加SEC 指令來恢復(fù)借位C。

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

1.3 實(shí)現(xiàn)右移DAA功能子程序RDAA的設(shè)計(jì)方法

見"3 定點(diǎn)數(shù)制轉(zhuǎn)換子程序"中對(duì)BCD碼右移調(diào)整的說明。

2 定點(diǎn)運(yùn)算子程序

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

加法在寄存器內(nèi)直接完成,以R20為DAA工作單元。BCD碼相加后,將和送到R20,調(diào)用ADAA子程序,實(shí)現(xiàn)對(duì)和的調(diào)整(返回主程序后再回送調(diào)整結(jié)果)。

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

減法在寄存器內(nèi)直接完成,以R20為DAA工作單元。BCD碼相減后,將差送至R20,調(diào)用SDAA子程序,實(shí)現(xiàn)對(duì)差的調(diào)整(返回主程序后再回送調(diào)整結(jié)果)。

(3)乘法子程序MUL16

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

采用字乘字無(wú)符號(hào)數(shù)運(yùn)算。采取逐次右移部分積和乘數(shù),當(dāng)乘數(shù)移出位等于1時(shí)將被乘數(shù)加入部分積的方法完成計(jì)算。可視為16位整數(shù)×16位整數(shù)→32位整數(shù),也可視為16位整數(shù)×16位小數(shù)→16位整數(shù),或視為16位小數(shù)×16位小數(shù)→32位小數(shù)。可加上舍入處理。

(4)除法子程序DIV16

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

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

(5)開平方子程序SQR

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

可視為雙字型整數(shù)X(≤4294967295)開平方,因有舍入處理,方根最大可達(dá)$10000(如X=$FFFF0000開平方即屬此),故用3字節(jié)存儲(chǔ)平方根。也可視為定點(diǎn)小數(shù)開平方,將X自最高位起每2位進(jìn)行分割,采用摸擬手算的方法(X每左移2位試出1位根)開平方。

3 定點(diǎn)數(shù)制轉(zhuǎn)換子程序

該組子程序由定點(diǎn)整數(shù)二翻十、定點(diǎn)整數(shù)十翻二、定點(diǎn)小數(shù)二翻十和定點(diǎn)小數(shù)十翻二等4個(gè)子程序組成,分別稱為CONV1、CONV2、CONV3和CONV4。由于AVRAT90系列單片機(jī)只有字節(jié)乘字節(jié)指令,計(jì)算功能不強(qiáng),故采用移位調(diào)整法實(shí)現(xiàn)多字節(jié)數(shù)據(jù)的數(shù)制轉(zhuǎn)換。其中,整數(shù)二翻十子程序CONV1和小數(shù)十翻二子程序CONV4采取左移調(diào)整的方法,而整數(shù)十翻二子程序CONV2和小數(shù)二翻十子程序CONV3采用右移調(diào)整的方法。不論左移還是右移,調(diào)整總是對(duì)十進(jìn)制數(shù)進(jìn)行,其目的是使十進(jìn)制數(shù)的移位規(guī)則符合于二進(jìn)制數(shù)移位規(guī)則:左移1位值增倍,右移1位值折半。當(dāng)某位BCD中的最高位(8)左移移入高位BCD中時(shí),按二進(jìn)制數(shù)看待應(yīng)為16,而按十進(jìn)制數(shù)相鄰位看待只能為10,故要做加6調(diào)整。另外,左移過程中若出現(xiàn)非法BCD碼時(shí)也要對(duì)其調(diào)整。BCD碼左移只不過是BCD碼相加的特例,故調(diào)用 BCD碼相加調(diào)整子程序ADAA1就可完全解決左移調(diào)整問題。當(dāng)右移BCD碼時(shí),若某位BCD中的1移入低位BCD最高位,按二進(jìn)制數(shù)看待,1折半應(yīng)為 0.5,而低位BCD中最高位值為0.8,故要做減3(即0.3)調(diào)整。因8421BCD碼其各位之權(quán)(某位上的1所代表的實(shí)際數(shù)值)分別為8、4、2和 1,若只在本碼位內(nèi)部移動(dòng),則符合左移1位值增倍、右移1位值折半的規(guī)則,故不須調(diào)整。

本組定點(diǎn)運(yùn)算及數(shù)制轉(zhuǎn)換子程序?yàn)檫m應(yīng)大多數(shù)應(yīng)用場(chǎng)合而設(shè),具體使用時(shí)可加以修改。如整數(shù)二翻十時(shí),二進(jìn)制數(shù)不超過$FFFF,為提高運(yùn)行速度,可將二進(jìn)制數(shù)改為二字節(jié),十進(jìn)制數(shù)改為3字節(jié),并將移位循環(huán)次數(shù)(R21)改為16。如數(shù)據(jù)精度不夠,可把乘法子程序改為3字節(jié)乘3字節(jié)等等。

ADAA1為左移BCD碼并對(duì)其進(jìn)行調(diào)整的子程序。

RDAA為對(duì)右移后的BCD碼進(jìn)行測(cè)試、實(shí)施減3調(diào)整的子程序,以R20為工作單元。

注:開平方子程序SQR說明中,請(qǐng)將對(duì)開平方數(shù)R17、R16、R15、R14加上完整根號(hào)。

參考文獻(xiàn)

1 宋建國(guó),等. AVR單片機(jī)原理及其應(yīng)用. 北京:北京航空航天大學(xué)出版社, 2000
2 張克彥. MCS-51/196單片機(jī)浮點(diǎn)程序和實(shí)用程序(2.2.7 2.4.1 3.1.2 3.1.3等小節(jié)). 北京:北京航空航天大學(xué)出版社, 2001
 

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉