ĐHBK Tp HCM Khoa ĐĐT–BMĐT GVPT: Hồ Trung Mỹ Các TD minh họa tập lệnh 8051 (phần đọc thêm của VXL-chương 3) Chú ý: Các TD sau sẽ trình bày theo thứ tự giới thiệu các nhóm lệnh trong sách VXL, như arith01.asm để chỉ TD 1 với nhóm lệnh số học, và 1 nhóm lệnh có thể có nhiều TD minh họa. TD : Minh họa các phép toán số học trên số nhị phân: ADD, ADDC, SUBB, INC, DEC, MUL, và DIV ; TD: arith01.asm ; Định nghĩa các hằng số dùng trong chương trình NUM1 EQU 25 ; = 19H NUM2 EQU -17 ; = EFH NUM2M EQU 20h ; Địa chỉ ở IRAM (RAM nội) có trị số bằng NUM2 BIN16_1 EQU 2578 ; = 0A12H BIN16_2 EQU 1289 ; = 0509H SUM16M EQU 22H ; Địa chỉ ở IRAM chứa tổng 2 số nhị phân 16 bit DIFF16M EQU 24H ; Địa 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 toán hang 8 bit ( toán hạng thứ 2 la hằng số) MOV A,#NUM1 ADD A,#NUM2 ; A <- A + NUM2 = 25 + (-17) = 8 = 0000 1000 ; Ảnh hưởng đến các cờ: ; lúc này PSW = C1h = 1100 0001 (tương ứng các bit C,AC,F0,RS1,RS0,OV,-,P) ; Khi cộng nhị phân cho C = 1, AC =1 (có nhớ ở bit 4), RS1=RS0=0 sau khi RESET ; OV = C XOR C MSB = 1 XOR 1 = 0, P = 1 do so bit 1 trong ACC là lẽ ; Chú ý: Chương trình mô phỏng TS Controls Emulator 8051 tính sai OV!!! ; Thu lenh ADD voi toan hang 8 bit ( toan hang thu 2 la thanh ghi B) MOV A,#NUM1 MOV B,#NUM2 ADD A,B ; A <- A + B = 25 + (-17) = 8 ; Thu lenh ADD voi toan hang 8 bit ( toan hang thu 2 la thanh ghi da dung Rn) MOV A,#NUM1 MOV R0,#NUM2 ADD A,R0 ; A <- A + R0 = 25 + (-17) = 8 ; Thử lệnh ADD với toán hang thứ 2 là 1 byte trong bộ nhớ nội MOV NUM2M,#NUM2 MOV A,#NUM1 ADD A,NUM2M ; A <- A + (NUM2M) = 25 + (-17) = 8 ; Thử lệnh ADD với toán hang thứ 2 là 1 byte trong bộ nhớ nội có pointer là R0 MOV R0,#NUM2M MOV A,#NUM1 ADD A,@R0 ; A <- A + Mem(R0) = 25 + (-17) = 8 ; Thử lệnh ADD với toán hang thứ 2 là 1 byte trong bộ nhớ CODE (bộ nhớ chương trình) MOV DPTR,#NUM2C ; Lay dia chi cua bien NUM2C CLR A MOVC A,@A+DPTR ADD A,#NUM1 ; A <- NUM2 + NUM1 = -17 + 25 = 8 ; Thử lệnh ADD va ADDC -> cộng 2 hằng số 16 bit ; Kết quả cất vào ô nhớ dữ liệu nội SUM16M theo big endian MOV A,#LOW BIN16_1 ; Lấy byte thấp của hằng số 16 bit ADD A,#LOW BIN16_2 MOV SUM16M+1,A MOV A,#HIGH BIN16_1 ; Lấy byte cao của hằng số 16 bit ADDC A,#HIGH BIN16_2 ; Phai tinh den Carry cua phep cong truoc MOV SUM16M,A ; (SUM16M) = 3987 = 0F1BH ( nghia la (22H)=0FH va (23H)=1BH ; Thu lenh SUBB voi 2 toan hang hang so 8 bit MOV A,#NUM1 MOV B,#NUM2 CLR C SUBB A,B ; A <- A - B = 25 - (-17) = 42 = 2AH Các TD minh họa tập lệnh 8051 – trang 1 ; 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 của lệnh INC INC A ; A <- A + 1 INC B ; B <- B + 1 MOV R0,#30H INC @R0 ; Tăng byte với contrỏ R0 lên 1 (30H) = (30H) + 1 INC R0 INC @R0 ; (31H) = (31H) + 1 INC 0 ; 1 cach khac de co R0 <- R0 + 1 INC @R0 ; (32H) = (32H) + 1 INC DPTR ; Hieu ung cua lenh DEC DEC A ; A <- A - 1 DEC B ; B <- B - 1 MOV R0,#30H DEC @R0 ; Giam o nho duoc chi boi R0 di 1 (30H) = (30H) - 1 INC R0 DEC @R0 ; (31H) = (31H) - 1 DEC 0; 1 cach khac de co R0 <- R0 - 1 DEC @R0 ; (30H) = (30H) - 1 ; Khong co lenh DEC DPTR !!! ; Do do ta phai dung doan chuong trinh sau de giam noi dung DPTR di 1 DEC DPL ; Giam byte thap cua DPTR di 1 MOV R7, DPL ; chép vào R7 CJNE R7, #0FFH, SKIP ; Neu tran duoi thành FF thì phai muon DEC DPH ; do dó cung phai giam byte cao di 1 SKIP: ; Thu lenh nhan MUL voi 2 toan hang 8 bit: A x B MOV A,#25 MOV B,#56 MUL AB ; B:A = 25 x 56 = 1400 = 478H ( B = 04H va A = 78H) ; Thu lenh chia DIV voi 2 toan hang 8 bit: A/B MOV A,#255 MOV B,#7 DIV AB; A/B = 255/7 = 36 du so la 3 ==> A = 36 = 24H va B=03H SJMP $ ; Nhảy tại chỗ NUM2C: DB NUM2 ; Hằng số trong bộ nhớ CODE END TD : ; Minh họa các phép toán số học trên số BCD nén: ADD, ADDC ; TD: arith02.asm BCD1_1 EQU 25H BCD1_2 EQU 17H BCD1_2M EQU 20h ; Dia chi o IRAM co tri so bang BCD1_2 BCD4_1 EQU 3456H BCD4_2 EQU 6789H SUM4M EQU 40H ; Dia chi o IRAM chua tong 2 so BCD 4 digit org 0 ; Thu lenh ADD voi toan hang BCD 2 digit ( toan hang thu 2 la hang so) MOV A,#BCD1_1 ADD A,#BCD1_2 ; A <- A + BCD1_2 = 25H + 17H = 3CH DA A ; A = 42H Các TD minh họa tập lệnh 8051 – trang 2 ; 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 <- A + B = 25H + 17H = 3CH DA A ; A = 42H ; Thu lenh ADD voi toan hang BCD 2 digit ( toan hang thu 2 la thanh ghi da dung Rn) MOV A,#BCD1_1 MOV R0,#BCD1_2 ADD A,R0 ; A <- A + R0 = 25H + 17H = 3CH DA A ; A = 42H ; Thu lenh ADD voi toan hang thu 2 la so BCD 2 digit trong bo nho noi MOV BCD1_2M,#BCD1_2 MOV A,#BCD1_1 ADD A,BCD1_2M ; A <- A + (BCD1_2M) = 25H + 17H = 3CH DA A ; A = 42H ; Thu lenh ADD voi toan hang thu 2 la 1 byte trong bo nho noi co pointer la R0 MOV R0,#BCD1_2 MOV A,#BCD1_1 ADD A,@R0 ; A <- A + Mem(R0) = 25H + 17H = 3CH DA A ; A = 42H ; Thu lenh ADD voi toan hang thu 2 la byte trong bo nho CODE MOV DPTR,#BCD1_2C ; Lay dia chi cua bien BCD1_2C CLR A MOVC A,@A+DPTR ADD A,#BCD1_1 ; A <- BCD1_2 + BCD1_1 = 25H + 17H = 3CH DA A ; A = 42H ; Thu lenh ADD va ADDC -> cộng 2 số BCD 4 ký số ; Ket qua cat vao o nho dulieu noi SUM16M MOV A,#LOW BCD4_1 ; Lay byte thap cua hang so 16 bit ADD A,#LOW BCD4_2 DA A MOV SUM4M+1,A MOV A,#HIGH BCD4_1 ; Lay byte cao cua hang so 16 bit ADDC A,#HIGH BCD4_2 ; Phai tinh den Carry cua phep cong truoc DA A MOV SUM4M,A ; Ket qua la 10245H voi C=1, (40H)=02H, va (41H) = 45H ; Chu y la DA A chi co tac dung sau lenh cong (ADD hay ADDC) ma thoi ; TD sau cho thay DA A voi lenh SUBB cho ket qua sai! MOV A,#25H MOV B,#17H CLR C SUBB A,B ; A <- A - B = 25H - 17H = 0EH DA A ; A = 14H ==> Cho ket qua sai voi phep toan tru!!! SJMP $ BCD1_2C: DB BCD1_2 END TD : Minh họa các lệnh ANL, ORL, XRL (AND, OR, XOR với các toán hạng 8 bit) ; TD: logic01.asm NUM1 EQU 15H ; 00010101B NUM2 EQU 3AH ; 00111010B ; Thu lenh ANL voi toan hang 2 la hang so MOV A,#NUM1 ANL A,#NUM2 ; A = 15H AND 3AH = 10H ; Thu lenh ANL voi toan hang 2 la byte o bo nho dulieu noi MOV 20H,#24 ; (20H) = 24 = 18H ANL A,20H ; A = 10H AND 18H = 10H ; ANL tuong tu voi cac toan hang 2 co dinh dia chi la REG, INDIRECT ; Ap dung ANL de giu lai cac bit can thiet (AND voi 1) va xoa cac bit khong can thiet ; (AND voi 0) MOV A,#NUM2 ; A =3AH ANL A,#0FH ; A = 0AH = 4 bit thap Các TD minh họa tập lệnh 8051 – trang 3 ; 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 <- 0 ; Cac cach khac de xoa A (khong hieu qua bang CLR) MOV A,#0 ; hay ANL A,#0 ; Lấy bù 1 nội dung trong thanh ghi A MOV A,#NUM2 ; A = 3AH CPL A ; A = bù 1 của 3AH = C5H XRL A,#0FFH ; A = bù 1 của C5H = 3AH (XRL không hiệu quả bằng CPL) sjmp $ END TD : Minh họa các lệnh xoay bit (Rotate) và hoán đổi 4 bit (SWAP) ; TD: logic02.asm NUM1 EQU 15 ; 0000_1111B NUM2 EQU -12 ; 1111_0100B ; Thu lenh RR A MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15 RR A ; A = 1000_0111B = 87H RR A ; A = 1100_0011B = C3H ; Thu lenh RL A MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15 RL A ; A = 0001_1110B = 1EH = 30 = 15 x 2 1 RL A ; A = 0011_1100B = 3CH = 60 = 30 x 2 = 15 x 2 2 ; Xoay phai voi co C MOV A,#NUM1 ; A = 0000_1111B = 15 SETB C ; C <- 1 RRC A ; A = 1000_0111B = 87H va C = 1 ; Xoay trai voi co C MOV A,#NUM1 ; A = 0000_1111B = 15 SETB C ; C <- 1 RLC A ; A = 0001_1110B = 1EH va C = 0 ; Ap dung dich phai de chia nguyen khong dau A cho 2 MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15 RR A ; A = 1000_0111B = 87H CLR ACC.7 ; A = 0000_0111B = 07H = 7 = 15/2 ; Chia nguyen khong dau 1 so o A cho 2^n voi n = 1 -> 8 ; n duoc dat trong thanh ghi R7 MOV R7,#2 MOV A,#00011111B ; A = 31 CALL DIV2EXPN ; A = 0000_0111B = 7 = 31 div 4 ; Mot cach khac la dung lenh chia MOV A,#31 MOV B,#4 DIV AB ; A = 31/4 = 7 Các TD minh họa tập lệnh 8051 – trang 4 ; 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 trình con chia nguyên không dấu cho 2^n RR A CLR ACC.7 DJNZ R7, DIV2EXPn RET END TD : Minh họa các 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 vùng dữ liệu nội từ địa 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 vùng dữ liệu ngoại từ địa 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 dulieu 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 ; Hoán đổ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 cách khác để hoán đổ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 Các TD minh họa tập lệnh 8051 – trang 5 sjmp $ END TD : Minh họa các lệnh chuyển dữ liệu: MOVC ; TD: mov02.asm ; Đọc liên tục dữ liệu X từ P0 và xuất ra P1 giá tri X 2 ; Xuất dạng BCD 4 digit ở P2 (2 digit cao) va P3 (2 digit thap) MOV P0,#0FFH ; Đặt cấu hình cho P0 là INPUT MOV DPTR,#X2_BCD L1: MOV A,P0 ANL A,#0FH ; Bảo đảm chỉ tính tối đa là 15^2 = 225 PUSH ACC ; Lưu trữ cho lần gọi sau CALL SQUARE ; Assembler tự đổi sang ACALL hay LCALL MOV P1,A POP ACC CALL SQ_BCD SJMP L1 ; Chương trình con tính X^2 bằng cách tra bảng với thanh ghi nền là PC SQUARE: INC A ; Điều chỉnh để lấy số liệu đúng!! 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 trình con tra kết quả X^2 với biểu diễn BCD 4 digit ; Tra bảng bằng thanh ghi nền DPTR SQ_BCD: CLR C RL A ; A <-- 2 x A vì mỗi phần tử của bảng dài 2 byte PUSH ACC MOVC A,@A+DPTR MOV P2,A ; Xuat 2 ky so BCD cao POP ACC INC A MOVC A,@A+DPTR MOV P3,A ; Xuat 2 ky so BCD thap RET X2_BCD: DW 0000H, 0001H, 0004H, 0009H, 0016H, 0025H, 0036H, 0049H, 0064H, 0081H; 0 2 -> 9 2 DW 0100H, 0121H, 0144H, 0169H, 0196H, 0225H; 10 2 -> 15 2 END TD : Minh họa các lệnh với biến Boole (toán hạng 1 bit) ;TD: boole01.asm ; Thuc hien cac phep toan boole co ban NOT, AND, OR, XOR, NAND, va NOR F1 EQU PSW.1 ; Dùng thêm bit này làm biến tạm (đã có F0) X EQU P1.0 Y EQU P1.1 NOTX EQU P1.2 ; NOTX = NOT(X) XANDY EQU 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 Các TD minh họa tập lệnh 8051 – trang 6 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 ; Phải có lặp lại, nếu không sẽ không thể hiện được cổng logic!! END TD : Minh họa các phép toán logic với biến Boole (toán hạng 1 bit) ;TD: boole02.asm ; Định trị hàm Boole: F = (XY'+ WZ)(XZ'W' + X'Z)= tích của 2 tổng Boole ; Giả sử các biến X, Y, Z, W được đọc vào 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 họa các lệnh nhảy theo trị biến Boole: JB, JNB ;TD: boole03.asm ; Mô phỏng mạch đếm lên (đếm 10): ngõ ra nhị phân ở 4 bit thấp P2, giả sử được nối với mạch hiển thị số ; BCD và xung nhịp CK (kích cạnh 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 ==> phát hiện được cạnh xuống INC R0 CJNE R0,#10,NEXT MOV R0,#0 NEXT: MOV P2,R0 SJMP LOOP END Các TD minh họa tập lệnh 8051 – trang 7 ; SV có thể dùng Proteus để thấy rõ hơn hoạt động counter này TD : Minh họa các lệnh rẽ nhánh 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 <= 15 CALL DIV_P1P2 JMP L1 CASE_0: ; Tinh tong cua P1 va P2, ket qua xuat ra P3 MOV A,P1 ADD A,P2 MOV P3,A JMP L1 CASE_1: ; Tinh hieu cua P1 va P2, ket qua xuat ra P3 MOV A,P1 CLR C SUBB A,P2 MOV P3,A JMP L1 CASE_2: ; Tinh nhan cua P1 va P2, ket qua xuat ra P3 MOV A,P1 MOV B,P2 MUL AB ; gia su ket qua <= 255 MOV P3,A JMP L1 ; Thuc hien P1/P2 DIV_P1P2: MOV A,P1 MOV B,P2 DIV AB SWAP A ORL A,B MOV P3,A RET END TD : Minh họa các lệnh rẽ nhánh chương trình theo điều kiện: JZ, JNZ, DJNZ, va CJNE ; TD: branch02.asm MOV P0,#0FFH MOV A,P0 JZ ZERO MOV P1, #0F0H ; P0 khac 0 JMP NEXT ZERO: MOV P1,#0FH NEXT: ; Đoạn chương trình đếm các phần tử bằng 0 trong 1 bảng ở RAM ngoài (địa chỉ đầu là ; 0000H) với byte đầu là số phần tử trong bảng ; Nếu bảng có dải trị số: 07h 02h 00h 03h 05h 00h 09h 0Ch ; thì kết quả thanh ghi B = 2 MOV DPTR,#0 Các TD minh họa tập lệnh 8051 – trang 8 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ố các phần tử có trị >=3, kết quả cất vào R1, với TD này 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ô phỏng mạch so sánh 2 số nhị phân 4 bit X và Y (X = P1.7 P1.4, Y = P1.3 P1.0), mạch 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 lại) 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 Các TD minh họa tập lệnh 8051 – trang 9 . R0,#20h XCHD A,@R0 ; A = 23h va (20h) = 54h Các TD minh họa tập lệnh 8051 – trang 5 sjmp $ END TD : Minh họa các lệnh chuyển dữ liệu: MOVC ; TD:. SJMP LOOP END Các TD minh họa tập lệnh 8051 – trang 7 ; SV có thể dùng Proteus để thấy rõ hơn hoạt động counter này TD : Minh họa các lệnh