Các TD minh họa tập lệnh 8051 (phần đọc thêm của VXL-chương 3) - 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 1: 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 
pdf 9 trang thamphan 28/12/2022 2820
Bạn đang xem tài liệu "Các TD minh họa tập lệnh 8051 (phần đọc thêm của VXL-chương 3) - Hồ Trung Mỹ", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.

File đính kèm:

  • pdfcac_td_minh_hoa_tap_lenh_8051_phan_doc_them_cua_vxl_chuong_3.pdf

Nội dung text: Các TD minh họa tập lệnh 8051 (phần đọc thêm của VXL-chương 3) - Hồ Trung Mỹ

  1. Đ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 1: 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 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
  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 cộng 2 số BCD 4 ký số ; Ket qua cat vao o nho du lieu 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 Cho ket qua sai voi phep toan tru!!! SJMP $ BCD1_2C: DB BCD1_2 END TD 3: 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 du lieu 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
  3. ; 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 5: 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 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 ; 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
  4. 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 8: 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 9: 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
  5. 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 12: 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 ; 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 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