TẬP LỆNH 8051

Một phần của tài liệu Giáo trình Kỹ thuật vi điều khiển (Nghề Điện tử dân dụng): Phần 1 - CĐ nghề Vĩnh Long (Trang 28 - 106)

Mục tiêu

- Phân biệt được được các kiểu định địa chỉ và dữ liệu

- Trình bày được đặc tính và cơng dụng của từng lệnh trong 8051 - Xác định được độ lớn và thời gian thực hiện chương trình

- Kết hợp được các lệnh riêng lẻ để thưc hiện thao tác viết chương trình

Nội dung

1. Mở đầu

Lập trình cho vi điều khiển cũng tương tự như lập trình cho máy tính, bản chất là ta gia lệnh cho vi điều khiển thực hiện 1 danh sách các lệnh cơ bản được sắp xếp theo một trình tự nào đĩ để cĩ thể hồn thành một nhiệm vụ đề ra. Và tất cả những lệnh mà vi điều khiển cĩ thể hiểu được gọi là tập lệnh. Các vi điều khiển tương thích với 8051 cĩ 255 lệnh. 2. Các cách định địa chỉ + Các kiểu định địa chỉ - Thanh ghi(register) - Trực tiếp(direct) - Gián tiếp(indirect) - Tức thời(immediate) - Tương đối(Relative) - Tuyệt đối(Absolute) - Dài(Long) - Định vị(Index) + Định địa chỉ thanh ghi

Kiểu này thường dùng cho các lệnh xử lý dữ liệu, luơn lưu trong các thanh ghi.(R0 – R7)

Ví dụ MOV A, R1 : copy nội dung thanh ghi R1 vào thanh ghi A + Kiểu định địa chỉ trực tiếp

Kiểu này thường được dùng để truy xuất dữ liệu của ơ nhớ bất kỳ nào trong 256 byte bộ nhớ RAM nội của vi điều khiển 8951

Ví dụ: MOV A, 05H : copy nội dung ơ nhớ 05H vào thanh ghi A + Định địa chỉ gián tiếp

Kiểu định địa chỉ gián tiếp được tượng trưng bởi ký hiệu @ và được đặt trước thanh ghi R0, R1 hay DPTR

23

R0 và R1 cĩ thể hoạt động như một thanh ghi con trỏ, nội dung của nĩ cho biết địa chỉ của một ơ nhớ trong Ram nội mà dữ liệu sẽ ghi hoặc sẽ đọc. Cịn DPTR dùng để truy xuất ơ nhớ ngoại.

Ví dụ: MOV A, @R1 : Copy nội dung ơ nhớ cĩ địa chỉ trong thanh ghi R1 vào thanh ghi A

+ Định địa chỉ tức thời

Kiểu định địa chỉ tức thời được tượng trưng bởi ký hiệu # và được đặt trước một hằng số

Lệnh này thường được dùng để nạp 1 giá trị là một hằng số ở byte thứ 2 hoặc byte thứ 3 vào thanh ghi hoặc ơ nhớ

Ví dụ: Mov A, #30H; nạp dữ liệu là con số 30H vào thanh ghi A + Định địa chỉ tương đối

Kiểu định địa chỉ tương đối này sử dụng với những lệnh nhảy. Nơi nhảy cĩ địa chỉ bằng địa chỉ đang lưu trong thanh ghi PC cộng với 1 giá trị 8 bit cĩ giá trị từ -128 đến +127, nên vi điều khiển cĩ thể nhảy lùi hoặc nhảy tới

Nơi nhảy thường được xác định bởi nhãn(label)

Định địa chỉ tương đối cĩ ưu điểm là mã lệnh cố định, nhưng khuyết điểm là chỉ nhảy ngắn trong phạm vi -128 - +127, nếu nơi nhảy xa hơn lệnh này khơng đáp ứng xảy ra lỗi

Ví dụ: SJMP X1; nhảy đến nhãn X1 nằm trong tầm 256 byte + Định địa chỉ tuyệt đối

