《AVR單片機(jī)》PPT課件.ppt
《《AVR單片機(jī)》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《AVR單片機(jī)》PPT課件.ppt(35頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、 AVR單片機(jī)原理及應(yīng)用 陳淵睿 Tel: 13002086301 E-mail: 華南理工大學(xué)電力學(xué)院 第四章 匯編語言程序設(shè)計(jì) 4.1 匯編語言基礎(chǔ) 匯編語言 源文件 是由匯編語言代碼和匯編 程序指令所組成的 ASCII 字符文件。 匯編語言源文件包括 指令助記符 、 標(biāo)號 和 偽指令 。指令助記符和偽指令常帶 操作數(shù) 4.1.1 匯編 語句格式 程序輸入行有下列種形式: 【標(biāo)號】偽指令【操作數(shù)】【注釋】。 【標(biāo)號】指令【操作數(shù)】【注釋】。 注釋。 空行。 例子: Label: .EQU Var1=100 ;置 Var1 等于 100 偽指令
2、 .EQU Var2=200 ;置 Var2 等于 200 test: rjmp test ;無限循環(huán)指令 ;純注釋行 注意:不限制有關(guān)標(biāo)號偽指令注釋或指令的 列位置 4.1.2匯編器偽指令 偽指令 并不直接轉(zhuǎn)換成操作數(shù),而是用于調(diào)整存儲 器中程序的位置,定義宏,初始化存儲器等 偽指令表 序號 偽指令 說 明 序號 偽指令 說 明 1 BYTE 在 RAM中定義預(yù)留存儲單元 10 EXIT 退出文件 2 CSEG 聲明代碼段 11 INCLUDE 包含指定的文件 3 DB 定義字節(jié)常數(shù) 12 MACRO 宏定義開始 4 DEF 定義寄存器
3、符號名 13 ENDMACRO 宏定義結(jié)束 5 DEVICE 指定為何器件生成匯編代碼 14 LISTMAC 列表宏表達(dá)式 6 DSEG 聲明數(shù)據(jù)段 15 LIST 列表文件生成允許器 7 DW 定義字常數(shù) 16 NOLIST 關(guān)閉列表文件生成 8 EQU 定義標(biāo)識符常量 17 ORG 設(shè)置程序起始位置 9 ESEG 聲明 E2PROM段 18 SET 賦值給標(biāo)識符 表達(dá)式 匯編器的表達(dá)式 由操作數(shù)、運(yùn)算符和函數(shù)組成。 所有的表達(dá)式內(nèi)部為 32位 (二進(jìn)制 ) 操作數(shù) (1)用戶定義的標(biāo)號,該標(biāo)號給出了放置標(biāo)號位置的 定位計(jì)數(shù)器 的值 (2)用戶用 SET偽指令定義的變
4、量 (3)用戶用 EQU偽指令定義的常數(shù) (4)整數(shù)常數(shù),包括下列幾種形式 十進(jìn)制缺省值 10 255 十六進(jìn)制數(shù)二進(jìn)制表示法 0 x0a,$0a,0 xff.$ff 二進(jìn)制數(shù) 0b00001010,0b11111111 (5)PC, 程序存儲器定位計(jì)數(shù)器的當(dāng)前值 匯編器的函數(shù) (而非單片機(jī)內(nèi)的函數(shù) ) 有 LOW、 HIGH、 BYTE2、 BYTE3 匯編器所認(rèn)的運(yùn)算符 部分運(yùn)算符表 序 號 運(yùn)算符 名 稱 優(yōu)先級 說 明 1 ! 邏輯非 14 單目運(yùn)算符,表達(dá)式是 0則返回 1, 表達(dá)式是 1則返回 0 2 逐位非 14 單目運(yùn)算符,將表達(dá)式的值按位取反
5、 3 - 負(fù)號 14 單目運(yùn)算符,使表達(dá)式為算術(shù)負(fù) 4 * 乘法 13 雙目運(yùn)算符,兩個(gè)表達(dá)式相乘 5 / 除法 13 雙目運(yùn)算符,左邊表達(dá)式除以右邊表達(dá)式, 得整數(shù)的商值 6 + 加法 12 雙目運(yùn)算符,兩個(gè)表達(dá)式相加 7 減法 12 雙目運(yùn)算符,左邊表達(dá)式減去右邊表達(dá)式 8 < 右移 11 雙目運(yùn)算符,左邊表達(dá)式值右移右邊表達(dá)式給出的次數(shù) 10 < 小于 10 雙目運(yùn)算符,左邊帶符號表達(dá)式值小于 右邊帶符號表達(dá)式值,則為 1,否則為 0 11 大于 10 雙目運(yùn)算符,左邊帶符號表達(dá)式值大于 右邊帶符號表達(dá)式值,則為 1,否則為 0 13 = 大于等于 10 雙目運(yùn)算符,左邊帶
6、符號表達(dá)式值大于或 等于右邊帶符號表達(dá)式值,則為 1,否則為 0 14 == 等于 9 雙目運(yùn)算符,左邊帶符號表達(dá)式值等于 右邊帶符號表達(dá)式值,則為 1,否則為 0 15 != 不等于 9 雙目運(yùn)算符,左邊帶符號表達(dá)式值不等于 右邊帶符號表達(dá)式值,則為 1,否則為 0 16 R16 -1 RJMP DONE POSI:LDI R16,$01 DONE:STS FUNC,R16 HERE: RJMP HERE .EXIT 4.3 循環(huán)與查表程序設(shè)計(jì) 4.3.1 循環(huán)程序設(shè)計(jì) 例 4.9:已知 SRAM ADDR($0062)為起始地址的數(shù)據(jù)塊的數(shù) 據(jù)是 無符號數(shù) ,塊長在 LEN($0
7、061)單元。求最大值并存 入 MAX($0060)單元 .include “ m8def.inc” .SET LEN=$0061 .SET ADDR=$0062 .SET MAX=$0060 .ORG $000 RJMP START .ORG 0X0013 START:LDS R20,LEN CLR R16 LDI XL,LOW(ADDR) LDI XH,HIGH(ADDR) LOOP: LD R18,X+ CP R18,R16 BRCS NEXT ;BRLO MOV R16,R18 NEXT: DEC R20 BRNE LOOP STS MAX,R16 h
8、ere: rjmp here .exit 例 4.9 :已知 SRAM ADDR($0062)為起始地址的 數(shù)據(jù)塊的數(shù)據(jù)是 符號數(shù) ,塊長在 LEN($0061)單元。 求最大值并存入 MAX($0060)單元 .include “ m8def.inc” .SET LEN=$0061 .SET ADDR=$0062 .SET MAX=$0060 .ORG $000 RJMP START .ORG 0X0013 START:LDS R20,LEN LDI R16,$80 LDI XL,LOW(ADDR) LDI XH,HIGH(ADDR) LOOP: LD R18,X+
9、 CP R18,R16 BRLT NEXT MOV R16,R18 NEXT: DEC R20 BRNE LOOP STS MAX,R16 here: rjmp here .exit 4.3.2 查表程序設(shè)計(jì) 用于 不便于計(jì)算的函數(shù) (如平方、立方、三角函數(shù) )、 固定的 編碼 (如 ASCII碼、數(shù)碼管顯示 )等,表格存于 FLASH中,用 LPM指令來取出對應(yīng)項(xiàng)的值 例:設(shè) SRAM的 0 x60開始的 40個(gè)單元字節(jié)存放有 40個(gè)取值為 0 9的二進(jìn)制整數(shù)。將它們求平方值后存放到 SRAM的 0 x100開始的存儲區(qū)。 .include “ m8def.inc”
10、 rjmp Main Tab: .db 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 Main: ldi yl, 0 x00 ;SRAM存儲基址 ldi yh, 0 x01 ldi xl, 0 x60 ;SRAM取數(shù)基址 ldi xh, 0 x00 ldi r18, 40 ;計(jì)數(shù)用 loop: ld r16, x+ ;從 SRAM取數(shù),地址增 1 ldi zl, low(Tab*2) ldi zh, high(Tab*2) clr r17 add zl, r16 adc zh,r17 lpm ;查平方值 st
11、 y+, r0 ;保存到 SRAM 并且地址增 1 dec r18 ;計(jì)數(shù)減 1 brne loop ;未查完,循環(huán) HERE: RJMP HERE .EXIT 例 4.13:已知 SRAM中起始地址為 BLOCK1的數(shù)據(jù)塊(其長 度存放在 LEN單元),每個(gè)存儲單元中高、低 4位為兩個(gè)十 六進(jìn)制數(shù),將它們轉(zhuǎn)換為 ASCII碼后存放在 BLOCK2開始的 連續(xù)存儲單元。 .include “ m8def.inc” .SET LEN=$0060 .SET BLOCK1=$0061 .SET BLOCK2=$0168 .ORG $000 RJMP M
12、AIN .ORG 0X0013 MAIN: LDS R25,LEN LDI 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 R18 LD R17,X ANDI R17,$0F ADD ZL,R17 ADC ZH,R18 LPM R17,Z ST Y+,R17 LD R17,X+ ANDI R17,$F0 SWAP R17 LDI ZL,LOW(ASTAB*2)
13、 LDI ZH,HIGH(ASTAB*2) ADD ZL,R17 ADC ZH,R18 LPM R17,Z ST Y+,R17 DEC R25 BRNE LOOP HERE:RJMP HERE ASCTAB:.DB $30,$31, ,$39 .DB $41,$42, ,$46 4.4 代碼轉(zhuǎn)換與子程序設(shè)計(jì) 4.4.1 子程序設(shè)計(jì) 子程序:完成確定任務(wù)、反復(fù)調(diào)用 入口地址(第一條指令地址,常用標(biāo)號) 返回( RET) 狀態(tài)保護(hù) (如 SREG等 ) 參數(shù)傳遞 (R0R31,或者堆棧方式 ) 例 4.15 SRAM中 HEX單元的兩個(gè)十六進(jìn)制數(shù),分別轉(zhuǎn) 成 ASC
14、II碼存入 ASC和 ASC+1單元 .INCLUDE “ M8DEF.INC” .SET HEX=$0060 .SET ASC=$0061 LDI R17,LOW(RAMEND) OUT SPL,R17 LDI R17,HIGH(RAMEND) OUT SPH,R17 LDS R16,HEX PUSH R16 RCALL HASC POP R16 STS ASC,R16 LDS R16,HEX SWAP R16 PUSH R16 RCALL HASC POP R16 STS ASC+1,R16 HERE:RJMP HERE HASC:POP R16 PO
15、P R16 POP R16 ANDI R16,$0F LDI ZL,LOW(ASCTAB*2) LDI,ZH,HIGH(ASCTAB*2) ADD ZL,R16 LPM R16,Z PUSH R16 IN R16,SPL SBCI R16,2 OUT SPL,R16 RET ASCTAB:.DB $30,$31,,$39 .DB $41,$42,,$46 4.4.2代碼轉(zhuǎn)換子程序 BCD碼 (Binary-Coded Decimal),用二進(jìn)制編碼 的十進(jìn)制代碼。這種編碼形式 利用了四個(gè)位元來 儲存一個(gè)十進(jìn)制的數(shù)碼 ,使二進(jìn)制和十進(jìn)制之間 的轉(zhuǎn)換得以快捷地進(jìn)行。這
16、種編碼技巧,最常用 于會計(jì)系統(tǒng)的設(shè)計(jì)里,因?yàn)闀?jì)制度經(jīng)常需要對 很長的數(shù)字串作準(zhǔn)確的計(jì)算。相對于一般的浮點(diǎn) 式記數(shù)法,采用 BCD碼,既可保存數(shù)值的精確度, 又可免卻使電腦作浮點(diǎn)運(yùn)算時(shí)所耗費(fèi)的時(shí)間。此 外,對于其他需要高精確度的計(jì)算, BCD編碼亦 很常用 最常用的 BCD編碼,就是使用“ 0” 至“ 9” 這十 個(gè)數(shù)值的二進(jìn)碼來表示。常稱之為“ 8421碼”。 補(bǔ)充知識 1、 16位二進(jìn)制數(shù)轉(zhuǎn)換成 BCD碼 程序功能 : 將 (r17:r16) 中 16位二進(jìn)制轉(zhuǎn)換 成 BCD 碼 , 個(gè)、十、百、千和萬位分別存 放于 r16, r17, r18, r19和 r20中 程
17、序思想 : (r17:r16) 10000 夠減 X 次 , 則 萬位為 X; 差值 1000 夠減 Y 次 ; 則千位為 Y;差值 100 夠減 Z 次 ; 則百位為 Y;差值 10 夠減 U 次 ; 則十位為 U;最后的差值為 個(gè)位 程序清單 : b16td5: ser r20 ;r20 先送 -1 loop1: inc r20 ;r20 增 1 subi r16,low(10000) ;(r17:r16) 10000 sbci r17,high(10000) brcc loop1 ;夠減則返回 lo
18、op1 subi r16,low(-10000) ;不夠減 ,加 10000 恢復(fù)余數(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 恢復(fù)余數(shù) sbci
19、 r17,high(-1000) 程序清單 : ;(Continued) ser r18 ;r18 先送 -1 loop3: inc r18 ;r18 增 1 subi r16,low(100) ;(r17:r16) 100 sbci r17,high(100) brcc loop3 ;夠減則返回 loop3 subi r16,low(-100) ;不夠減 ,加 100 恢復(fù)余數(shù) sbci r17,high(-100) 程序清單 : ;(Continued) ser r17
20、 ;r17 先送 -1 loop4: inc r17 ;r17 增 1 subi r16,10 ;(r17:r16) 10 brcc loop4 ;夠減則返回 loop4 subi r16,-10 ;不夠減 ,加 10 恢復(fù)余數(shù) ret ;至此, r16即為個(gè)位 2、 5位 BCD碼轉(zhuǎn)換成 16位二進(jìn)制數(shù) 程序功能 : 將個(gè)、十、百、千和萬位分別放 在 r16, r17, r18, r19和 r20中的 5位 BCD 碼 ( r16 r20高 4位為 0000)轉(zhuǎn)換成 16位二進(jìn) 制 , 存放于 (
21、r17:r16) 中 轉(zhuǎn)換公式為 : (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ā)生進(jìn)位 dec r17 ;r17 減 1 d5tb16_2: brne d5tb16_1 ;非 0 轉(zhuǎn) d5tb16_1 程序清單 : ;(Continued) tst r18 ;測試
22、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 轉(zhuǎn) d5tb16_3 程序清單 : ;(Continued) tst r19 ;測試 r19 rjmp d5tb16_6 d5tb16_5: subi r16,low(-1000) ;(r17:r16)加 1000 sbci r17,high(-
23、1000) dec r19 ;r19 減 1 d5tb16_6: brne d5tb16_5 ;非 0 轉(zhuǎn) 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 轉(zhuǎn) d5
24、tb16_7 ret 3、 5位壓縮 BCD碼轉(zhuǎn)換成 16位二進(jìn)制數(shù) 壓縮 BCD碼與非壓縮 BCD碼的區(qū)別:壓縮 BCD碼 的每一位用 4位二進(jìn)制表示, 一個(gè)字節(jié)表示兩位十 進(jìn)制數(shù) 。例如 10010110B表示十進(jìn)制數(shù) 96D; 非 壓縮 BCD碼用 1個(gè)字節(jié)表示一位十進(jìn)制數(shù) ,高四 位總是 0000,低 4位的 00001001表示 09.例如 00001000B表示十進(jìn)制數(shù) 8 程序功能 :將五位壓縮 BCD碼轉(zhuǎn)換為 16位二進(jìn)制。 五位壓縮 BCD碼存于 r18:r17:r16 (r18 高四位為 0), 二進(jìn)制存放于 (r17:r16) 程序思想 : 先將壓縮
25、BCD 碼轉(zhuǎn)換為 BCD 碼 , 放 到 r16(個(gè) )、 r17(十 )、 r18(百 )、 r19(千 )、 r20(萬 ) 5個(gè)字節(jié)中 , 再調(diào)用 d5tb16子程序即可 程序清單 : yd5tb16: mov r20,r18 ;取出萬位 mov r19,r17 ;令 r19=r17 mov r18,r17 ;令 r18=r17 mov r17,r16 ;令 r17=r16 andi r16,$0f ;取出個(gè)位 andi r17,$f0 swap r17 ;取出十位 andi r18,$0f
26、 ;取出百位 andi r19,$f0 swap r19 ;取出千位 rcall d5tb16 ;調(diào)用 d5tb16五位 BCD到 16位二進(jìn)制的轉(zhuǎn)換 ret 4.5 運(yùn)算程序設(shè)計(jì) 4.5.1 加減運(yùn)算程序設(shè)計(jì) 1、無符號多字節(jié)加減運(yùn)算程序 16位加法 add16: add r16,r18 ;r17:r16+r19:r18r17:r16 adc r17,r19 ret 16 位帶立即數(shù)加法 addi16: subi r16,low(-addi2) ;無立即數(shù) (字節(jié) )加法 ;r
27、17:r16+addi2r17:r16 sbci r17,high(-addi2) ;addi2 為 16 位立即數(shù) ret 16位減法 sub16: sub r16,r18 ; r17:r16-r19:r18r17:r16 sbc r17,r19 ret 16 位帶立即數(shù)減法 subi16: subi r16,low(subi2) ; r17:r16-subi2r17:r16 sbci r17,high(subi2) ;subi2 為 16 位立即數(shù) ret 16位比較 cp16: cp r16,r18
28、 ; r17:r16 與 r19:r18 相比較 cpc r17,r19 ret 16 位帶立即數(shù)比較 cpi16: cpi r16,low(cp2) ; r17:r16 與 16 位立即數(shù) cp2 相比較 ldi r18, high(cp2) cpc r17,r18 ret 16位取補(bǔ)程序 (求補(bǔ)碼方法:取反后再加 1) beg16: com r16 ;r17:r16 取補(bǔ)并回存 (先取反 ) com r17 subi r16,low(-1) ;再加 1(通過減去 -1實(shí)現(xiàn)) sbci r17,high(-1)
29、 ret 32位加法程序 ADD32: ;32 位加法程序 ADD R16,R20 ADC R17,R21 ADC R18,R22 ADC R19,R23 ret 32位帶立即數(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,R23 ret 2、帶符號加減運(yùn)算程序 例: 16位二進(jìn)制符號數(shù)(補(bǔ)碼表示)加法 R17:R16 + R20:R19 R18:R17:R16 思路:先擴(kuò)展為 3字節(jié),再加 SADD16: TST R17 BRMI NT1 CLR R18 RJMP NEXT1 NT1:LDI R18,$FF NEXT1:TST R20 BRMI NT2 CLR R21 RJMP NEXT2 NT2: SER R21 NEXT2:ADD R16,R19 ADC R17,R20 ADC R18,R21 RET
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。