![AVR單片機原理及應用:第三章(2)指令的應用_第1頁](http://file4.renrendoc.com/view/8bce834a050c4eb0507d36cb33048fd7/8bce834a050c4eb0507d36cb33048fd71.gif)
![AVR單片機原理及應用:第三章(2)指令的應用_第2頁](http://file4.renrendoc.com/view/8bce834a050c4eb0507d36cb33048fd7/8bce834a050c4eb0507d36cb33048fd72.gif)
![AVR單片機原理及應用:第三章(2)指令的應用_第3頁](http://file4.renrendoc.com/view/8bce834a050c4eb0507d36cb33048fd7/8bce834a050c4eb0507d36cb33048fd73.gif)
![AVR單片機原理及應用:第三章(2)指令的應用_第4頁](http://file4.renrendoc.com/view/8bce834a050c4eb0507d36cb33048fd7/8bce834a050c4eb0507d36cb33048fd74.gif)
![AVR單片機原理及應用:第三章(2)指令的應用_第5頁](http://file4.renrendoc.com/view/8bce834a050c4eb0507d36cb33048fd7/8bce834a050c4eb0507d36cb33048fd75.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、AVR單片機原理及應用第三章(2)指令的應用(匯編語言程序設計)匯編語言程序設計步驟 一個應用程序的編制,通??梢苑殖梢韵?個步驟:(1)擬制設計任務書 (2)建立數(shù)學模型 (3)確立算法 (4)繪制程序流程圖 (5)編制匯編語言源程序 (6)上機調試 擬制設計任務書建立或修改數(shù)學模型確立算法編制或修改流程圖編制或修改程序匯編通過?上機調試完成調試通過?試運行通過?程序有大問題?YYYNNNNY3.8.1 簡單程序設計也稱順序程序或直接程序例:編程把SRAM中$0060單元內兩個BCD數(shù)變換成ASCII碼,并放在$0061和$0062單元(低4位BCD數(shù)的ASCII碼放在$0061單元) .i
2、nclude “m16def.inc”ldi xl,$61ldi xh,$00lds r16,$0060mov r17,r16andi r16,$0fori r16,$30st x+,r16swap r17andi r17,$0fori r17,$30st x+,r17here:rjmp here.exit3.8.2 分支程序設計又稱散轉程序.include “m16def.inc”.SET VAR=0X0070.SET FUNC=0X0071.ORG $000RJMP MAIN.ORG 0X002AMAIN:LDS R16,VARTST R16BREQ DONEBRPL POSILDI R1
3、6,$FF ;R16 -1RJMP DONEPOSI:LDI R16,$01DONE:STS FUNC,R16HERE:RJMP HERE.EXIT例:求16位二進制符號數(shù)的絕對值(設此數(shù)的低、高字節(jié)分別存于SRAM的$0060,$0061單元,求絕對值后存回原處).include “m8def.inc”.SET VAR=0X0060.ORG $000RJMP MAIN.ORG 0X0013MAIN:LDS R17,VAR+1TST R17BRPL HERELDS R16,VARSUBI R16,1SBCI R17,0COM R16COM R17STS VAR,R16STS VAR+1,R17
4、HERE:RJMP HERE.EXIT3.8.3 循環(huán)程序設計例:把通用寄存器R0R29置0 xFF.include “m8def.inc”LDI ZL,0LDI ZH,0LDI R29,$FFLOOP:ST Z+,R29CPI ZL,29BRNE LOOPhere:rjmp here.exit例:已知SRAM ADDR($0062)為起始地址的數(shù)據塊的數(shù)據是無符號數(shù),塊長在LEN($0061)單元。求最大值并存入MAX($0060)單元.include “m16def.inc”.SET LEN=$0061.SET ADDR=$0062.SET MAX=$0060.ORG $000RJMP S
5、TART.ORG 0X002ASTART:LDS R20,LENCLR R16LDI XL,LOW(ADDR)LDI XH,HIGH(ADDR)LOOP:LD R18,X+CP R18,R16BRCS NEXT ;BRLOMOV R16,R18NEXT:DEC R20BRNE LOOPSTS MAX,R16here:rjmp here.exit例:已知SRAM ADDR($0062)為起始地址的數(shù)據塊的數(shù)據是符號數(shù),塊長在LEN($0061)單元。求最大值并存入MAX($0060)單元.include “m16def.inc”.SET LEN=$0061.SET ADDR=$0062.SET
6、MAX=$0060.ORG $000RJMP START.ORG 0X002ASTART:LDS R20,LENLDI R16,$80LDI XL,LOW(ADDR)LDI XH,HIGH(ADDR)LOOP:LD R18,X+CP R18,R16BRLT NEXTMOV R16,R18NEXT:DEC R20BRNE LOOPSTS MAX,R16here:rjmp here.exit3.8.4 查表程序設計用于不便于計算的函數(shù)(如平方、立方、三角函數(shù))、固定的編碼(如ASCII碼、數(shù)碼管顯示)等,表格存于FLASH中,用LPM指令來取出對應項的值例:設SRAM的0 x60開始的40個單元字
7、節(jié)存放有40個取值為09的二進制整數(shù)。將它們求平方值后存放到SRAM的0 x100開始的存儲區(qū)。 .include “m16def.inc”rjmp MainTab: .db 0, 1, 4, 9, 16, 25, 36, 49, 64, 81Main:ldi yl, 0 x00 ;SRAM存儲基址ldi yh, 0 x01ldi xl, 0 x60 ;SRAM取數(shù)基址ldi xh, 0 x00ldi r18, 40 ;計數(shù)用loop:ld r16, x+ ;從SRAM取數(shù),地址增1ldi zl, low(Tab*2)ldi zh, high(Tab*2)clr r17add zl, r16a
8、dc zh,r17lpm ;查平方值st y+, r0 ;保存到SRAM并且地址增1dec r18 ;計數(shù)減1brne loop ;未查完,循環(huán)HERE:RJMP HERE.EXIT例:已知SRAM中起始地址為BLOCK1的數(shù)據塊(其長度存放在LEN單元),每個存儲單元中高、低4位為兩個十六進制數(shù),將它們轉換為ASCII碼后存放在BLOCK2開始的連續(xù)存儲單元。 .include “m16def.inc”.SET LEN=$0060.SET BLOCK1=$0061.SET BLOCK2=$0168.ORG $000RJMP MAIN.ORG 0X002AMAIN:LDS R25,LENLDI
9、 XL,LOW(BLOCK1)LDI XH,HIGH(BLOCK1)LDI YL,LOW(BLOCK2)LDI YH,HIGH(BLOCK2)LOOP:LDI ZL,LOW(ASTAB*2)LDI ZH,HIGH(ASTAB*2)CLR R18LD R17,XANDI R17,$0FADD ZL,R17ADC ZH,R18LPM R17,ZST Y+,R17LD R17,X+ANDI R17,$F0SWAP R17LDI ZL,LOW(ASTAB*2)LDI ZH,HIGH(ASTAB*2)ADD ZL,R17ADC ZH,R18LPM R17,ZST Y+,R17DEC R25BRNE LO
10、OPHERE:RJMP HEREASCTAB:.DB $30,$31,$39.DB $41,$42,$463.8.5 子程序設計子程序:完成確定任務、反復調用入口地址(第一條指令地址,常用標號)返回(RET)狀態(tài)保護(如SREG等)參數(shù)傳遞(R0R31,或者堆棧方式)例: SRAM中HEX單元的兩個十六進制數(shù),分別轉成ASCII碼存入ASC和ASC+1單元.INCLUDE “M16DEF.INC”.SET HEX=$0060.SET ASC=$0061LDI R17,LOW(RAMEND)OUT SPL,R17LDI R17,HIGH(RAMEND)OUT SPH,R17LDS R16,HEX
11、PUSH R16RCALL HASCPOP R16STS ASC,R16LDS R16,HEXSWAP R16PUSH R16RCALL HASCPOP R16STS ASC+1,R16HERE:RJMP HEREHASC:POP R16POP R16POP R16ANDI R16,$0FLDI ZL,LOW(ASCTAB*2)LDI,ZH,HIGH(ASCTAB*2)ADD ZL,R16LPM R16,ZPUSH R16IN R16,SPLSBCI R16,2OUT SPL,R16RETASCTAB:.DB $30,$31,$39.DB $41,$42,$463.8.6 代碼轉換子程序BCD
12、碼(Binary-Coded Decimal),用二進制編碼的十進制代碼。這種編碼形式利用了四個位元來儲存一個十進制的數(shù)碼,使二進制和十進制之間的轉換得以快捷地進行。這種編碼技巧,最常用于會計系統(tǒng)的設計里,因為會計制度經常需要對很長的數(shù)字串作準確的計算。相對于一般的浮點式記數(shù)法,采用BCD碼,既可保存數(shù)值的精確度,又可免卻使電腦作浮點運算時所耗費的時間。此外,對于其他需要高精確度的計算,BCD編碼亦很常用 最常用的BCD編碼,就是使用“0”至“9”這十個數(shù)值的二進碼來表示。常稱之為“8421碼”。 補充知識1、 16位二進制數(shù)轉換成BCD碼程序功能: 將(r17:r16) 中16位二進制轉換成
13、 BCD 碼, 個、十、百、千和萬位分別存放于 r16, r17, r18, r19和r20中程序思想: (r17:r16)10000 夠減 X 次, 則萬位為 X; 差值1000 夠減 Y 次; 則千位為 Y;差值100 夠減 Z 次; 則百位為 Y;差值10 夠減 U 次; 則十位為 U;最后的差值為個位程序清單:b16td5: ser r20 ;r20 先送 -1 loop1: inc r20 ;r20 增 1 subi r16,low(10000) ;(r17:r16)10000 sbci r17,high(10000) brcc loop1 ;夠減則返回 loop1 subi r16
14、,low(-10000) ;不夠減,加10000 恢復余數(shù) sbci r17,high(-10000)程序清單: ;(Continued) ser r19 ;r19 先送 -1 loop2: inc r19 ;r19 增 1 subi r16,low(1000) ;(r17:r16)1000 sbci r17,high(1000) brcc loop2 ;夠減則返回 loop2 subi r16,low(-1000) ;不夠減,加1000 恢復余數(shù) sbci r17,high(-1000)程序清單: ;(Continued) ser r18 ;r18 先送 -1 loop3: inc r18
15、;r18 增 1 subi r16,low(100) ;(r17:r16)100 sbci r17,high(100) brcc loop3 ;夠減則返回 loop3 subi r16,low(-100) ;不夠減,加100 恢復余數(shù) sbci r17,high(-100) 程序清單: ;(Continued) ser r17 ;r17 先送 -1 loop4: inc r17 ;r17 增 1 subi r16,10 ;(r17:r16)10 brcc loop4 ;夠減則返回 loop4 subi r16,-10 ;不夠減,加10 恢復余數(shù) ret ;至此,r16即為個位2、 5位BCD碼
16、轉換成16位二進制數(shù)程序功能: 將個、十、百、千和萬位分別放在r16, r17, r18, r19和r20中的5位BCD 碼(r16r20高4位為0000)轉換成16位二進制, 存放于(r17:r16) 中轉換公式為: (r17:r16)= r16+10*r17+100*r18+1000*r19+10000*r20程序清單:d5tb16: tst r17 ;測試 r17 rjmp d5tb16_2 d5tb16_1: subi r16,-10 ;r16 加 10,不會發(fā)生進位dec r17 ;r17 減 1 d5tb16_2: brne d5tb16_1 ;非 0 轉 d5tb16_1程序清單
17、: ;(Continued) tst r18 ;測試 r18 rjmp d5tb16_4 d5tb16_3: subi r16,low(-100) ;(r17:r16)加 100 sbci r17,high(-100) dec r18 ;r18 減 1 d5tb16_4: brne d5tb16_3 ;非 0 轉 d5tb16_3 程序清單: ;(Continued) tst r19 ;測試 r19 rjmp d5tb16_6 d5tb16_5: subi r16,low(-1000) ;(r17:r16)加 1000 sbci r17,high(-1000) dec r19 ;r19 減 1
18、 d5tb16_6: brne d5tb16_5 ;非 0 轉 d5tb16_5程序清單: ;(Continued) tst r20 ;測試 r20 rjmp d5tb16_8 d5tb16_7: subi r16,low(-10000) ;(r17:r16)加 10000 sbci r17,high(-10000) dec r20 ;r20 減 1 d5tb16_8: brne d5tb16_7 ;非 0 轉 d5tb16_7 ret3、 5位壓縮BCD碼轉換成16位二進制數(shù)壓縮BCD碼與非壓縮BCD碼的區(qū)別:壓縮BCD碼的每一位用4位二進制表示,一個字節(jié)表示兩位十進制數(shù)。例如1001011
19、0B表示十進制數(shù)96D;非壓縮BCD碼用1個字節(jié)表示一位十進制數(shù),高四位總是0000,低4位的00001001表示09.例如00001000B表示十進制數(shù)8 程序功能:將五位壓縮BCD碼轉換為16位二進制。五位壓縮BCD碼存于r18:r17:r16 (r18 高四位為 0), 二進制存放于(r17:r16) 程序思想: 先將壓縮 BCD 碼轉換為 BCD 碼, 放到 r16(個)、r17(十)、r18(百)、r19(千)、r20(萬) 5個字節(jié)中, 再調用d5tb16子程序即可程序清單:yd5tb16: mov r20,r18 ;取出萬位 mov r19,r17 ;令 r19=r17 mov
20、r18,r17 ;令 r18=r17 mov r17,r16 ;令 r17=r16 andi r16,$0f ;取出個位 andi r17,$f0 swap r17 ;取出十位 andi r18,$0f ;取出百位 andi r19,$f0 swap r19 ;取出千位 rcall d5tb16 ;調用d5tb16五位BCD到16位二進制的轉換 ret 3.8.7 運算程序設計加減運算程序設計1、無符號多字節(jié)加減運算程序16位加法add16: add r16,r18 ; r17:r16+r19:r18r17:r16 adc r17,r19 ret16 位帶立即數(shù)加法addi16: subi r
21、16,low(-addi2) ;無立即數(shù)(字節(jié))加法 ; r17:r16+addi2 r17:r16 sbci r17,high(-addi2) ;addi2 為 16 位立即數(shù)ret16位減法sub16: sub r16,r18 ; r17:r16-r19:r18r17:r16 sbc r17,r19 ret16 位帶立即數(shù)減法subi16: subi r16,low(subi2) ; r17:r16-subi2 r17:r16 sbci r17,high(subi2) ;subi2 為 16 位立即數(shù)ret16位比較cp16: cp r16,r18 ; r17:r16 與 r19:r18
22、相比較 cpc r17,r19ret16 位帶立即數(shù)比較cpi16: cpi r16,low(cp2) ; r17:r16 與 16 位立即數(shù) cp2 相比較 ldi r18, high(cp2) cpc r17,r18ret16位取補程序 (求補碼方法:取反后再加1)beg16: com r16 ;r17:r16 取補并回存 (先取反) com r17 subi r16,low(-1) ;再加1(通過減去-1實現(xiàn)) sbci r17,high(-1) ret32位加法程序ADD32: ;32 位加法程序 ADD R16,R20 ADC R17,R21 ADC R18,R22 ADC R19,
23、R23ret32位帶立即數(shù)加法程序SUBI32: ; SUBI R16,low(-data) SBCI R17,high (-data) SBCI R18,byte3 (-data) SBCI R19,byte4 (-data)ret 32位減法程序SUB32: ;32 位減法程序 SUB R16,R20 SBC R17,R21 SBC R18,R22 SBC R19,R23ret2、帶符號加減運算程序例:16位二進制符號數(shù)(補碼表示)加法R17:R16 + R20:R19 R18:R17:R16思路:先擴展為3字節(jié),再加SADD16:TST R17BRMI NT1CLR R18RJMP NE
24、XT1NT1:LDI R18,$FFNEXT1:TST R20BRMI NT2CLR R21RJMP NEXT2NT2: SER R21NEXT2:ADD R16,R19ADC R17,R20ADC R18,R21RET綜合例題: 動態(tài)掃描五位數(shù)碼管顯示靜態(tài)顯示 1 位數(shù)碼需占 8 位口(包括小數(shù)點),要顯示 5 位數(shù)碼需 40 位輸出口,這顯然是不實用的。為了節(jié)省輸出口,可采用動態(tài)掃描方式,顯示五位數(shù)碼只需 13 位輸出口電路如下圖,B 口作字線, D 口低 5 位作位線,動態(tài)掃描顯示五位數(shù)碼,利用人眼的視覺暫留效應,可看到穩(wěn)定的數(shù)字程序:16位二進制數(shù)(r17:r16)轉換為5位BCD碼(
25、個萬位分別存于r18r22),并用數(shù)碼管顯示.include 8535def.inc .org $0000 rjmp reset tab:.db $3f,$06,$5b,$4f,$66,$6d,$7d,$07,$7f,$6f reset: ldi r16,low(ramend) ;棧指針置初值 out spl,r16 ldi r16,high(ramend) out sph,r16 ldi r16,$ff ;定義 PB PD 為輸出口 out ddrb,r16 out ddrd,r16 ldi r16,$ff ;設待顯示數(shù)為$ffff(即65535) ldi r17,$ff rcall b16td5 ;調二轉十子程見 4.3.1 mov r22,r20 ;將 BCD 碼送 r18r22 m
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 軟件安全人才隊伍建設研究-詳解洞察
- 梧州2025年廣西梧州市事業(yè)單位招聘1257人筆試歷年參考題庫附帶答案詳解
- 2025年中國塑鋼垂簾軌市場調查研究報告
- 2025年針織橫機配件項目可行性研究報告
- 廣州廣東廣州市花都區(qū)花山鎮(zhèn)和郁小學臨聘教師招聘筆試歷年參考題庫附帶答案詳解
- 廣東廣東海洋大學后勤保障部招聘非編制水電維修工(第二次)筆試歷年參考題庫附帶答案詳解
- 2025年球衣網布項目可行性研究報告
- 2025年水電解器架項目可行性研究報告
- 2025至2031年中國旋風式二級回收裝置行業(yè)投資前景及策略咨詢研究報告
- 2025年抗菌防霉乳膠漆項目可行性研究報告
- 前列腺癌的診斷與治療
- 人教版八年級數(shù)學初中數(shù)學《平行四邊形》單元教材教學分析
- EPC項目設計及施工的配合
- 年產5萬噸1,4-丁二醇的工藝流程設計
- (高清版)TDT 1037-2013 土地整治重大項目可行性研究報告編制規(guī)程
- 幼兒園春季開學教職工安全培訓內容
- 儲油罐安全操作規(guī)程培訓
- 情緒障礙跨診斷治療的統(tǒng)一方案
- 《萬以內數(shù)的認識》大單元整體設計
- 中醫(yī)護理質量敏感指標的構建
- 聚焦幼兒作品分析的游戲觀察與評價
評論
0/150
提交評論