Kiểu định địa chỉ tuyệt đối dùng với các lệnh ACALL, AJMP

Định địa chỉ tuyệt đối cĩ ưu điểm là mã lệnh ngắn(2byte), nhưng khuyết điểm là mã lệnh thay đổi, giới hạn phạm vi nơi nhảy đến khơng quá 2kbyte

Ví dụ: AJMP X1; nhảy đến nhãn cĩ tên X1, trong tầm 2kbyte + Định địa chỉ dài

Kiểu định địa chỉ dài được dùng với lệnh LCALL, LJMP.

Ưu điểm cĩ thể gọi 1 chương trình con hoặc cĩ thể nhảy đến bất kỳ vùng nhớ nào vùng nhớ 64k

Ví dụ: LJMP X1; nhảy đến nhãn X1 nằm trong tầm 64kbyte + Định địa chỉ chỉ số

Kiểu định địa chỉ chỉ số “ dùng một thanh ghi cơ bản: là bộ đếm chương trình PC hoặc bộ đếm dữ liệu DPTR” kết hợp với “ một giá trị lệnh(offset) cịn gọi là giá trị tương đối (thường lưu trong thanh ghi) để tạo ra một địa chỉ của ơ nhớ cần truy xuất hoặc là địa chỉ của nơi nhảy đến

Ví dụ: MOVX A, @A+ DPTR; lấy dữ liệu trong ơ nhớ cĩ địa chỉ bằng DPTR + A

24

3. Các nhĩm lệnh

3.1. Nhĩm lệnh số học

- Lệnh ADD A, <src-byte>

❖ Chức năng: Cộng (ADD).

Mơ tả: Cộng nội dung của thanh ghi A (A) với nội dung của một byte cĩ địa chỉ được chỉ ra trong lệnh (src-byte), và sau đĩ đặt kết quả vào thanh ghi A. Các cờ bị ảnh hưởng (xem chi tiết trong Bảng 3.3.1).

• Cờ CY = 1 nếu cĩ nhớ từ bit 7. • Cờ AC = 1 nếu cĩ nhớ từ bit 3.

• Cờ OV = 1 nếu cĩ nhớ từ bit 6 nhưng khơng cĩ nhớ từ bit 7 hoặc nếu cĩ nhớ từ bit 7 nhưng khơng cĩ nhớ từ bit 6.

• Khi cộng hai số nguyên khơng dấu và cĩ dấu: ▪ Số khơng dấu: CY = 1 Phép tốn cĩ nhớ.

▪ Số cĩ dấu: CY = 1  Số dương = Số âm + Số âm.  Số âm = Số dương + Số dương. - Các dạng lệnh:

ADD A, Rn

Số byte 1

Số chu kỳ 1

Mã lệnh 00101rrr

Hoạt động (A)  (A) + (Rn)

ADD A, direct

Số byte 2

Số chu kỳ 1

Mã lệnh 00100101 aaaaaaaa Hoạt động (A)  (A) + (direct)

ADD A, @Ri

Số byte 1

Số chu kỳ 1

Mã lệnh 0010011i

Hoạt động (A)  (A) + ((Ri))

ADD A, #data

Số byte 2

Số chu kỳ 1

Mã lệnh 00100100 dddddddd Hoạt động (A)  (A) + #data

25

Ví dụ: Giả sử cho trước (A) = C3H, (R0) = 47H, (P1) = (90H) = AAH, (47H) =

D2H.

 Sau khi thực thi lệnh ADD A, R0 thì ta cĩ kết quả như sau: (A) = 0AH, cờ CY = 1, cờ AC = 0, cờ OV = 0

 Sau khi thực thi lệnh ADD A, 90H hay ADD A, P1 thì ta cĩ kết quả như sau: (A) = 6DH, cờ CY = 1, cờ AC = 0, cờ OV = 1

 Sau khi thực thi lệnh ADD A, @R0 thì ta cĩ kết quả như sau: (A) = 95H, cờ CY = 1, cờ AC = 0, cờ OV = 0

 Sau khi thực thi lệnh ADD A, #4EH thì ta cĩ kết quả như sau: (A) = 11H, cờ CY = 1, cờ AC = 1, cờ OV = 0

