Giáo trình Vi điều khiển 8051 Assembly - Chương 8: Các lệnh một bit và lập trình

Trong hầu hết các bộ vi xử lý (BVXL) thì dữ liệu được truy cập theo từng byte.

Trong các bộ vi xử lýnh địa chỉ theo byte này thì các nội dung của một thanh ghi, bộ

nhớ RAM hay cổng đều phải được truy cập từng byte một. Hay nói cách khác, lượng

dữ liệu tối thiểu có thể được truy cập là một byte. Ví dụ, trong bộ vi xử lý Pentium

cổng vào/ ra (I/O) được định hướng theo byte, có nghĩa là để thay đổi một bít thì ta

phải truy cập toàn bộ 8 bít. Trong khi đó có rất nhiều ứng dụng thì ta phải chỉ cần thay

đổi giá trị của một bít chẳng hạn như là bật hoặc tắt một thiết bị. Do vậy khả năng

đánh địa chỉ đến từng bít của 8051 rất thích hợp cho ứng dụng này. Khả năng truy cập

đến từng bít một thay vì phải truy cập cả byte làm cho 805 trở thành trong những bộ

vi điều khiển (BVĐK) 8 bít mạnh nhất trên thị trường. Vậy những bộ phận nào của

CPU, RAM, các thanh ghi, cổng I/O hoặc ROM là có thể đánh địa chỉ theo bít được.

Vì ROM chỉ đơn giản dữ mã chương trình thực thi nên nó không cần khả năng đánh

địa chỉ theo bít. Tất cả mọi mã lệnh đều định hướng theo byte chỉ có các thanh ghi,

RAM và các cổng I/O là cần được đánh địa chỉ theo bít. Trong 8051 thì rất nhiềuvị trí

của RAM trong một số thanh ghi và tất cả các cổng I/O là có thể đánh địa chỉ theo

từng bít. Dưới đây ta chỉ đi sâu vào từng phần một.

pdf10 trang | Chuyên mục: Kiến Trúc Máy Tính | Chia sẻ: dkS00TYs | Lượt xem: 5414 | Lượt tải: 2download
Tóm tắt nội dung Giáo trình Vi điều khiển 8051 Assembly - Chương 8: Các lệnh một bit và lập trình, để xem tài liệu hoàn chỉnh bạn click vào nút "TẢI VỀ" ở trên
FH 
1 0 2 10H - 17H 
1 1 3 18H - 1FH 
 e) CLR 12 ; Clear bit 12 (decimal) 
 f) SETB 05 
Lời giải: 
 a) Địa chỉ bít 42H của RAM thuộc bít D2 của vị trí RAM 28H. 
 b) Địa chỉ bít 67H của RAM thuộc bít D7 của vị trí RAM 20H. 
 c) Địa chỉ bít 0FH của RAM thuộc bít D7 của vị trí RAM 21H. 
 d) Địa chỉ bít 28H của RAM thuộc bít D0 của vị trí RAM 25H. 
 e) Địa chỉ bít 12H của RAM thuộc bít D4 của vị trí RAM 21H. 
 f) Địa chỉ bít 05H của RAM thuộc bít D5 của vị trí RAM 20H. 
Ví dụ 8.9: Trạng thái của các bít P1.2 và P1.3 của cổng vào/ra P1 phải được lưu cất 
trước khi chúng được thay đổi. Hãy viết chương trình để lưu trạng thái của P1.2 vào vị 
trí bít 06 và trạng thái P1.3 vào vị trí bít 07. 
Lời giải: 
 CLR 06 ;Xoá địa chỉ bít 06 
 CLR 07 ; Xoá địa chỉ bít 07 
 JNB P1.2, OVER ;Kiểm tra bít P1.2 nhảy về OVER nếu P1.2 = 0 
 SETB 06 ; Nếu P1.2 thì thiết lập vị trí bít 06 = 0 
OVER: JNB P1.3, NEXT ;Kiểm tra bít P1.3 nhảy về NEXT nếu nó = 0 
 SETB 07 ;Nếu P1.3 = 1thì thiết lập vị trí bít 07 = 1 
NEXT: .... 
Các câu hỏi ôn luyện: 
1. Tất cả các cổng I/O của 8051 đều có khả năng đánh địa chỉ theo bít? (đúng sai) 
2. Tất cả mọi thanh ghi của 8051 đều có khả năng đánh địa chỉ theo bít? (đúng 
sai) 
3. Tất cả các vị trí RAM của 8051 đều có khả năng đánh địa chỉ theo bít? (đúng 
sai) 
4. Hãy chỉ ra những thanh ghi nào sau đây có khả năng đánh địa chỉ theo bít: 
 a) A, b) B, (c) R4 (d) PSW (e) R7 
