Các ví dụ minh họa tập lệnh 8051 - Hồ Trung Mỹ

Đ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  
NUM2  
NUM2M  
BIN16_1  
BIN16_2  
SUM16M  
DIFF16M  
EQU 25  
; = 19H  
; = EFH  
EQU -17  
EQU 20h  
EQU 2578  
EQU 1289  
EQU 22H  
EQU 24H  
; Địa chỉ ở IRAM (RAM nội) có trị số bằng NUM2  
; = 0A12H  
; = 0509H  
; Địa chỉ ở IRAM chứa tổng 2 số nhị phân 16 bit  
; Đị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 CMSB = 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  
ADD A,#LOW BIN16_2  
MOV SUM16M+1,A  
; Lấy byte thấp của hằng số 16 bit  
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  
CLR C  
; Lay byte thap cua hang so 16 bit  
SUBB A,#LOW BIN16_1  
MOV DIFF16M+1,A  
MOV A,#HIGH BIN16_2  
SUBB A,#HIGH BIN16_1  
MOV DIFF16M,A  
; Lay byte cao cua hang so 16 bit  
; Phai tinh den Carry cua phep cong truoc  
; (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  
INC 0  
INC @R0  
INC DPTR  
; (31H) = (31H) + 1  
; 1 cach khac de co R0 <- R0 + 1  
; (32H) = (32H) + 1  
; 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  
MOV  
DPL  
R7, DPL  
; Giam byte thap cua DPTR di 1  
; 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 2: ; 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  
BCD1_2  
BCD1_2M  
BCD4_1  
BCD4_2  
SUM4M  
EQU 25H  
EQU 17H  
EQU 20h ; Dia chi o IRAM co tri so bang BCD1_2  
EQU 3456H  
EQU 6789H  
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  
DA A  
; A <- A + BCD1_2 = 25H + 17H = 3CH  
; 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  
DA A  
; A <- A + B = 25H + 17H = 3CH  
; 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  
DA A  
; A <- A + R0 = 25H + 17H = 3CH  
; 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  
DA A  
; A <- A + (BCD1_2M) = 25H + 17H = 3CH  
; 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  
DA A  
; A <- A + Mem(R0) = 25H + 17H = 3CH  
; 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  
DA A  
; A <- BCD1_2 + BCD1_1 = 25H + 17H = 3CH  
; A = 42H  
; Thu lenh ADD va ADDC -> 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  
DA A  
SJMP $  
; A <- A - B = 25H - 17H = 0EH  
; A = 14H ==> Cho ket qua sai voi phep toan tru!!!  
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  
; 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  
CPL A  
XRL A,#0FFH  
; A = 3AH  
; A = bù 1 của 3AH = C5H  
; A = bù 1 của C5H = 3AH (XRL không hiệu quả bằng CPL)  
sjmp $  
END  
TD 4: 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  
RR A  
; A = 1000_0111B = 87H  
; A = 1100_0011B = C3H  
; Thu lenh RL A  
MOV A,#NUM1 ; A = 0000_1111B = 0FH = 15  
RL A  
RL A  
; A = 0001_1110B = 1EH = 30 = 15 x 21  
; A = 0011_1100B = 3CH = 60 = 30 x 2 = 15 x 22  
; Xoay phai voi co C  
MOV A,#NUM1 ; A = 0000_1111B = 15  
SETB C  
RRC A  
; C <- 1  
; A = 1000_0111B = 87H va C = 1  
; Xoay trai voi co C  
MOV A,#NUM1 ; A = 0000_1111B = 15  
SETB C  
RLC A  
; C <- 1  
; 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  
RRC A  
; C = bit dau cua A  
; A = 1111_1010B = FAH = -6 va C=0  
; Thử lệnh SWAP  
MOV A,#47H  
SWAP A  
; A = 74H  
sjmp $  
DIV2EXPN:  
RR A  
; Chương trình con chia nguyên không dấu cho 2^n  
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  
CONST2  
CONST3  
EQU 15H  
EQU 27H  
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  
MOVX @R0, A  
INC R0  
; Xuat byte cao dia chi  
L3:  
DJNZ R1, L3  
; Hoán đổi (<-->)nội dung 2 ô nhớ trong RAM nội  
; R1 <--> R7 ở bank 0  
MOV R1,#CONST1  
MOV R7,#CONST2  
PUSH 07  
; R1 = 15H  
; R7 = 27H  
PUSH 01  
POP 07  
POP 01  
; R7 = 15h  
; 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 6: 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 X2  
; Xuất dạng BCD 4 digit ở P2 (2 digit cao) va P3 (2 digit thap)  
MOV P0,#0FFH  
MOV DPTR,#X2_BCD  
MOV A,P0  
; Đặt cấu hình cho P0 là INPUT  
L1:  
ANL A,#0FH  
PUSH ACC  
CALL SQUARE  
; Bảo đảm chỉ tính tối đa là 15^2 = 225  
; Lưu trữ cho lần gọi sau  
; 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; 02 -> 92  
DW 0100H, 0121H, 0144H, 0169H, 0196H, 0225H; 102 -> 152  
END  
TD 7: 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  
X
Y
EQU  
EQU  
EQU  
EQU  
EQU  
EQU  
EQU  
EQU  
EQU  
PSW.1 ; Dùng thêm bit này làm biến tạm (đã có F0)  
P1.0  
P1.1  
NOTX  
XANDY  
XORY  
XXORY  
XNANDY  
XNORY  
P1.2  
P1.3  
P1.4  
P1.5  
P1.6  
P1.7  
; NOTX = NOT(X)  
; = X AND Y  
; = X OR Y  
; = X XOR Y  
; = X NAND Y  
; = 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  
MOV C,F0  
; NOT X  
ANL  
C,F1  
Các TD minh họa tập lệnh 8051 – trang 6  
MOV XANDY,C  
CPL  
; X AND Y  
C
MOV XNANDY,C; X NAND Y  
MOV C,F0  
ORL  
MOV XORY,C  
CPL  
C,F1  
; X OR Y  
C
MOV XNORY,C  
MOV C,Y  
; X NOR Y  
JNB  
CPL  
X,SKIP  
C
; Neu X=0 thi X XOR Y = Y  
; Neu X=1 thi X XOR Y = NOT Y  
SKIP: SJMP LOOP  
END  
; Phải có lặp lại, nếu không sẽ không thể hiện được cổng logic!!  
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
Y
Z
W
F
EQU  
EQU  
EQU  
EQU  
EQU  
MOV  
P1.0  
P1.1  
P1.2  
P1.3  
P1.7  
P1,#0FH  
C,X  
; Dat cau hinh P1.0 .. P1.4 la INPUT  
LOOP: MOV  
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  
MOV  
ANL  
F0,C  
C,W  
C,Z  
; F0 = XY'  
ORL  
JNC  
EXP2: MOV  
ANL  
C,F0  
DONE_0  
C,X  
C,/Z  
C,/W  
DONE_1  
F0,C  
C,Z  
; C = XY' + WZ  
; Neu Tong thu 1 = 0 thi F = 0  
ANL  
JC  
MOV  
MOV  
; C = XZ'W'  
ANL  
ORL  
MOV  
C,/X  
C,F0  
F,C  
; C = ZX' = X'Z  
; C = XZ'W' + X'Z  
; F = (XY'+ WZ)(XZ'W' + X'Z)  
SJMP LOOP  
DONE_0: CLR  
SJMP LOOP  
F
F
; F = 0  
; F = 1  
DONE_1:  
SETB  
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  
MOV  
MOV  
MOV  
P3.7  
P3,#80H  
R0,#0  
P2,#0  
CK,$  
; Dat cau hinh P3.7 INPUT  
; So dem ban dau la 0  
; Dau tien so dem la 0  
LOOP: JNB  
; đợi CK có mức 1  
JB  
INC  
CK,$  
R0  
; đợi CK có mức 0 ==> phát hiện được cạnh xuống  
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 10: 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  
MOV P1,#0FFH  
MOV P2,#0FFH  
; Dat cau hinh P0 la INPUT  
; Dat cau hinh P1 la INPUT  
; Dat cau hinh P2 la INPUT  
MOV DPTR,#JMP_TABLE  
MOV A,P0  
L1:  
ANL A,#03H  
RL A  
; Bao dam cho gia tri chon < 4 ! , sau lenh nay C =0  
; 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  
MOV P3,A  
JMP L1  
; gia su ket qua <= 255  
; 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 11: 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  
MOV B,#0  
; So phan tu cua bang dat trong R0  
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  
MOV R1,#0  
INC DPTR  
; So phan tu cua bang dat trong R0  
L2:  
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, P2.1 = 1 nếu X = Y, và P2.2 = 1 nếu X > Y  
; TD: branch03.asm  
MOV  
LOOP: MOV  
MOV  
P1,#0FFh  
A,P1  
B,A  
; Dat cau hinh cho P1 lam INPUT  
; A = X:Y (A do 2 số 4 bit X va Y hợp lại)  
; Cat tam ACC  
ANL  
XCH  
A,#0FH  
A,B  
; A = 0:Y  
; A = X:Y va B = 0:Y = Y  
SWAP  
ANL  
A
; A = Y:X  
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  
CLR  
P2.1  
P2.2  
SJMP LOOP  
XGTY: ; truong hop X > Y  
CLR  
CLR  
P2.0  
P2.1  
SETB P2.2  
SJMP LOOP  
END  
Các TD minh họa tập lệnh 8051 – trang 9  
pdf 9 trang myanh 20260 Free
Bạn đang xem tài liệu "Các ví dụ minh họa tập lệnh 8051 - 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_vi_du_minh_hoa_tap_lenh_8051_ho_trung_my.pdf