Lệnh ADDC A, <src-byte>

Chức năng: Cộng cĩ cờ nhớ (ADD with Carry).

Mơ tả: Cộng đồng thời nội dung của thanh ghi A (A) với nội dung của

byte cĩ địa chỉ được chỉ ra trong lệnh (src-byte) cùng với cờ nhớ (CY), và sau đĩ đặt kết quả vào thanh ghi A. Các cờ bị ảnh hưởng (xem chi tiết trong Bảng 3.3.1).

• Cờ CY = 1 nếu cĩ nhớ từ bit 7. • Cờ AC = 1 nếu cĩ nhớ từ bit 3.

• Cờ OV = 1 nếu cĩ nhớ từ bit 6 nhưng khơng cĩ nhớ từ bit 7 hoặc nếu cĩ nhớ từ bit 7 nhưng khơng cĩ nhớ từ bit 6.

26

▪ Số khơng dấu: CY = 1 Phép tốn cĩ nhớ. ▪ Số cĩ dấu: CY = 1 Số dương = Số âm + Số âm.

 Số âm = Số dương + Số dương. - Các dạng lệnh:

ADDC A, Rn

Số byte 1

Số chu kỳ 1

Mã lệnh 00110rrr

Hoạt động (A)  (A) + (C) + (Rn)

ADDC A, direct

Số byte 2

Số chu kỳ 1

Mã lệnh 00110101 aaaaaaaa

Hoạt động (A)  (A) + (C) + (direct)

ADDC A,@Ri

Số byte 1

Số chu kỳ 1

Mã lệnh 0011011i

Hoạt động (A)  (A) + (C) + ((Ri))

ADDC A, #data

Số byte 2

Số chu kỳ 1

Mã lệnh 00110100 dddddddd Hoạt động (A)  (A) + (C) + # data

Ví dụ: Giả sử cho trước (A) = C3H, (R0) = 47H, (P1) = (90H) = AAH, (47H) =

D2H và cờ CY = 1.

 Sau khi thực thi lệnh ADDC A, R0 thì ta cĩ kết quả như sau: (A) = 0BH, cờ CY = 1, cờ AC = 0, cờ OV = 0

 Sau khi thực thi lệnh ADDC A, 90H hay ADDC A, P1 thì ta cĩ kết quả như

sau:

27

 Sau khi thực thi lệnh ADDC A, @R0 thì ta cĩ kết quả như sau: (A) = 96H, cờ CY = 1, cờ AC = 0, cờ OV = 0

 Sau khi thực thi lệnh ADDC A, #4EH thì ta cĩ kết quả như sau: (A) = 11H, cờ CY = 1, cờ AC = 1, cờ OV = 0

- Lệnh SUBB A, <src-byte>

Chức năng: Trừ cĩ số mượn (SUBtract with Borrow).

Mơ tả: Trừ nội dung của thanh ghi A (A) với nội dung của byte cĩ địa

chỉ được chỉ ra trong lệnh (src-byte) cùng với cờ nhớ (CY), và cất kết quả vào thanh ghi A. Các cờ bị ảnh hưởng (xem chi tiết trong Bảng 3.3.1).

• Cờ CY = 1 nếu cĩ mượn cho bit 7. • Cờ AC = 1 nếu cĩ mượn cho bit 3.

• Cờ OV = 1 nếu cĩ mượn cho bit 6 nhưng khơng cĩ mượn cho bit 7 hoặc nếu cĩ mượn cho bit 7 nhưng khơng cĩ mượn cho bit 6. • Khi cộng hai số nguyên khơng dấu và cĩ dấu:

▪ Số khơng dấu: CY = 1 Phép tốn cĩ mượn.