5. Trong 128 byte RAM của 8051 những byte nào có khả năng đánh địa chỉ theo 
bít. Hãy liệt kê chúng. 
6. Làm thế nào để có thể kiểm tra xem bít D0 của R3 là giá trị cao hay thấp. 
7. Hãy tìm xem các bít dau thuộc những byte nào? Hãy cho địa chỉ của các byte 
RAM theo số Hex: 
 a) SETB 20 b) CLR 32 c) SETB 12H 
 d) SETB 95 e) SETB 0ETB 12H 
8. Các địa chỉ bít 00 - 7FH và 80 - F7H thuộc các vị trí nhớ nào? 
9. Các cổng P0, P1, P2 và P3 là một bộ phận của SFR? (đúng sai) 
10. Thanh ghi TCON có thể đánh địa chỉ theo bít (đúng sai) 
8.2 Các phép toán một bít với cờ nhớ CY. 
 Ngoài một thực tế là cờ nhớ CY được thay đổi bởi các lệnh lô-gíc và số học thì 
trong 8051 còn có một số lệnh mà có thể thao tác trực tiếp cờ nhớ CY. Các lệnh này 
được cho trong bảng 8.3. 
 Trong các lệnh được chỉ ra sau trong bảng 8.3 thì chúng ta đã trình bày công 
dụng của lệnh JNC, CLR và SETB trong nhiều ví dụ trong một số chương trước đây. 
Dưới đây ta tiếp tục làm quen với một số ví dụ về cách sư dụng một số lệnh khác từ 
bảng 8.3. 
 Một số lệnh cho trong bảng 8.3 làm việc với các phép toán lô-gíc AND và OR. 
Các ví dụ ở mục này sẽ chỉ ra cách sử dụng chúng như thế nào? 
 ở chương tiếp theo chúng ta sẽ chỉ ra nhiều ví dụ hơn về việc sử dụng của các 
lệnh đơn trong phạm vi các ứng dụng thực tế. 
 Bảng 8.3: Các lệnh liên quan đến cờ nhớ CY 
Lệnh chức năng 
SETB C Thực hiện (tạo) CY = 1 
CLR C Xoá bít nhớ CY = 0 
CPL C Bù bít nhớ 
MOV b, C Sao chép trạng thái bít nhớ vào vị trí bít b = CY 
MOV C, b Sao chép bít b vào trạng thái bít nhớ CY = b 
JNC đích Nhảy tới đích nếu CY = 0 
JC đích Nhảy tới đích nếu CY = 1 
ANL C. bít Thực hiện phép AND với bít b và lưu vào CY 
ANL C./ bít Thực hiện phép AND với bít đảo và lưu vào CY 
ORL C. bít Thực hiện phép OR với bít và lưu vào CY 
ORL C./ bít Thực hiện phép OR với bít đảo và lưu vào CY 
Ví dụ 8.10: Hãy viết một chương trình để lưu cất trạng thái của các bít P1.2 và P1.3 
vào vị trí nhớ tương ứng trong RAM 6 và 7. 
Lời giải: 
 MOV C, P1.2 ; Lưu trạng thái P1.2 vào CY. 
 MOV 06, C ; Lưu trạng thái CY vào bít 6 của RAM 
 MOV C, P1.3 ; Lưu trạng thái P1.2 vào CY 
 MOV 07, C ; Lưu trạng thái CY vào vị trí RAM 07 
Ví dụ 8.11: 
 giả sử vị trí nhớ 12H trong RAM giữ trạng thái của việc có điện thoại hay 
không. Nếu nó ở trạng thái cao có nghĩa là đã có một cuộc gọi mới vì nó được kiểm 
tra lần cuối. Hãy viết một chương trình để hiển thị “có lời nhắn mới” (“New 
Message”) trên màn hình LCD nếu bít 12H của RAM có giá trị cao. Nếu nó có giá trị 
thấp thì LCD hiển thị “không có lời nhắn mới” (“No New Message”). 
Lời giải: 
 MOV C, 12H ; Sao trạng thái bít 12H của RAM vào CY 
 JNC NO ; Kiểm tra xem cờ CY có giá trị cao không. 
 MOV DPTR, # 400H ; Nếu nó nạp địa chỉ của lời nhắn. 
 LCAL DISPLAY ; Hiển thị lời nhắn. 
 SJMP NEXT ; Thoát 
 NO: MOV DSTR, #420H ; Nạp địa chỉ không có lời nhắn. 
 LCAL DISPLAY ; Hiển thị nó. 
 EXIT: Thoát 
 ; data to be displayed on LCD 
 ORG 400H 
 YES-MG: DB “NEW Message” 
 ORG 420H 
 NO-MG: DB “No New Message” 
