Xem mẫu

  1. ĐHBK Tp HCM Khoa ĐĐT–BMĐT GVPT: Hồ Trung Mỹ Cac TD minh hoa tâp lênh 8051 (phân đoc thêm cua VXL-chương 3) ́ ̣ ̣ ̣ ̀ ̣ ̉ Chú y: Cac TD sau sẽ trinh bay theo thư tư giơi thiêu cac nhom lênh trong sach VXL, như arith01.asm để chỉ ́ ́ ̀ ̀ ̣ ́ ́ ̣ ́ TD 1 vơi nhom lênh số hoc, và 1 nhom lênh có thể có nhiêu TD minh hoa. ́ ̣ ̣ ́ ̣ ̀ ̣ TD : Minh hoa cac phep toan số hoc trên số nhị phân: ADD, ADDC, SUBB, INC, DEC, MUL, và DIV ̣ ́ ́ ́ ̣ ; TD: arith01.asm ; Đinh nghia cac hăng số dung trong chương trinh ̣ ̃ ́ ̀ ̀ ̀ NUM1 EQU 25 ; = 19H NUM2 EQU -17 ; = EFH NUM2M EQU 20h ; Đia chỉ ơ IRAM (RAM nôi) có trị số băng NUM2 ̣ ̣ ̀ BIN16_1 EQU 2578 ; = 0A12H BIN16_2 EQU 1289 ; = 0509H SUM16M EQU 22H ; Đia chỉ ơ IRAM chưa tông 2 số nhị phân 16 bit ̣ ̉ DIFF16M EQU 24H ; Đia chỉ ơ IRAM chưa hiêu 2 số nhị phân 16 bit ̣ ̣ ; = BIN16_2 - BIN16_1 = -1289 = FAF7H TEST EQU 1289-2578 ; = FAF7H org 0 ; Thư lênh ADD vơi toan hang 8 bit ( toan hang thư 2 la hăng sô) ̣ ́ ́ ̣ ̀ ́ MOV A,#NUM1 ADD A,#NUM2 ; A
  2. ; Thu lenh SUBB voi 2 toan hang hang so 16 bit ; hieu 2 so nhi phan 16 bit = BIN16_2 - BIN16_1 = -1289 = FAF7H ; cat vao bien DIFF16M (24H)theo big endian MOV A,#LOW BIN16_2 ; Lay byte thap cua hang so 16 bit CLR C SUBB A,#LOW BIN16_1 MOV DIFF16M+1,A MOV A,#HIGH BIN16_2 ; Lay byte cao cua hang so 16 bit SUBB A,#HIGH BIN16_1 ; Phai tinh den Carry cua phep cong truoc MOV DIFF16M,A ; (DIFF16M) = 1289 - 2578 = -1289 = FAF7H ;(nghia la (24H)=FAH va (25H)=F7H ; Hiêu ưng cua lênh INC ̣ ̉ ̣ INC A ; A
  3. ; Thu lenh ADD voi toan hang BCD 2 digit ( toan hang thu 2 la thanh ghi B) MOV A,#BCD1_1 MOV B,#BCD1_2 ADD A,B ; A
  4. ; Thu lenh ORL voi toan hang 2 la hang so MOV A,#NUM1 ORL A,#NUM2 ; A = 15H OR 3AH = 3FH ; Ap dung ORL de dat 1 bit len 1 neu OR no voi 1 va giu tri cu neu OR voi 0 MOV A,#NUM1 ; A = 15H ORL A,#0F0H ; A = F5H ; Thu lenh XRL voi toan hang 2 la hang so MOV A,#NUM1 XRL A,#NUM2 ; A = 15H XOR 3AH = 2FH ; Ap dung XRL de lay NOT bit neu XOR no voi 1 va giu tri cu neu XOR voi 0 MOV A,#NUM1 ; A = 15H XRL A,#0F0H ; A = E5H MOV A,#NUM2 ; A = 3AH XRL A,#0FFH ; A = bu 1 cua 3AH = C5H INC A ; A = bu 2 cua 3AH = C6H ; Xoa noi dung thanh ghi A CLR A ; A
  5. ; Ap dung dich phai voi C de chia nguyen co dau A cho 2 MOV A,#NUM2 ; A = -12 = F4H = 1111_0100B MOV C,ACC.7 ; C = bit dau cua A RRC A ; A = 1111_1010B = FAH = -6 va C=0 ; Thư lênh SWAP ̣ MOV A,#47H SWAP A ; A = 74H sjmp $ DIV2EXPN: ; Chương trinh con chia nguyên không dâu cho 2^n ̀ ́ RR A CLR ACC.7 DJNZ R7, DIV2EXPn RET END TD : Minh hoa cac lênh chuyên dư liêu: MOV, PUSH, POP, XCH, XCHD ̣ ́ ̣ ̉ ̣ ; TD: mov01.asm CONST1 EQU 15H CONST2 EQU 27H CONST3 EQU 36H ; Điên 16 byte trong vung dư liêu nôi tư đia chỉ 30H voi tri so la CONST1 ̀ ̀ ̣ ̣ ̣ MOV A,#CONST1 MOV R0,#30H MOV R1,#16 L1: MOV @R0, A INC R0 DJNZ R1, L1 ; Dien 32 byte trong vung dư liêu ngoai tư đia chỉ 20H voi tri so la CONST2 ̀ ̣ ̣ ̣ MOV A,#CONST2 MOV DPTR,#20H MOV R1,#32 L2: MOVX @DPTR, A INC DPTR DJNZ R1, L2 ; Dien 16 byte trong vung du lieu ngoai tu 40H voi tri so la CONST1 MOV A,#CONST3 MOV R0,#40H MOV R1,#16 MOV P2,#0 ; Xuat byte cao dia chi L3: MOVX @R0, A INC R0 DJNZ R1, L3 ́ ̉ ̣ ; Hoan đôi ()nôi dung 2 ô nhơ trong RAM nôi ̣ ; R1 R7 ơ bank 0 MOV R1,#CONST1 ; R1 = 15H MOV R7,#CONST2 ; R7 = 27H PUSH 07 PUSH 01 POP 07 ; R7 = 15h POP 01 ; R1 = 27H ; Môt cach khac để hoan đôi R1 va R7 ̣ ́ ́ ́ ̉ XCH A,01H XCH A,07H XCH A,01H ; Hoan doi digit thap cua 2 so hex 2 ky so o A va 1 byte trong RAM noi voi con tro la R0 ; hay R1 MOV A,#24h MOV 20h,#53h MOV R0,#20h XCHD A,@R0 ; A = 23h va (20h) = 54h ́ ̣ ̣ ̣ Cac TD minh hoa tâp lênh 8051 – trang 5
  6. sjmp $ END TD : Minh hoa cac lênh chuyên dư liêu: MOVC ̣ ́ ̣ ̉ ̣ ; TD: mov02.asm ; Đoc liên tuc dư liêu X tư P0 và xuât ra P1 giá tri X2 ̣ ̣ ̣ ́ ; Xuât dang BCD 4 digit ơ P2 (2 digit cao) va P3 (2 digit thap) ́ ̣ MOV P0,#0FFH ; Đăt câu hinh cho P0 là INPUT ̣ ́ ̀ MOV DPTR,#X2_BCD L1: MOV A,P0 ANL A,#0FH ; Bao đam chỉ tinh tôi đa là 15^2 = 225 ̉ ̉ ́ ́ PUSH ACC ; Lưu trư cho lân goi sau ̀ ̣ CALL SQUARE ; Assembler tư đôi sang ACALL hay LCALL ̉ MOV P1,A POP ACC CALL SQ_BCD SJMP L1 ; Chương trinh con tinh X^2 băng cach tra bang vơi thanh ghi nên là PC ̀ ́ ̀ ́ ̉ ̀ SQUARE: INC A ; Điêu chinh để lây số liêu đung!! ̀ ̉ ́ ̣ ́ MOVC A,@A+PC RET TABLE_X2: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225 ; X^2 ; Chương trinh con tra kêt quả X^2 vơi biêu diên BCD 4 digit ̀ ́ ̉ ̃ ̉ ̀ ̀ ; Tra bang băng thanh ghi nên DPTR SQ_BCD: CLR C RL A ; A 92 DW 0100H, 0121H, 0144H, 0169H, 0196H, 0225H; 102 -> 152 END TD : Minh hoa cac lênh vơi biên Boole (toan hang 1 bit) ̣ ́ ̣ ́ ́ ̣ ;TD: boole01.asm ; Thuc hien cac phep toan boole co ban NOT, AND, OR, XOR, NAND, va NOR F1 EQU PSW.1 ; Dung thêm bit nay lam biên tam (đã có F0) ̀ ̀ ̀ ́ ̣ X EQU P1.0 Y EQU P1.1 NOTX EQU P1.2 ; NOTX = NOT(X) XANDYEQU P1.3 ; = X AND Y XORY EQU P1.4 ; = X OR Y XXORY EQU P1.5 ; = X XOR Y XNANDY EQU P1.6 ; = X NAND Y XNORY EQU P1.7 ; = X NOR Y MOV P1,#03H ; Dat cau hinh P1.0 va P1.1 lam INPUT LOOP: MOV C,X MOV F0,C MOV C,Y MOV F1,C MOV C,F0 CPL C MOV NOTX,C ; NOT X MOV C,F0 ANL C,F1 ́ ̣ ̣ ̣ Cac TD minh hoa tâp lênh 8051 – trang 6
  7. MOV XANDY,C ; X AND Y CPL C MOV XNANDY,C; X NAND Y MOV C,F0 ORL C,F1 MOV XORY,C ; X OR Y CPL C MOV XNORY,C ; X NOR Y MOV C,Y JNB X,SKIP ; Neu X=0 thi X XOR Y = Y CPL C ; Neu X=1 thi X XOR Y = NOT Y SKIP: SJMP LOOP ; Phai có lăp lai, nêu không sẽ không thể hiên đươc công logic!! ̉ ̣ ̣ ́ ̣ ̉ END TD : Minh hoa cac phep toan logic vơi biên Boole (toan hang 1 bit) ̣ ́ ́ ́ ́ ́ ̣ ;TD: boole02.asm ; Đinh trị ham Boole: F = (XY'+ WZ)(XZ'W' + X'Z)= tich cua 2 tông Boole ̣ ̀ ́ ̉ ̉ ; Giả sư cac biên X, Y, Z, W đươc đoc vao tư P1.0 .. P1.3 và biên ra F để ơ P1.7 ́ ́ ̣ ̀ ́ X EQU P1.0 Y EQU P1.1 Z EQU P1.2 W EQU P1.3 F EQU P1.7 MOV P1,#0FH ; Dat cau hinh P1.0 .. P1.4 la INPUT LOOP: MOV C,X ANL C,/Y ; C = XY' JC EXP2 ; Neu C = 1 thi 0 can tinh tiep voi phep toan OR, ma tiep tuc ; xet tong thu 2 MOV F0,C ; F0 = XY' MOV C,W ANL C,Z ORL C,F0 ; C = XY' + WZ JNC DONE_0 ; Neu Tong thu 1 = 0 thi F = 0 EXP2: MOV C,X ANL C,/Z ANL C,/W ; C = XZ'W' JC DONE_1 MOV F0,C MOV C,Z ANL C,/X ; C = ZX' = X'Z ORL C,F0 ; C = XZ'W' + X'Z MOV F,C ; F = (XY'+ WZ)(XZ'W' + X'Z) SJMP LOOP DONE_0: CLR F ; F = 0 SJMP LOOP DONE_1: SETB F ; F = 1 SJMP LOOP END TD : Minh hoa cac lênh nhay theo trị biên Boole: JB, JNB ̣ ́ ̣ ̉ ́ ;TD: boole03.asm ; Mô phong mach đêm lên (đêm 10): ngõ ra nhị phân ơ 4 bit thâp P2, giả sư đươc nôi vơi mach hiên thị số ̉ ̣ ́ ́ ́ ́ ̣ ̉ ; BCD và xung nhip CK (kich canh xuông) đươc nôi vơi chân P3.7 ̣ ́ ̣ ́ ́ CK EQU P3.7 MOV P3,#80H ; Dat cau hinh P3.7 INPUT MOV R0,#0 ; So dem ban dau la 0 MOV P2,#0 ; Dau tien so dem la 0 LOOP: JNB CK,$ ; đơi CK có mưc 1 JB CK,$ ; đơi CK có mưc 0 ==> phat hiên đươc canh xuông ́ ̣ ̣ ́ INC R0 CJNE R0,#10,NEXT MOV R0,#0 NEXT: MOV P2,R0 SJMP LOOP END ́ ̣ ̣ ̣ Cac TD minh hoa tâp lênh 8051 – trang 7
  8. ; SV có thể dung Proteus để thây rõ hơn hoat đông counter nay ̀ ́ ̣ ̣ ̀ TD : Minh hoa cac lênh rẽ nhanh chương không điêu kiên: JMP ̣ ́ ̣ ́ ̀ ̣ ; TD: branch01.asm ; Chuong trinh doc lien tuc gia tri tu P0 (gia su < 4) ; Nêu P0=0 thì xư lý theo CASE_0, = 1 theo CASE_1, . . . ́ MOV P0,#0FFH ; Dat cau hinh P0 la INPUT MOV P1,#0FFH ; Dat cau hinh P1 la INPUT MOV P2,#0FFH ; Dat cau hinh P2 la INPUT MOV DPTR,#JMP_TABLE L1: MOV A,P0 ANL A,#03H ; Bao dam cho gia tri chon < 4 ! , sau lenh nay C =0 RL A ; A = 2 x A JMP @A+DPTR JMP L1 ; Assembler tu dong chuyen sang SJMP, AJMP hay LJMP JMP_TABLE: AJMP CASE_0 ; lenh nay 2 byte AJMP CASE_1 AJMP CASE_2 ; Day la doan phuc vu cho CASE_3 ; chia P1 cho P2 va xuat thuong so o 4 bit cao cua P3 va du so o 4 bit thap cua P3 ; gia su thuong so va du so
  9. MOVX A,@DPTR MOV R0, A ; So phan tu cua bang dat trong R0 MOV B,#0 L1: INC DPTR MOVX A,@DPTR JNZ SKIP INC B SKIP: DJNZ R0,L1 ; Đêm tông số cac phân tư có trị >=3, kêt quả cât vao R1, vơi TD nay cho R1 = 3 ́ ̉ ́ ̀ ́ ́ ̀ ̀ MOV DPTR,#0 MOVX A,@DPTR MOV R0, A ; So phan tu cua bang dat trong R0 MOV R1,#0 L2: INC DPTR MOVX A,@DPTR CJNE A,#5,CHECK CHECK: JC CONT ; C = 0 co nghia la A >= 5 INC R1 CONT: DJNZ R0, L2 SJMP $ END TD : Mô phong mach so sanh 2 số nhị phân 4 bit X và Y (X = P1.7..P1.4, Y = P1.3..P1.0), ̉ ̣ ́ mach co 3 ngõ ra P2.0 = 1 nêu X < Y, P2.1 = 1 nêu X = Y, và P2.2 = 1 nêu X > Y ̣ ́ ́ ́ ; TD: branch03.asm MOV P1,#0FFh ; Dat cau hinh cho P1 lam INPUT LOOP: MOV A,P1 ; A = X:Y (A do 2 số 4 bit X va Y hơp lai) ̣ MOV B,A ; Cat tam ACC ANL A,#0FH ; A = 0:Y XCH A,B ; A = X:Y va B = 0:Y = Y SWAP A ; A = Y:X ANL A,#0FH ; A = 0:X = X CJNE A, B, XNEY ; so sanh X voi Y muc dich se dat cac co XEQY: ; truong hop X = Y CLR P2.0 SETB P2.1 CLR P2.2 SJMP LOOP XNEY: JC XGTY ; Neu X > Y nhay den XGTY XLTY: ; truong hop X < Y SETB P2.0 CLR P2.1 CLR P2.2 SJMP LOOP XGTY: ; truong hop X > Y CLR P2.0 CLR P2.1 SETB P2.2 SJMP LOOP END ́ ̣ ̣ ̣ Cac TD minh hoa tâp lênh 8051 – trang 9