▪ Số cĩ dấu: CY = 1 Số dương = Số âm – Số dương.  Số âm = Số dương – Số âm. - Các dạng lệnh:

SUBB A, Rn

Số byte 1

Số chu kỳ 1

Mã lệnh 10011rrr

Hoạt động (A)  (A) – (C) – (Rn)

SUBB A, direct

Số byte 2

28

Mã lệnh 10010101 aaaaaaaa

Hoạt động (A)  (A) – (C) – (direct)

SUBB A, @Ri

Số byte 1

Số chu kỳ 1

Mã lệnh 1001011i

Hoạt động (A)  (A) – (C) – ((Ri))

SUBB A, #data

Số byte 1

Số chu kỳ 1

Mã lệnh 100110100 dddddddd

Hoạt động (A)  (A) – (C) – #data

Ví dụ: Giả sử cho trước (A) = 83H, (R0) = 78H, (P1) = (90H) = AAH, (78H) =

C5H và cờ CY=1.

 Sau khi thực thi lệnh SUBB A, R0 thì ta cĩ kết quả như sau: (A) = 0AH, cờ CY = 0, cờ AC = 1, cờ OV = 1

 Sau khi thực thi lệnh SUBB A, 90H hay SUBB A, P1 thì ta cĩ kết quả như sau: (A) = D8H, cờ CY = 1, cờ AC = 1, cờ OV = 0

 Sau khi thực thi lệnh SUBB A, @R0 thì ta cĩ kết quả như sau: (A) = BDH, cờ CY = 1, cờ AC = 1, cờ OV = 0

 Sau khi thực thi lệnh SUBB A, #0D6H thì ta cĩ kết quả như sau: (A) = ACH, cờ CY = 1, cờ AC = 1, cờ OV = 0

- Lệnh INC byte

29

Mơ tả: Tăng nội dung của byte cĩ địa chỉ được chỉ ra trong lệnh (byte)

thêm 1. Các cờ khơng bị ảnh hưởng (xem chi tiết trong Bảng 3.3.1). ❖ Lưu ý: Khi lệnh này được dùng để thay đổi giá trị của một port xuất thì

giá trị được dùng làm dữ liệu ban đầu của port sẽ được lấy từ bộ chốt dữ liệu xuất, mà khơng phải được lấy từ các chân nhập.

- Các dạng lệnh:

INC A

Số byte 1

Số chu kỳ 1

Mã lệnh 00000100

Hoạt động (A)  (A) + 1

INC Rn Số byte 1 Số chu kỳ 1 Mã lệnh 00001rrr Hoạt động (Rn)  (Rn) + 1 INC direct Số byte 2 Số chu kỳ 1 Mã lệnh 00000101 aaaaaaaa Hoạt động (direct)  (direct) + 1

INC @Ri

Số byte 1

Số chu kỳ 1

Mã lệnh 0000011i

Hoạt động ((Ri))  ((Ri)) + 1

Ví dụ: Giả sử cho trước (A) = C3H, (R0) = 69H, (P1) = (90H) = AAH, (69H) =

7FH.

 Sau khi thực thi lệnh INC A thì ta cĩ kết quả như sau: (A) = C4H

 Sau khi thực thi lệnh INC 90H hay INC P1 thì ta cĩ kết quả như sau: (P1) = (90H) = ABH

30

(@R0) = (69H) = 80H

 Sau khi thực thi lệnh INC R0 thì ta cĩ kết quả như sau: (R0) = 6AH

- Lệnh INC DPTR

Chức năng: Tăng con trỏ dữ liệu (INCrement Data PoinTeR).

Mơ tả: Tăng nội dung của thanh ghi con trỏ dữ liệu 16-bit thêm 1. Các

cờ khơng bị ảnh hưởng (xem chi tiết trong Bảng 3.3.1).

Số byte 1

Số chu kỳ 2

Mã lệnh 10100011

Hoạt động (DPTR)  (DPTR) + 1