Ví dụ 8.12: 
 giả sử rằng bít P2.2 được dùng để kiểm tra đèn ngoài và bít P2.5 dùng để kiểm 
tra đèn trong của một toà nhà. Hãy trình bày làm thế nào để bật đèn ngoài và tắt đèn 
trong nhà. 
Lời giải: 
 SETB C ; Đặt CY = 1 
 ORL C, P2.2, C ; Thực hiện phép OR với CY 
 MOV P2.2, C ; Bật đèn nếu nó chưa bật. 
 CLR C ; Xoá CY = 0 
 ANL C, P2.5 ; CY = (P2.5 AND CY) 
 MOV P2.5, C ; Tắt nó nếu nó chưa tắt. 
Câu hỏi ôn luyện: 
1. Tìm trạng thái của cờ CY sau đoạn mã dưới đây: 
a) CLR A b) CLR C c) CLR C 
 ADD A, #OFFH JNC OVER JC OVER 
 JWC OVER SETB C CPL C 
 CPL C OVER: ... OVER: ... 
OVER: ... 
2. Hãy trình bày cách làm thế nào để lưu trạng thái bít P2.7 vào vị trí bít 31 của 
RAM. 
3. Hãy trình bày các chuyển trạng thái bít 09 của RAM đến bít P1.4. 
8.3 Đọc các chân đầu vào thông qua chốt cổng. 
 Trong việc đọc cổng thì một số lệnh đọc trạng thái của các chân cổng, còn một 
số lệnh khác thì đọc một số trạng thái của chốt cổng trong. Do vậy, khi đọc các cổng 
thì có hai khả năng: 
1. Đọc trạng thái của chân vào. 
2. Đọc chốt trong của cổng ra. 
 Chúng ta phải phân biệt giữa hai dạng lệnh này vì sự lẫn lộn giữa chúng là 
nguyên nhân chính của các lỗi trong lập trình cho 8051, đặc biệt khi đã kết nối với 
phần cứng bên ngoài. Trong phần này ta bàn về sơ qua các lệnh này. Tuy nhiên, độc 
giả phải nghiên cứu và hiểu về các nội dung của chủ đề này và về hoạt động bên trong 
của các cổng được cho trong phụ lục Appendix C2. 
8.3.1 Các lệnh đọc cổng vào. 
 Như đã nói ở chương 4 thì để biến một bít bất kỳ của cổng 8051 nào đó thành 
một cổng đầu vào, chúng ta phải ghi (lô-gíc cao) vào bít đó. Ssu khi cấu hình các bít 
của cổng là đầu vào, ta có thể sử dụng những lệnh nhất định để nhận dữ liệu ngoài 
trên các chân vào trong CPU. Bảng 8.4 là những lệnh nói trên. 
 Bảng 8.4: Các lệnh đọc một cổng vào. 
Giả lệnh Ví dụ Mô tả 
MOV A, PX MOV A, P2 Chuyển dữ liêuj ở chân P2 vào ACC 
JNB PX.Y, ... JNB P2.1, đích Nhảy tới đích nếu, chân P2.1 = 0 
JB PX.Y, JB P1.3, đích Nhảy đích nếu, chân P1.3 = 1 
MOV C, PX.Y MOV C, P2.4 Sao trạng thái chân P2.4 vào CY 
8.3.2 Đọc chốt cho cổng đầu ra. 
 Một số lệnh nội dung của một chốt cổng trong thay cho việc đọc trạng thái của 
một chân ngoài. Bảng 8.5 cung cấp danh sách những lệnh này. Ví dụ, xét lệnh “ANL 
P1, A”. Trình tự thao tác được thực hiện bởi lệnh này như sau: 
1. Nó đã chốt trong của một cổng và chuyển dữ liệu đó vào trong CPU. 
2. Dữ liệu này được AND với nội dung của thanh ghi A. 
3. Kết quả được ghi ngược lại ra chốt cổng. 
4. Dữ liệu tại chân cổng được thay đổi và có cùng giá trị như chốt cổng. 
 Từ những bàn luận trên ta kết luận rằng, các lệnh đọc chốt cổng thường đọc 
