AVR單片機(jī)指令系統(tǒng).doc
第五章AVR單片機(jī)指令系統(tǒng)計(jì)算機(jī)的指令系統(tǒng)是一套控制計(jì)算機(jī)操作的代碼,稱之為機(jī)器語言。計(jì)算機(jī)只能識別和執(zhí)行機(jī)器語言的指令。為了便于人們理解、記憶和使用,通常用匯編語言指令來描述計(jì)算機(jī)的指令系統(tǒng)。匯編語言指令可通過匯編器翻譯成計(jì)算機(jī)能識別的機(jī)器語言。AVR單片機(jī)指令系統(tǒng)是RISC結(jié)構(gòu)的精簡指令集,是一種簡明易掌握效率高的指令系統(tǒng)。SL-DIY02-3開發(fā)實(shí)驗(yàn)器使用AT90S8535單片機(jī),有118條指令, 而我們所做的11個實(shí)驗(yàn)程序僅用了34條指令, 我們重點(diǎn)講這34條指令, 其余指令就可自學(xué)了。 AVR器件(指令速查表) 118條指令器件AT90S2313/2323/2343/2333 ,AT90S4414/4433/4434/8515,AT90S8534/8535算術(shù)和邏輯指令BRCC kC清零轉(zhuǎn)位指令和位測試指令A(yù)DD Rd,Rr加法BRSH k轉(zhuǎn)SBI P,b置位I/O位ADC Rd,Rr帶進(jìn)位加BRLO k小于轉(zhuǎn)(無符號)CBI P,b清零I/O位 ADIW Rdl,K加立即數(shù)BRMI k負(fù)數(shù)轉(zhuǎn)移LSL Rd左移SUB Rd,Rr減法BRPL k正數(shù)轉(zhuǎn)移LSR Rd右移SUBI Rd,Rr減立即數(shù)BRGE k轉(zhuǎn)(帶符號)ROL Rd帶進(jìn)位左循環(huán)SBC Rd,Rr帶進(jìn)位減BRLT k小于轉(zhuǎn)(帶符號)ROR Rd帶進(jìn)位右循環(huán)SBCI Rd,K帶C減立即數(shù)BRHS kH置位轉(zhuǎn)移ASR Rd算術(shù)右移 SBIW Rdl,K減立即數(shù)BRHC kH清零轉(zhuǎn)移SWAP Rd半字節(jié)交換AND Rd,Rr與BRTS kT置位轉(zhuǎn)移BSET s置位SREGANDI Rd,K與立即數(shù)BRTC kT清零轉(zhuǎn)移BCLR s清零SREGOR Rd,Rr或BRVS kV置位轉(zhuǎn)移BST Rr,bRr的b位送TORI Rd,K或立即數(shù)BRVC kV清零轉(zhuǎn)移BLD RdT送Rr的b位EOR Rd,Rr異或BRIE k中斷位置位轉(zhuǎn)移SEC置位CCOM Rd取反BRID k中斷位清零轉(zhuǎn)移CLC清零CNEG Rd取補(bǔ)數(shù)據(jù)傳送指令SEN置位NSBR Rd,K寄存器位置位MOV Rd,Rr寄存器傳送CLN清零NCBR Rd,K寄存器位清零 LDI Rd,K裝入立即數(shù)SEZ置位ZINC Rd加1 LD Rd, XX間接取數(shù)CLZ清零ZDEC Rd減1 LD Rd, X+X間接取數(shù)后SEI置位ITST Rd測試零或負(fù) LD Rd,-XX間接取數(shù)先CLI清零ICLR Rd寄存器清零 LD Rd,YY間接取數(shù)SES置位SSER Rd寄存器置FF LD Rd,Y+Y間接取數(shù)后CLS清零S條件轉(zhuǎn)移指令 LD Rd,YY間接取數(shù)先SEV置位VRJMP k相對轉(zhuǎn)移 LDD Rd,Y+qY間接取數(shù)qCLV清零V IJMP間接轉(zhuǎn)移(Z) LD Rd, ZZ間接取數(shù)SET置位T RCALL k相對調(diào)用 LD Rd, Z+Z間接取數(shù)后CLT清零T ICALL間接調(diào)用(Z) LD Rd,ZZ間接取數(shù)先SEH置位HRET子程序返回 LDD Rd, Z+qZ間接取數(shù)qCLH清零HRETI中斷返回 LDS Rd,K從SRAM裝入NOP空操作CPSE Rd,Rr比較相等跳行 ST X ,RrX間接存數(shù)SLEEP休眠指令CP Rd,Rr比較 ST X+ ,RrX間接存數(shù)后WDR看門狗復(fù)位CPC Rd,Rr帶進(jìn)位比較 ST X ,RrX間接存數(shù)先90條指令為Attiny11/12/15/22=+89條基本指令是AT90S1200CPI Rd,K與立即數(shù)比較 ST Y ,RrY間接存數(shù)SBRC Rr,b位清零跳行 ST Y+ ,RrY間接存數(shù)后SBRS Rr,b位置位跳行 ST Y ,RrY間接存數(shù)先SBIC P,bI/O位清零跳行 STD Y+q ,RrY間接存數(shù)qSBIS P,bI/O位置位跳行ST Z ,RrZ間接存數(shù)BRBS s,kSREG位置位轉(zhuǎn) ST Z+ ,RrZ間接存數(shù)后+118條指令器件=+ 90條指令器件BRBC s,kSREG位清零轉(zhuǎn) ST Z ,RrZ間接存數(shù)先-BREQ k相等轉(zhuǎn)移 STD Z+q ,RrZ間接存數(shù)+qBRNE k不相等轉(zhuǎn)移 STS k,Rr數(shù)據(jù)送SRAMBRCS kC置位轉(zhuǎn) LPM從程序區(qū)取數(shù)IN Rd,P從I/O口取數(shù) OUT P, Rdr存數(shù)I/O口PUSH Rr壓棧POP Rd,出棧說明: SL-DIY02-3開發(fā)實(shí)驗(yàn)器的11個實(shí)驗(yàn)程序例子,僅用34條指令(以紅色表示)1不帶進(jìn)位加法 ADD一不帶進(jìn)位加 說明:兩個寄存器不帶進(jìn)位C標(biāo)志加,結(jié)果送目的寄存器Rd。 操作: RdRd+ Rr 語法: 操作碼: 程序計(jì)數(shù)器: ADD Rd,Rr Od31,0r31 PCPC1例子:。(實(shí)踐操作程序4411.ASM) 實(shí)踐操作例子*.ASM,必須編譯生成*.OBJ文件才可調(diào)試,如要修改*.ASM,必須修改文件屬性,去掉*.ASM只讀文件屬性2帶進(jìn)位加法 ADC一帶進(jìn)位加 說明:兩個寄存器和C標(biāo)志的內(nèi)容相加,結(jié)果送目的寄存器Rd。 操作: RdRdRrC 語法: 操作碼: 程序計(jì)數(shù)器: ADC Rd,Rr 0d31,0r31 PCPC1 例子:(實(shí)踐操作程序4412.ASM) 3減1指令 DEC一減1 說明:寄存器Rd的內(nèi)容減1,結(jié)果送目的寄存器Rd中。 操作:RdRdl 語法: 操作碼: 程序計(jì)數(shù)器: DEC Rd 0d31 PCPC十1例子:(實(shí)踐操作程序4426.ASM)4立即數(shù)比較 CPI帶立即數(shù)比較 說明:該指令完成寄存器Rd和常數(shù)的比較操作。寄存器的內(nèi)容不改變。該指令后能 使用所有條件轉(zhuǎn)移指令。 操作:RdK 語法: 操作碼: 程序計(jì)數(shù)器: CPI Rd, K 16d31, 0 K255 PCPC 1 例子:(實(shí)踐操作程序4463.ASM)5帶立即數(shù)與 ANDI立即數(shù)邏輯與 ;全1為1,有0即0說明:寄存器Rd的內(nèi)容與常數(shù)邏輯與,結(jié)果送目的寄存器Rd。應(yīng)用: 清0,使某位為0,用0去與;保留,用1去邏輯與;代硬件與門操作:RdRdK; 語法: 操作碼: 程序計(jì)數(shù)器: ANDI Rd K 16d31, 0K255 PCPC 1例子:(實(shí)踐操作程序4472.ASM)6寄存器邏輯或OR一邏輯或;有1即1,全0為0, 應(yīng)用: 置數(shù),使某位為1,用1去或;保留,用0去邏輯或;代硬件或門 說明:完成寄存器Rd與寄存器Rr的內(nèi)容邏輯或操作,結(jié)果進(jìn)目的寄存器Rd中。 操作: RdRd Rr 語法: 操作碼: 程序計(jì)數(shù)器: OR Rd Rr 0d31, 0r31 PCPC 1例子:(實(shí)踐操作程序4481.ASM)7清除寄存器 CLR一寄存器清零 說明:寄存器清零。該指令采用寄存器Rd與自己的內(nèi)容相異或?qū)崿F(xiàn)的。寄存器的所有位都被清零。 操作: RdRd Rd 語法: 操作碼: 程序計(jì)數(shù)器: CLR Rd 0d31 PCPC 1例子:(實(shí)踐操作程序4492.ASM)8相對跳轉(zhuǎn) RJMP一相對跳轉(zhuǎn) 說明:相對跳轉(zhuǎn)到 PC 2K和 PC2K(字)范圍內(nèi)的地址。在匯編程序中,標(biāo)號用于替代相對操作。AVR微控制器的程序存儲器空間不超過4K字(8K字節(jié)),該指令能尋址整個存儲器空間的每個地址位置。 操作: PC(PC1) k 語法: 操作碼: 程序計(jì)數(shù)器: RJMP k 2Kk2K PC(PC1)k 例子:(實(shí)踐操作程序4511.ASM)9相等轉(zhuǎn)移 BREQ相等轉(zhuǎn)移 說明:條件相對轉(zhuǎn)移,測試零標(biāo)志(Z),如果 Z位被置位,則相對PC值轉(zhuǎn)移。如果在執(zhí)行CP、CPI、SUB或SUBI指令后立即執(zhí)行該指令,且當(dāng)寄存器Rd中無符號或有符號二進(jìn)制數(shù)與寄存器 Rr中無符號或有符號H進(jìn)制數(shù)相等時,轉(zhuǎn)移將發(fā)生。 操作:If RdRr(z1)then PC(PC十1)k,PCPC十1 語法: 操作碼: 程序計(jì)數(shù)器: BREQ k -64k63 PC(PC 1) k PCPC l 例子:(實(shí)踐操作程序4523.ASM)10不相等轉(zhuǎn)移 BRNE不相等轉(zhuǎn)移 說明:條件相對轉(zhuǎn)移,測試零標(biāo)志(Z),如果Z位被清零,則相對PC值轉(zhuǎn)移。如果在執(zhí)行CP。CPI、SUB或SUBI指令后立即執(zhí)行該指令,且當(dāng)在寄存器Rd中的無符號或帶符號二進(jìn)制數(shù)不等于寄存器Rr中的無符號或帶符號二進(jìn)制數(shù)時,轉(zhuǎn)移將發(fā)生。該指令相對PC轉(zhuǎn)移的方向?yàn)椋篜C 64目的PC 63。參數(shù)K為PC的偏移,用2的補(bǔ)碼表示(相當(dāng)于指令BRBCIK)。 操作, If RdRr(Z0) then PC(PC1)k,elesPCPC1 語法: 操作碼: 程序計(jì)數(shù)器: BRNE k 64 k 63 PC(PC1) k PCPCl 例子:(實(shí)踐操作程序4524.ASM) 11寄存器位清零跳行 SBRC一寄存器位被清零跳行 說明:該指令測試寄存器某位,如果該位被清零,則跳下一行執(zhí)行指令。 操作:If Rd(b) 0 then PCPC2(or 3)eles PCPC 1 語法: 操作碼: 程序計(jì)數(shù)器: SBRC Rr,b 0 r 31, 0 b7 PCPC十1 pCpC 2 PCPC 3例子:(實(shí)踐操作程序45222.ASM)12寄存器位置位跳行 SBRS一寄存器位置位跳行 說明:該指令測試寄存器某位,如果該位被置位,則跳下一行執(zhí)行指令。 操作: If Rr(b)l then PCPC 2(or 3)eles PCPC l 語法: 操作碼: 程序計(jì)數(shù)器: SBRS Rr,b r31,0b7 PCPC1 PCPC2 PCPC3例子:(實(shí)踐操作程序45223.ASM)13IO寄存器位置位跳行 SBISIO寄存器的位置位跳行 說明:該指令測試1O寄存器某位,如果該位被置位,則跳一行執(zhí)行指令。該指令在低32個1O寄存器內(nèi)操作,地址為031。 操作: If IOP, bl then PCPC2(or 3)else PCPC1 語法: 操作碼: 程序計(jì)數(shù)器: SBIS p ,b 0 P 31, 0 b 7 PCPC 1 PCPC 2 PCPC 3 例子:(實(shí)踐操作程序45225.ASM)14相對調(diào)用 RCALL相對調(diào)用于程序 說明:在PC+1后(2K字(4K字節(jié))范圍內(nèi)調(diào)用子程序。返回地址(RCALL后的指令地址)存儲到堆棧(見CALL)。 操作:PC(PC1)k 語法: 操作碼: 程序計(jì)數(shù)器: RCALL k 2K k 2K PC(PC1) k例子: (實(shí)踐操作程序DIP40LED.ASM) 15從子程序返回 RET子程序返回 說明:從子程序返回。返回地址從堆棧中彈出。 操作: PC(150)STACK PC(210)STACK 語法: 操作碼: 程序計(jì)數(shù)器: 堆棧: RET None See Operation SPSP 2 RET None See Operation SPSP 3例子:(實(shí)踐操作程序見DIP40LED.ASM)16從中斷程序返回 RETI中斷返回說明:從中斷程序中返回。返回地址從堆棧中彈出,且全局中斷標(biāo)志被置位。注意:1.主程序應(yīng)跳過中斷區(qū),防止修改補(bǔ)充中斷程序帶來麻煩;2.不用的中斷入口地址寫上RETI-中斷返回,有抗干擾作用; 操作: PC(150)STACKPC(210)STACK 語法: 操作碼: 程序計(jì)數(shù)器: 堆棧: RETI None See Operation SPSP十2 RETI None See Operation SPSP 3例子:( 程序45230.ASM,摘自”樂曲.ASM”部分程序,僅供參考),能執(zhí)行程序請閱”樂曲.ASM”程序及AVR單片機(jī)在兒童智能玩具中的應(yīng)用-音樂玩具(電腦放音機(jī))一文17寄存器拷貝數(shù)據(jù) MOV寄存器拷貝 說明:該指令將一個寄存器拷貝到另一個寄存器。源寄存器Rr的內(nèi)容不改變,而目的寄存器Rd拷貝了Rr的內(nèi)容。 操作:Rd Rr 語法: 操作碼: 程序計(jì)數(shù)器: MOV Rd Rr 0 d 31, 0 r31 PCPC 1例子:(實(shí)踐操作程序4611.ASM)18SRAM數(shù)據(jù)直接送寄存器 LDS直接從SRAM裝入 說明:把SRAM中1個字節(jié)裝入到寄存器。必須提供一個16位地址。存儲器訪問被限制在當(dāng)前64K字節(jié)的SRAM頁。超過64K字節(jié),LDS指令使用RAMPZ寄存器訪問。 操作:Rd(k) 語法: 操作碼: 程序計(jì)數(shù)器: LDS Rd k 0 d 31,0 k65535 PCPC 2例子:(實(shí)踐操作程序4612.ASM)19寄存器數(shù)據(jù)直接送SRAM STS寄存器數(shù)據(jù)直接送SRAM 說明:將寄存器的內(nèi)容直接存儲到SRAM。必須提供一個16位的地址。存儲器訪問被限制在當(dāng)前64K字節(jié)的SRAM頁。STS指令使用RAMPZ寄存器訪問存儲器可超過64K字節(jié)。 操作:(k)Rr 語法: 操作碼: 程序計(jì)數(shù)器: STS k,Rr 0r31,0k65535 PCPC2例子:(實(shí)踐操作程序4613.ASM與4612.ASM相同)20立即數(shù)送寄存器 LDI裝入立即數(shù) 說明:裝入一個8位立即數(shù)到寄存器R16R31中。 操作:RdK 語法: 操作碼: 程序計(jì)數(shù)器: LDI Rd K 16 d 31, 0K 255 PCPC 2例子:(實(shí)踐操作程序4614.ASM)21.使用變址Z間接將SRAM中的內(nèi)容傳送到寄存器 LD(LDD)使用變址Z間接將SRAM中的內(nèi)容傳送到寄存器 說明:帶或不帶偏移間接從SRAM中傳送一個字節(jié)到寄存器,SRAM中的位置由寄存器區(qū)中的 Z(16位)指針寄存器指出。存儲器訪問被限制在當(dāng)前 64K字節(jié)的 SRAM頁中。為訪問另外SRAM頁,則 IO范圍內(nèi)的寄存器RAMPZ需改變。在指令執(zhí)行后,Z指針寄存器值要么不改變,要么就加1或減1操作。使用Z指針寄存器的這些特性,特別適合于堆棧指針,因?yàn)閆指針寄存器能用于直接子程序調(diào)用,直接跳轉(zhuǎn)和查表。Z指針寄存器用作為專用堆棧指針要比X、Y指針方便。用Z指針在程序存儲器中查表,可參見LPM指令。 操作:Rd(Z) Rd(Z) Z Z1 Rd (Zq) 語法: 操作碼: 操作流程: 程序計(jì)數(shù)器: LD Rd,Z 0 d31 送數(shù),Z指針不改變 PCPC1LD Rd Z 0d31 先送數(shù),后Z指針加1 PCPC1 LD Rd,-Z 0d31 先Z指針減1, 后送數(shù) PCPCl LDD Rd Zq 0 d31, 先Z指針加q,后送數(shù), PCPC10q63執(zhí)行后Z指針(Z不含q)不變例子:(實(shí)踐操作程序4625.ASM) 22. LPM裝入程序存儲器 說明:將Z寄存器指向的一個字節(jié)傳送到寄存器0(RO)。該指令使100 空間有效,常量初始化或常數(shù)取數(shù)特別有用。程序存儲器被編為16位字,Z(16位)指針的最低位(LSB)選擇為0是低字節(jié),選擇為1是高字節(jié)。該指令能尋址程序存儲器第一個64K字節(jié)(32字)。 操作:R0(Z) 語法: 操作碼: 程序計(jì)數(shù)器: LPM None PCPC 1例子:(實(shí)踐操作程序4631.ASM,更詳細(xì)資料閱”按鈕猜數(shù).ASM”)23IO口數(shù)據(jù)傳送到寄存器 INIO口數(shù)據(jù)傳送到寄存器 說明:將IO空間(口,定時器,配置寄存器等)的數(shù)據(jù)傳送到寄存器區(qū)中的寄存器Rd中。 操作:RdP 語法: 操作碼: 程序計(jì)數(shù)器: IN Rd P O d31, 0 P63 PCPC 1例子:(實(shí)踐操作程序4641.ASM)24寄存器數(shù)據(jù)送 I O口 OUT寄存器數(shù)據(jù)送 IO口 說明:將寄存器區(qū)中寄存器 Rr的數(shù)據(jù)傳送到 I0空間(口、定時器、配置寄存器等)。 操作: P Rr 語法: 操作碼: 程序計(jì)數(shù)器: OUT P, Rr 0 r31, 0 P63 PCPC十1例子:(實(shí)踐操作程序4642.ASM)25進(jìn)棧指令 PUSH壓寄存器到堆棧 說明:該指令存儲寄存器Rr的內(nèi)容到堆棧。 操作: STACKRr 語法: 操作碼: 程序計(jì)數(shù)器: PUSH Rr O d 31 PCPC1 SPSP 1例子:(實(shí)踐操作程序4651.ASM)26出棧指令 POP堆棧彈出到寄存器 說明:該指令將堆棧中的字節(jié)裝入到寄存器Rd中。 操作:RdSTACK 語法: 操作碼: 程序計(jì)數(shù)器: POP Rd 0 d 31 PCPC1 SPSP 1例子:(實(shí)踐操作程序4652.ASM)27通過進(jìn)位左循環(huán) ROL通過進(jìn)位左循環(huán) 說明:寄存器Rd的所有位左移1位,C標(biāo)志被移到Rd的第0位,Rd的第7位移到C標(biāo)志。 操作: 語法: 操作碼: 程序計(jì)數(shù)器: ROL Rd 0 d 31 PCPC 1例子:(實(shí)踐操作程序4713.ASM)28ROR通過進(jìn)位右循環(huán) 說明:寄存器Rd的所有位右移1位,C標(biāo)志被移到Rd的第7位,Rd的第0位移到C標(biāo)志。 操作: 語法: 操作碼: 程序計(jì)數(shù)器:ROR Rd 0 d 31 PCPC 1 例子: (實(shí)踐操作程序4714.ASM)29置IO寄存器的位 SBI置IO寄存器的位 說明:對IO寄存器指定的位置位,該指令在低32個IO寄存器內(nèi)操作,IO寄存器地址為031。 操作:IO( P b)1 語法: 操作碼: 程序計(jì)數(shù)器: SBIP,b 0P31,0b7 PCPC1例子: out $1e,r0;(EEARL寄存器)(R0) sbi $1c,0;( EECR寄存器 0位)130清IO寄存器的位 CBI清IO寄存器的位 說明:清零IO寄存器中的指定位,該指令用在寄存器最低的32個IO寄存器上,IO寄存器地址為 031。 操作:IO(P,b)0 語法: 操作碼: 程序計(jì)數(shù)器: CBI P, b 0 P31, 0b7 PCPC十1 例子: cbi $18,7; IO(PORTB寄存器的7位)031置進(jìn)位位 SEC一置位進(jìn)位標(biāo)志 說明:置位SREG(狀態(tài)寄存器)中的進(jìn)位標(biāo)志(C)。 操作:C1 語法: 操作碼: 程序計(jì)數(shù)器: SEC N0ne PCPC 1 C:1例子: sec; C1 adc r0, r1;帶進(jìn)位位加32觸發(fā)全局中斷位 SEI置位全局中斷標(biāo)志 說明:置位SREG(狀態(tài)寄存器)中的全局中斷標(biāo)志(I)。 操作:I1 語法: 操作碼: 程序計(jì)數(shù)器: SEI None PCPC 1 I:1例子: cli; I0 in r13,$16;(r13)(PINB寄存器數(shù)據(jù)) set; I133禁止全局中斷位 CLI清零全局中斷標(biāo)志 說明:清除SREG(狀態(tài)寄存器)中的全局中斷標(biāo)志(I)。 操作:I0 語法: 操作碼: 程序計(jì)數(shù)器: CLI None PCPC 1 I:0例子:(實(shí)踐操作程序47312.ASM)34看門狗復(fù)位 WDR看門狗復(fù)位 說明:該指令復(fù)位看門狗定時器,在 WD預(yù)定比例器給出限定時間內(nèi)必須執(zhí)行。參見看門狗定時器硬件部分。 應(yīng)用:抗干擾;延時 操作: WD timer restart 語法: 操作碼: 程序計(jì)數(shù)器: WDR N0ne PCPC 1例子:(實(shí)踐操作程序4743.ASM)1. 請觀看多媒體指令系統(tǒng)講座2. 實(shí)際操作一次: 按對應(yīng)程序操作實(shí)踐!