Ví dụ 1: Giả sử cho trước (DPTR) = 1234H.

 Sau khi thực thi lệnh INC DPTR thì ta cĩ kết quả như sau: (DPTR) = 1235H với (DPH) = 12H và (DPL) = 35H

Ví dụ 2: Giả sử cho trước (DPH) = 12H và (DPL) = FFH.

 Sau khi thực thi lệnh INC DPTR thì ta cĩ kết quả như sau: (DPTR) = 1300H với (DPH) = 13H và (DPL) = 00H

Lưu ý: Khơng cĩ lệnh giãm nội dung của thanh ghi DPTR (lệnh DEC

DPTR là lệnh sai). Nếu muốn giãm nội dung của thanh ghi DPTR thì ta phải viết một đoạn chương trình con để thực hiện điều này. Chương trình con thực hiện việc giãm thanh ghi DPTR được minh họa như sau:

DEC_DPTR:

PUSH ACC ; Lưu tạm giá trị ACC.

DEC DPL ; Giãm byte thấp của DPTR.

MOV A, DPL ; So sánh byte thấp của DPTR

CJNE A,#0FFH, SKIP ; với FFH.

DEC DPH ; Giãm byte cao của DPTR.

31

POP ACC ; Phục hồi giá trị ACC.

RET

- Lệnh DEC byte

Chức năng: Giãm bớt 1 (DECrement).

Mơ tả: Giãm nội dung của byte cĩ địa chỉ được chỉ ra trong lệnh (byte)

bớt 1. Các cờ khơng bị ảnh hưởng (xem chi tiết trong Bảng 3.3.1).

Lưu ý: Khi lệnh này được dùng để thay đổi giá trị của một port xuất thì

giá trị được dùng làm dữ liệu ban đầu của port sẽ được lấy từ bộ chốt dữ liệu xuất, mà khơng phải được lấy từ các chân nhập.

- Các dạng lệnh:

DEC A

Số byte 1

Số chu kỳ 1

Mã lệnh 00010100

Hoạt động (A)  (A) – 1

DEC Rn Số byte 1 Số chu kỳ 1 Mã lệnh 00011rrr Hoạt động (Rn)  (Rn) – 1 DEC direct Số byte 2 Số chu kỳ 1 Mã lệnh 00010101 aaaaaaaa Hoạt động (direct)  (direct) – 1

DEC @Ri

Số byte 1

Số chu kỳ 1

Mã lệnh 0001011i

Hoạt động ((Ri))  ((Ri)) – 1

Ví dụ: Giả sử cho trước (A) = C3H, (R0) = 60H, (P1) = (90H) = AAH, (60H) =

7AH.

 Sau khi thực thi lệnh DEC A thì ta cĩ kết quả như sau: (A) = C2H

32

(P1) = (90H) = A9H

 Sau khi thực thi lệnh DEC @R0 thì ta cĩ kết quả như sau: (@R0) = (60H) = 79H

 Sau khi thực thi lệnh DEC R0 thì ta cĩ kết quả như sau: (R0) = 5FH

- Lệnh MUL AB

❖ Chức năng: Nhân (MULtiply).

❖ Mơ tả: Nhân các số nguyên khơng dấu 8-bit chứa trong thanh ghi A và thanh ghi B. Tích số là một giá trị 16 bit, byte thấp (8 bit thấp) được cất trong thanh ghi A cịn byte cao (8 bit cao) được cất trong thanh ghi B. Nếu tích số lớn hơn 255 (0FFH) thì cờ tràn OV = 1. Cờ nhớ CY luơn luơn bị xĩa (xem chi tiết trong Bảng 3.3.1).

Số byte 1

Số chu kỳ 4

Mã lệnh 10100100

Hoạt động (B)  HIGH BYTE OF (A)  (B) (A)  LOW BYTE OF (A)  (B)

