480 likes | 1k Vues
8051 指令. 暫存器 -1. 累積器 : ACC, 簡稱 A 乘法 暫存器 : B 程式計數 暫存器 : PC 堆疊指標 : SP 5 資料指標暫存器 : DPTR (DPH, DPL) 1. 由一個高位元組( DPH) 以及一個低位 元組( DPL) 所組成 2. 它可以二者合一,成為 一個16位元 的暫 存器,當做存取資料的位址指標用, 3. 或者是 2個獨立的8位元存器 (DPH, DPL) ,視作 一般暫存器來用。. 暫存器 -2. 6. P0 ~ P3 :
E N D
暫存器-1 • 累積器:ACC,簡稱A • 乘法暫存器: B • 程式計數暫存器: PC • 堆疊指標:SP 5 資料指標暫存器:DPTR (DPH, DPL) 1. 由一個高位元組(DPH)以及一個低位 元組(DPL)所組成 2. 它可以二者合一,成為一個16位元的暫 存器,當做存取資料的位址指標用, 3. 或者是2個獨立的8位元存器(DPH, DPL),視作 一般暫存器來用。
暫存器-2 6. P0~P3: • 8051晶片與外界溝通的主要管道 • P0沒有輸出提升電阻 • P1、P2、P3則有提升電阻。 • BIT表示法: • P0.0~P0.7 P1.0~P1.7 P2.0~P2.7 P3.0~P3.7
暫存器-3 7.串列資料: SCON, SMOD 串列資料緩衝器:SBUF 一個為發送緩衝暫存器,另一個是接收緩衝暫存器。兩者名稱相同(SBUF) MOV SBUF, A (指發送緩衝暫存器) MOV A, SBUF (指接收緩衝暫存器) • 計時計數器:TMOD, TCON, THX, TLX • 中斷:IE, IP • 程式狀態暫存器:PSW
8051定址模式 • 立即定址(Immediate Addressing) • 將某個位址或暫存器直接存入一個值 • 立即定址的前置符號為# • 直接定址(Direct Addressing) 直接將某個位址的值傳給CPU中的某一個暫存器 • 間接定址(Indirect Addressing) • 利用暫存器R0,R1,SP及DPTR當成指標,間接取得指標內的資料 • 間接定址的前置符號為@ • 暫存器定址(Register Addressing)凡透過R0~R7 暫存器作資料的搬移或加減運算統稱為暫存器定址 • 索引定址法 • 利用DPTR或PC為基底值然後加上ACC所得位址
8051定址模式 A 常數127 1. 立即常數定址(immediate constants) MOV A, #127 (A)=127 2.直接定址(direct addressing) MOV A, 7FH (A)=(7FH)=65H Cpu內記憶體7FH 65H A
R0 Cpu內記憶體45H 45H 45H A 77H 8051定址模式 • 3.間接定址(indirect addressing) (a) MOV A, @R0; 搬移cpu內MEM (A)=((R0)) (b) MOVX A, @DPTR;搬移外部MEM (A)=((DPTR))=77H DPTR 外部記憶體1245H 1245H 1245H A 77H
8051定址模式 4.暫存器定址 (register addressing) MOV A, R7 (A)=(R7)=7AH R7=7AH A
A=23H 1257H A 66H PC=1234H ROM: (A)+(PC)=1257H (A)=66H 8051定址模式 5.索引定址 (index addressing) MOVC A, @A+PC; 搬移ROM資料 (A)=((A)+(PC))
A=23H 1257H A 66H DPTR=1234H 外部RAM: (A)+(DPTR)=1257H (A)=66H 8051定址模式 5.索引定址 (index addressing) MOVX A, @A+DPTR; 搬移外部RAM資料A)+(PC(A)=((A)+(DPTR))=77H
符號 • Rn: R0~R7 • Ri: R0, R1 • direct: 0~127 • data (常數) 123(十進位) 23H(十六進位) 10011110B(二進位)
資料轉移指令MOV ** 將資料從mem,暫存器搬移至A暫存器 (read) • MOV A, Rn :暫存器暫存器內容移至累加器 • MOV A, direct :直接位元組內容移至累加器 • MOV A, @Ri : 間接位元組內容移至累加器 • MOV A, #data : 常數值移至暫存器 ** 將A暫存器資料搬移至mem,暫存器(write) • MOV Rn, A : (Rn) (A) • MOV direct, A : (direct) (A) • MOV @Ri, A : ((Ri)) ( A)
資料轉移指令-example 1 • MOV A, # 33H (A)=33H • MOV A, #01011100B (A)=5CH • MOV A, #77 (A)=77 • MOV A, #1 (A)=1 MOV R1, A ( R1)=(A) ( R1)=(A)=1
資料轉移指令-example 2 • MOV A, 33H given (33H)=65H (A)=65H • MOV @R1, A given (R1)=30H, (A)=10H (30H)=10H • MOV A, R1 given (R1)=22H (A)=22H • MOV A, direct :直接位元組內容移至累加器 • MOV A, @Ri : 間接位元組內容移至累加器 • MOV A, Rn : 暫存器內容移至累加器
資料轉移指令MOVX, PUSH , POP XCH • **CPU外部RAM的資料移入累加器(8位元位址) • MOVX A, @Ri :CPU外部RAM的資料移入累加 器(8位元位址) • MOVX A, @DPTR : CPU外部RAM的資料移入累 加器(16位元位址) • **CPU將資料移入/取出 堆疊區SP • PUSH direct :直接位元組的內容放置SP • POP direct : 從SP拿回資料至直接位元組 • **CPU將A資料與暫存器暫存器內容互換 • XCH A, direct : 累加器與直接位元組的內容換 • XCH A, Rn : 累加器與暫存器的內容交換
資料轉移指令-3 [1] Given (R1)=33H, (33H)=77H, (DPTR)=1111H (1111H)=66H MOVX A, @R1 (A)=(外部RAM(R1))=((外部RAM (33H))=77H MOVX A, @DPTR (A)=((DPTR))=(1111H)=66H
資料轉移指令-4 stack stack • PUSH A • PUSH 30H • PUSH R1 • … • POP R1 • POP 30H • POP A 30H SP SP A A SP 30H A A SP R1 30H A FILO:FIRST IN LAST OUT
資料轉移指令-5 • Given (A)=34H, (R1)=56H, (30H)=78H XCH A, 30H (A)=78H, (30H)=34H XCH A, R1 (A)=56H, (R1)=34H
算數運算指令 加: ADD, ADDC, INC 減: SUBB, DEC 乘:MUL 除:DIV
算數運算指令add, addc • Add A ,Rn : 加暫存器至累加器 • Add A,direct : 加直接位元組至累加器 • Add A,@Ri : 加間接位元組至累加器 • Add A,#data : 加常數值至累加器 • Addc A,Rn : (A) (A)+(Rn)+(CY) • Addc A,direct : (A)(A)+(direct)+(CY ) • Addc A,@Ri : (A)(A)+((Ri))+(CY ) • Addc A,#data : (A) (A)+data+(CY)
算數運算指令-2 • Given (A)=20H, (R1)=30H, (30H)=66H, (CY)=1 ADD A,#03H (A)= (A)+3H= 20H+3H=23H ADDC A, R1 (A)= (A)+ (R1)+ (CY)= 20H+30H+1=51H
算數運算指令subb, INC • Subb A, Rn :累加器-暫存器Rn-CY • Subb A, direct : 累加器-direct-CY • Subb A, @Ri : 累加器-(Ri)-CY • Subb A, #data : 累加器-data-CY • INC (DEC)A : 累加器+(-)1 • INC (DEC) Rn : 暫存器+(-)1 • INC (DEC) direct : 直接位元組+(-)1 • INC (DEC) @Ri : 間接位元組+(-)1
Given (A)=10 INC A ; (A)=(A)+1=11 • Given (A)=20 DEC A ; (A)=(A)-1=19 • Given (R1)=20 DEC R1 ; ( R1)=(R1)-1=20-1=19 • Given (A)=30, (R2)=10, CY=0 SUBB A, R2 ;(A)=(A)-(R2)-(CY)=30-10-0=20
算數運算指令MUL, DIV • Mul A ,B : A, BA*B • Div A, B : A, BA/B • 商數存於A; 餘數存於B • Given (A)=15, (B)=20 MUL A, B (A)x(B)=15x20=300(A)=1, (B)=44 • Given (A)=17, (B)=4 DIV A, B ; 17/4=4…1 (A)=4, (B)=1
邏輯運算指令 • ANL, ORL, XOR • RL, RLC, RR, RRC • CLR
邏輯運算指令ANL,ORL • 對每一位元做AND/OR運算 • ANL A ,Rn : 暫存器AND至累加器(每一位元) • ANL A,direct : 直接位元組AND至累加器 • ANL A,@Ri : 間接位元組AND至累加器 • ANL A,#data : 常數值AND至累加器 • ORL A ,Rn : 暫存器AND至累加器 • ORL A,direct : 直接位元組OR至累加器 • ORL A,@Ri : 間接位元組OR至累加器 • ORL A,#data : 常數值OR至累加器
Given (A)=10110010, (R1)=11110000, (30H)=22H [1] ANL A, R1 ; (A)=(A) and (R1) (A): 10110010 (R1): 11110000 -------------------- 10110000 [2] ORL A, #11100000B ; (A): 10110010 D0H: 11100000 -------------------------- 11110010=F0H
AND A, 30H 10110010 00100010 -------------------- 00100010=22H • ORL A, @R1 A or ((R1))=A or (30H) =A or 22H=B2H 10110010 00100010 ---------------- 10110010=B2H
邏輯運算指令XRL,CLR • *兩資料相同為0,不相同為1 • XRL A , Rn : 暫存器XOR至累加器 • XRL A, direct : 直接位元組XOR至累加器 • XRL A, @Ri : 間接位元組XOR至累加器 • XRL A, #data : 常數值XOR至累加器 • *清除累加器為0 • CLR A : 清除累加器; A=0
邏輯運算指令RL,RLC,RR,RRC **左旋轉 • RL A : 累加器向左旋轉 • RLC A : 累加器與CY一起向左旋轉 **右旋轉 • RR A : 累加器向右旋轉 • RRC A : 累加器與CY一起向右旋轉
Given (A)=10H, (R1)=33H XRL A, #FFH ; (A)=EFH • XRL A, R1 ; 00010000 00110011 ------------------- 00100011=23H
RL A ;(A)=(A)*2 • A7A6 A5 A4 A3 A2 A1 A00 = A6 A5 A4 A3 A2 A1 A00 • (A)=23H=00100011 RL A=001000110=01000110=46H
RR A; (A)=(A)/2 • 0 A7A6 A5 A4 A3 A2 A1A0 =0 A7A6 A5 A4 A3 A2 A1 • (A)=23H=00100011 RR A=000100011=00010001=11H
RLC A; (A)=2*(A)+(CY) • CY A7A6 A5 A4 A3 A2 A1 A0CY = A6 A5 A4 A3 A2 A1 A0CY * (CY)=A7 • Given ( CY)=1, (A)=23H=00100011 RLC A (CY)00100011(CY)=01000111=47H, (CY)=0
RRC A • (CY) A7A6 A5 A4 A3 A2 A1A0 (CY) (A) =CY A7A6 A5 A4 A3 A2 A1 • (CY) = A0 • (CY) =1, (A)=23H=00100011 RRC A (CY) 00100011 (CY) (A)=10010001=91H (CY) =1
程式跳躍指令--副程式呼叫ACALL, LCALL, RET *** CALL ** • ACALL address : 絕對副程式呼叫(0~+-127) • LCALL address :絕對副程式呼叫(0~65535) • RET : 從副程式返回 (RETI 中斷反返回)
CALL---RET . . . CALL DRLAY MOV A,#56H . . . . . . DRLAY: MOV R0,#56H . . . . RET .
跳躍指令 • 無條件跳躍 • AJMP, JMP • 有條件跳躍 • JZ, JNZ • CJNE • JB • JNB
無條件跳躍 • AJMP address : 絕對位址跳躍(0~+-127) • JMP @A+DPTR : 跳到一間接位址
有條件跳躍1 • JZ rel : 若零值旗標(PSW.Z)=0 就跳躍 • JNZ rel : 若零值旗標(PSW.Z)!=0就跳躍
有條件跳躍2 • CJNE A, direct, rel :若累加器與直接位元組內容不相同就跳躍至rel • CJNE A, #data, rel:若累加器與data內容不相同就跳躍至rel • CJNE Rn, #data, rel:若Rn與data內容不相同就跳躍至rel • CJNE @Ri, #data, rel: ((Ri))與data內容不相同就跳躍至rel • NOP : 沒動作(短暫時間延遲 1 MT=12TOSC)
程式跳躍指令3 • CJNE A, direct, rel CJNE A, 30H, LOOP1 • CJNE A, #data, rel CJNE A, #30H, LOOP1 • CJNE Rn, #data, rel CJNE R2, 30H, LOOP1 • CJNE @Ri, #data, rel CJNE @R1, #30H, LOOP1
有條件跳躍4 • JC rel • JC LOOP1 • JNC rel • JNC LOOP1 • JB bit, rel • JB PSW.5, LOOP1 • JNB bit, rel • JNB 25H.5, LOOP1 • JBC bit, rel • JBC PSW.5, LOOP1
布林運算指令 • CLR C CY=0 • CLR bit • CLR P0.1 P0.1=0 • CLR PSW.Z PSW.Z=0 • SETB C CY=1 • SETB bit • SETB P1.2 P1.2=1 • SET TMOD.3 TMOD.3=1
布林運算指令 • ANL C, bit • ANL C, P3.1 (CY)=)CY)and P3.1 • ANL C, /bit • ANL C, /20H.4 • ORL C, bit • ORL C, 23H.4 • ORL C, /bit • ORL C, /PSW.7
布林運算指令 • MOV C, bit • MOV C, PSW.0 • MOV bit ,C • MOV 22H.3, C