một giá trị, thực hiện một phép tính (và có thể thay đổi nó) sau đó ghi ngược lại ra 
chốt cổng. Điều này thường được gọi “Đọc-sửa-ghi”, (“Read-Modify-Write”). Bảng 
8.5 liệt kê các lệnh đọc-sửa-ghi sử dụng cổng như là toán hạng đích hay nói cách 
khác, chúng ta chỉ được dùng cho các cổng được cấu hình như các cổng ra. 
 Bảng 8.5: Các lệnh đọc một chốt (Đọc-sửa-ghi). 
giả lệnh Ví dụ 
ANL PX ANL P1, A 
ORL PX ORL P2, A 
XRL PX XRL P0, A 
JBC PX.Y, đích JBC P1.1, đích 
CPL PX CPL P1.2 
INC PX INC P1 
DEC PX DEC P2 
DJN2 PX.Y, đích DJN2 P1, đích 
MOV PX.Y, C MOV P1.2, C 
CLR PX.Y CLR P2.3 
SETB PX.Y SETB P2.3 
 Lưu ý: Chúng ta nên nghiên cứu phần C2 của phụ lục Appendix C nếu ta nối 
phần cứng ngoài vào hệ 8051 của mình. Thực hiện sai các chỉ dẫn hoặc nối sai các 
chân có thể làm hỏng các cổng của hệ 8051. 
8.4 Tóm lược. 
 Chương này đã mô tả một trong các đặc tính mạnh nhất của 8051 là phép toán 
một bít. Các phép toán một bít này cho phép lập trình viên thiết lập, xoá, di chuyển và 
bù các bít riêng rẽ của các cổng, bộ nhớ hoặc các thanh ghi. 
 Ngoài ra có một số lệnh cho phép thao tác trực tiếp với cờ nhớ CY. Chúng ta 
cũng đã bàn về các lệnh đọc các chân cổng thông qua việc đọc chốt cổng. 
8.5 Các câu hỏi kiểm tra. 
1. Các lệnh “SETB A”, “CLR A”, “CPL A” đúng hay sai? 
2. Các cổng vào/ ra nào và các thanh ghi nào có thể đánh địa chỉ theo bít. 
3. Các lệnh dưới đây đúng hay sai? Đánh dấu lệnh đúng. 
a) SETB P1 e) SETB B4 
b) SETB P2.3 f) CLR 80H 
c) CLR ACC.5 g) CLR PSW.3 
d) CRL 90H h) CLR 87H 
4. Hãy giết chương trình tạo xung vuông với độ đầy xung 75%, 80% trên các 
chân P1.5 và P2.7 tương ứng. 
5. Viết chương trình hiển thị P1.4 nếu nó có giá trị cao thì chương trình tạo ra một 
âm thanh (sóng dung vuông 50% độ đầy xung) trên chân P2.7. 
6. Nhưng địa chỉ bít nào được gán cho các cổng P0, P1, P2 và P3 cho các thanh 
ghi PCON, A, B và PSW. 
7. Những địa chỉ bít dưới đây thuộc về cổng hay thanh ghi nào? 
a) 85H b)87H c) 88H d)8DH e)93H 
f) A5H g)A7H h) B3H i) D4H j) D8H 
8. Hãy viết chương trình lưu các thanh ghi A, B vào R3 và R5 băng nhớ 2 tương 
ứng. 
9. Cho một lệnh khác cho “CLR C”, so sánh chúng. 
10. Làm thế nào để kiểm tra trạng thái các bít cờ OV, CY, P và AC. Hãy tìm địa 
chỉ bít của các cờ này. 
11. Các cùng nhớ 128 byte của RAM thì những vùng nào là đánh địa chỉ theo bít 
được? Hãy đánh dấu chúng. 
12. Các địa chỉ sau thuộc vùng RAM nào? 
a) 05H b) 47 c) 18H d) 2DH e) 53H 
g) 15H h) 67H h) 55H i) 14H k) 37FH 
13. Các địa chỉ nhỏ hơn 80H được gán cho địa chỉ 20-2FH của RAM phải không? 
(Đúng/ sai). 
14. Viết các lệnh để lưu cờ CY, AC, D vào vị trí bít 4, 16H và 12H tương ứng. 
15. Viết chương trình kiểm tra D7 của thanh ghi A. Nếu D7 = 1 thì gửi thông báo 
sang LCD báo rằng ACC có một số âm. 

File đính kèm:

  • pdfVi_dieu_khien_8051_ Assembly_08_LenhMotBit.pdf
Tài liệu liên quan