Ví dụ 1: Giả sử cho trước (A) = 02H, (B) = 7CH.

 Sau khi thực thi lệnh MUL AB thì ta cĩ kết quả như sau: (B) = 00H, (A) = F8H, cờ CY = 0, cờ OV = 0

Ví dụ 2: Giả sử cho trước (A) = C3H, (B) = AAH.

Sau khi thực thi lệnh MUL AB thì ta cĩ kết quả như sau: (B) = 81H, (A) = 7EH, cờ CY = 0, cờ OV = 1

- Lệnh DIV AB

33

❖ Mơ tả: Chia số nguyên khơng dấu 8-bit chứa trong thanh ghi A cho số nguyên khơng dấu 8-bit chứa trong thanh ghi B. Thương số được cất trong thanh ghi A cịn số dư được cất trong thanh ghi B. Cờ CY và cờ OV bị xố. Nếu ban đầu B chứa 00H, giá trị trả về trong thanh ghi A và thanh ghi B khơng được xác định và cờ OV = 1. Cờ CY bị xĩa trong mọi trường hợp (xem chi tiết trong Bảng 3.3.1).

Số byte 1

Số chu kỳ 4

Mã lệnh 10000100

Hoạt động (A)  QUOTIENT OF (A) / (B) (B)  REMAINDER OF (A) / (B)

Ví dụ 1: Giả sử cho trước (A) = C3H, (B) = 0AH.

 Sau khi thực thi lệnh DIV AB thì ta cĩ kết quả như sau: (B) = 05H, (A) = 13H, cờ CY = 0, cờ OV = 0

Ví dụ 2: Giả sử cho trước (A) = 00H, (B) = 0AH.

 Sau khi thực thi lệnh DIV AB thì ta cĩ kết quả như sau: (B) = 00H, (A) = 00H, cờ CY = 0, cờ OV = 0

Ví dụ 3: Giả sử cho trước (A) = C3H, (B) = 00H.

 Sau khi thực thi lệnh DIV AB thì ta cĩ kết quả như sau: (B) = yyH, (A) = xxH, cờ CY = 0, cờ OV = 1

- Lệnh DA A

Chức năng: Hiệu chỉnh thập phân nội dung của thanh ghi A đối với

phép cộng (Decimal–Adjust Accumulator for Addition)

Mơ tả: Hiệu chỉnh giá trị 8–bit trong thanh ghi A (giá trị này là kết quả

phép cộng hai tốn hạng cĩ dạng BCD nén trước đĩ) để tạo ra hai digit 4 bit. Phép cộng được thực hiện bởi lệnh ADD hoặc ADDC, lệnh DA A khơng áp dụng cho phép trừ SUBB).

34

• Nếu cờ AC = 1 hoặc nếu 4 bit thấp của thanh ghi A cĩ giá trị lớn hơn "9" (xxxx1010 – xxxx1111), thì "6"được cộng với nội dung của thanh ghi A để tạo ra số BCD ở 4 bit thấp. Sau khi cộng, cờ CY = 1 nếu cĩ số nhớ từ 4 bit thấp chuyển đến tất cả 4 bit cao.

• Nếu cờ CY = 1 hoặc nếu 4 bit cao của thanh ghi A cĩ giá trị lớn hơn “9” (1010xxxx – 1111xxxx), thì "6"được cộng với 4 bit cao để tạo ra số BCD ở 4 bit cao. Sau khi cộng cờ CY = 1 nếu cĩ số nhớ từ 4 bit cao nhưng cờ CY khơng bị xĩa. Vậy thì cờ CY chỉ ra rằng tổng của 2 tốn hạng BCD ban đầu lớn hơn 99. Cờ OV khơng bị ảnh hưởng. • Tất cả sự kiện trên chỉ xảy ra trong một chu kỳ máy. Lệnh này thực

Một phần của tài liệu Giáo trình Kỹ thuật vi điều khiển (Nghề Điện tử dân dụng): Phần 1 - CĐ nghề Vĩnh Long (Trang 28 - 106)

Tải bản đầy đủ (PDF)

(145 trang)