Giáo trình Vi điều khiển - Chương 5: Các chế độ đánh địa chỉ của 8051

CPC có thể truy cập dữ liệu theo nhiều cách khác nhau. Dữ liệu có thể ở
trong một thanh ghi hoặc trong bộ nhớ hoặc được cho như một giá trị tức thời các
cách truy cập dữ liệu khác nhau được gọi là các chế độ đánh địa chỉ. Chương này
chúng ta bàn luận về các chế độ đánh địa chỉ của 8051 trong phạm vi một số ví dụ.
Các chế độ đánh địa chỉ khác nhau của bộ vi xử lý được xác định như nó
được thiết kế và do vậy người lập trình không thể đánh địa chỉ khác nhau là:
1. tức thời 2. Theo thanh ghi 3. Trực tiếp
4. gián tiếp qua thanh ghi 5. Theo chỉ số
pdf 10 trang thamphan 27/12/2022 3660
Bạn đang xem tài liệu "Giáo trình Vi điều khiển - Chương 5: Các chế độ đánh địa chỉ của 8051", để 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:

  • pdfgiao_trinh_vi_dieu_khien_chuong_5_cac_che_do_danh_dia_chi_cu.pdf

Nội dung text: Giáo trình Vi điều khiển - Chương 5: Các chế độ đánh địa chỉ của 8051

  1. CHƯƠNG 5 Các chế độ đánh địa chỉ của 8051 CPC có thể truy cập dữ liệu theo nhiều cách khác nhau. Dữ liệu có thể ở trong một thanh ghi hoặc trong bộ nhớ hoặc được cho như một giá trị tức thời các cách truy cập dữ liệu khác nhau được gọi là các chế độ đánh địa chỉ. Chương này chúng ta bàn luận về các chế độ đánh địa chỉ của 8051 trong phạm vi một số ví dụ. Các chế độ đánh địa chỉ khác nhau của bộ vi xử lý được xác định như nó được thiết kế và do vậy người lập trình không thể đánh địa chỉ khác nhau là: 1. tức thời 2. Theo thanh ghi 3. Trực tiếp 4. gián tiếp qua thanh ghi 5. Theo chỉ số 5.1 Các chế độ đánh địa chỉ tức thời và theo thanh ghi 5.1.1 Chế độ đánh địa chỉ tức thời Trong chế độ đánh địa chỉ này toán hạng nguồn là một hằng số. Và như tên gọi của nó thì khi một lệnh được hợp dịch toán hạng đi tức thi ngay sau mã lệnh. Lưu ý rằng trước dữ liệu tức thời phải được đặt dấu (#) chế độ đánh địa chỉ này có thể được dùng để nạp thông tin vào bất kỳ thanh ghi nào kể cả thanh ghi con trỏ dữ liệu DPTR. Ví dụ: MOV A, # 25H ; Nạp giá trị 25H vào thanh ghi A MOV R4, #62 ; Nạp giá trị 62 thập phân vào R4 MOV B, #40H ; Nạp giá trị 40 H vào thanh ghi B MOV DPTR, #4521H ; Nạp 4512H vào con trỏ dữ liệu DPTR Mặc dù thanh ghi DPTR là 16 bit nó cũng có thể được truy cập như 2 thanh ghi 8 bit DPH và DPL trong đó DPH là byte cao và DPL là byte thấp. Xét đoạn mã dưới đây: MOV DPTR, #2550H MOV A, #50H MOV DPH, #25H Cũng lưu ý rằng lệnh dưới đây có thể tạo ra lỗi vì giá trị nạp vào DPTR lớn hơn16 bit: MOV DPTR, # 68975 ; Giá tri không hợp lệ > 65535 (FFFFH) Ta có thể dùng chỉ lệnh Eqw để truy cập dữ liệu tức thời như sau COUNT EDU 30 MOV R4, #COUNT ; R4 = 1E (30 = 1EH) MOV DPTR, #MYDATA ; DPTR = 200H ORG 200H MYDATA: DB “America”
  2. nó được cấp với lệnh. Dấu (# 0 là sự phân biệt giữa hai chế độ đánh địa chỉ. Xét các ví dụ dưới đây và lưu ý rằng các lệnh không có dấu (#): MOV R0, 40H ; Lưu nội dung của ngăn nhớ 40H của RAM vào R0 MOV 56H, A ; Lưu nội dung thanh ghi A vào ngăn nhớ 56H của RAM MOV R4, 7FH ; Chuyển nôi dung ngănnhớ 7FH của RAM vào R4 Như đã nói ở trước thì các ngăn nhớ trừ 0 đến 7 của RAM được cấp cho bằng 0 của các thanh ghi R0 - R7. Các thanh ghi này có thể được truy cập theo 2 cách như sau: MOV A, 4 ; Hai lệnh này giống nhau đều sao nội dung thanh ghi R4 vào A MOV A, R4 MOV A, 7 ; Hai lệnh này đều như nhau là sao nội dung R7 vào thanh ghi A MOV A,R7 Để nhấn mạnh sự quan trọng của dấu (#) trong các lệnh của 8051. Xét các mã cho sau đây: MOV R2, #05 ; Gán R2=05 MOV A, 2 ; Sao nội dung thanh ghi R2 vào A MOV B, 2 ; Sao nội dung thanh ghi R2 vào B MOC 7,2 ; Sao nội dung thanh ghi R7 vì lệnh “MOV R7, R2” là không hợp lệ. Mặc dù sử dụng các tên R0 - R7 dễ hơn các địa chỉ bộ nhớ của chúng nhưng các ngăn nhớ 30H đến 7FH của RAM không thể được truy cập theo bất kỳ cách nào khác là theo địa chỉ của chúng vì chúng không có tên. 5.2.2 các thanh ghi SFSR và các địa chỉ của chúng. Trong các thanh ghi được nói đến từ trước đến giờ ta thấy rằng các thanh ghi R0 - R7 là một phần trong 128 byte của bộ nhớ RAM. Vậy còn các thanh ghi A, B, PSW và DPTR là một bộ phận của nhóm các thanh ghi nhìn chung được gọi là các thanh ghi đặc biệt SFR (Special Funtion Register). Có rất nhiều thanh ghi với chức năng đặc biệt và chúng được sử dụng rất rộng rãi mà ta sẽ trình bày ở các chương sáu. Các thanh ghi FR có thể được truy cập theo tên của chúng (mà dễ hơn rất nhiều) hoặc theo các địa chỉ của chúng. Ví dụ địa chỉ của thanh ghi A là EOH và thanh ghi B là FOH như cho ở trong bảng 5.1. Hãy để ý đến những cặp lệnh có cùng ý nghĩa dưới đây: MOV 0E0H, #55H ; Nạp 55H vào thanh ghi A(A=55H) MOV A, #55H ; MOV 0F0H, #25H ; Nạp 2SH vào thanh ghi B ( B = 25) MOV 3, #25H ;
  3. đánh địa chỉ này bị giới hạn bởi việc truy cập các vị trí ngăn nhớ của RAM và các thanh ghi với địa chỉ được cho bên trong 8051. Ví dụ 5.1: Viết chương trình để gửi 55H đến cổng P1 và P2 sử dụng hoặc a) Tên các cổng b) Hoặc địa chỉ các cổng Lời giải: a) MOV A, #55H ; A = 55H MOV P1, A ; P1 = 55H MOV P2, A ; P2 = 55H b) Từ bảng 5.1 ta lấy đại chỉ cổng P1 là 80H và P2 là A0H MOV A, #55H ; A = 55H MOV 80H, A ; P1 = 55H MOV 0A0H, A ; P2 = 55H 5.2.3 Ngăn xếp và chế độ đánh địa chỉ trực tiếp. Một công dụng chính khác của chế độ đánh địa chỉ trực tiếp là ngăn xếp. Trong họ 8051 chỉ có chế độ đánh địa chỉ trực tiếp là được phép đẩy vào ngăn xếp. Do vậy, một lệnh như “PVSH A” là không hợp lệ. Việc đẩy thanh ghi A vào ngăn xếp phải được viết dưới dạng “PVAH 0E0H” với 0E0H là địa chỉ của thanh ghi A. Tương tự như vậy để đẩy thanh ghi R3 rãnh 0 vào ngăn xếp ta phải viết là “PVSH 03”. Chế độ đánh địa chỉ trực tiếp phải được sử dụng cho cả lệnh POP. Vì dụ “POP 04” sẽ kéo đỉnh của ngăn xếp vào thanh ghi R4 rãnh 0. Ví dụ 5.2: Trình bày mã để đẩy thanh ghi R5, R6 và A vào ngăn xếp và sau đó kéo chùng ngược trở lại R2, R3 và B tương ứng. Lời giải: PUSH 05 ; Đẩy R5 vào ngăn xếp PUSH 06 ; Đẩy R6 vào ngăn xếp PUSH 0E0H ; Đẩy thanhghi A vào ngăn xếp POP 0F0H ; Kéo đỉnh ngăn xếp cho vào thanh ghi B ; Bây giờ B = A POP 02 ; Kéo đỉnh ngăn xếp cho vào thanh ghi R2 ; Bây giờ R2= R6 POP 03 ; Kéo đỉnh ngăn xếp cho vào thanh ghi ; Bây giờ R3 = R5 5.2.4 chế độ đánh địa chỉ gián tiếp thanh ghi. Trong chế độ này, một thanh ghi được sử dụng như một con trỏ đến dữ liệu. Nếu dữ liệu ở bên trong CPU thì chỉ các thanh ghi R0 và R1 được sử dụng cho mục đích này. Hay nói cách khác các thanh ghi R2 - R7 không có thể dùng được để giữ địa chỉ của toán hạng nằm trong RAM khi sử dụng chế độ đánh địa chỉ này khi Ro
  4. Một trong những ưu điểm của chế độ đánh địa chỉ gián tiếp thanh ghi là nó làm cho việc truy cập dữ liệu năng động hơn so với chế độ đánh địa chỉ trực tiếp. Ví dụ 5.3 trình bày trường hợp sao chép giá trị 55H vào các vị trí ngăn nhớ của RAM từ 40H đến 44H . Lưu ý rằng lời giải b) có hai lệnh được lặp lại với một số lần. Ta có thể tạo ra vòng lặp với hai lệnh này như ở lời giải c). Lời giải c) là hiệu quả nhất và chỉ có thể khi sử dụng chế độ đánh địa chỉ gián tiếp qua thanh ghi. Vòng lặp là không thể trong chế độ đánh địa chỉ trực tiếp. Đây là sự khác nhau chủ yếu giữa đánh địa chỉ trực tiếp và gián tiếp. Ví dụ 5.4: Hãy viết chương trình để xoá 16 vị trí ngăn nhớ RAM bắt đầu tại địa chỉ 60H. Lời giải: CLR A ; Xoá A=0 MOV R1, #60H ; Nạp con trỏ. R1= 60H MOV R7, #16H ;Nạp bộ đếm, R7 = 1 6 (10 H dạng hex) AGAIN: MOV @R1, A ; Xoá vị trí ngăn nhớ RAM do R1 chỉ đến INC R1 ; Tăng R1 DJNZ R7, AGAiN ; Lặp lại cho đến khi bộ đếm = 0 Một ví dụ về cách sử dụng cả R0 và R1 trong chế độ đánh địa chỉ gián tiếp thanh ghi khi truyền khối được cho trong ví dụ 5.5. Ví dụ 5.5: Hãy viết chương trình để sao chép một khối 10 byte dữ liệu từ vị trí ngăn nhớ RAM bắt đầu từ 35H vào các vị trí ngăn nhớ RAM bắt đầu từ 60H Lời giải: MOV R0, # 35H ; Con trỏ nguồn MOV R1, #60H ; Con trỏ đích MOV R3, #10 ; Bộ đếm BACK: MOV A, @R0 ; Lấy 1byte từ nguồn MOV @R1, A ; Sao chép nó đến đích INC R0 ; Tăng con trỏ nguồn INC R1 ; Tăng con trỏ đích DJNZ R3, BACK ; Lặp lại cho đến khi sao chép hết 10 byte 5.2.6 Hạn chế của chế độ đánh địa chỉ gián tiếp thanh ghi trong 8051. Như đã nói ở phần trước rằng R0 và R1 là các thanh ghi duy nhất có thể được dùng để làm các con trỏ trong chế độ đánh địa chỉ gián tiếp thanh ghi. Vì R0 và R1 là các thanh ghi 8 bit, nên việc sử dụng của chúng bị hạn chế ở việc truy cập mọi thông tin trong các ngăn nhớ RAM bên trong (các ngăn nhớ từ 30H đến 7FH và các thanh ghi SFR). Tuy nhiên, nhiều khi ta cần truy cập dữ liệu được cắt trong RAM ngoài hoặc trong không gian mã lệnh của ROM trên chip. Hoặc là truy cập bộ nhớ RAM ngoài hoặc ROM trên chíp thì ta cần sử dụng thanh ghi 16 bit đó là DPTR. 5.2.7 Chế độ đánh địa chỉ theo chỉ số và truy cập bộ nhớ ROM trên chíp.
  5. Giả sử không gian ROM bắt đầu từ địa chỉ 250H có chứa “America”, hãy viết chương trình để truyền các byte vào các vị trí ngăn nhớ RAM bắt đầu từ địa chỉ 40H. Lời giải ; (a) Phương pháp này sử dụng một bộ đếm ORG 000 MOV DPTR, # MYDATA ; Nạp con trỏ ROM MOV R0, #40H ; Nạp con trỏ RAM MOV R2, #7 ; Nạp bộ đếm BACK: CLR A ; Xoá thanh ghi A MOVC A, @A + DPTR ;Chuyển dữ liệu từ khong gian mã MOV R0, A ;Cất nó vào ngăn nhớ RAM INC DPTR ; Tăng con trỏ ROM INC R0 ; Tăng con trỏ RAM DJNZ R2, BACK ; Lặp lại cho đếnkhi bộ đếm = 0 HERE: SJMP HERE ; không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H MYDATA: DB “AMER1CA” END ;(b) phương pháp này sử dụng ký tự null để kết thúc chuỗi ORG 000 MOV DPTR, #MYDATA ; Nạp con trỏ ROM MOV R0, #40 ; Nạp con trỏ RAM BACK: CLR A S ; Xoá thanh ghi A(A=0) MOVC A, @A + DPTR ; Chuyển dữ liệu từ không gian mã JZ HERE ; Thoát ra nếu có ký tự Null MOV DPTR, #MYDATA ; Cất nó vào ngădn nhớ của RAM INC @R0, A ; Tăng con trỏ ROM INC R0 ; Tăng con trỏ RAM SJM BACK ; Lặp lại HERE: SJMP HERE ; không gian mã của ROM trên chíp dùng để cất dữ liệu ORG 250H MYADTA: DB “AMER1CA”, 0 ; Ký tự Null để kết thúc chuỗi END Lưu ý đến cách ta sử dụng lệnh JZ để phát hiện ký tự NOLL khi kết thúc chuỗi 5.2.8 Bảng xắp xếp và sử dụng chế độ đánh địa chỉ theo chỉ số. Bảng xắp xế là khái niệm được sử dụng rất rộng rãi trong lập trình các bộ vi xử lý. Nó cho phép truy cập các phần từ của một bảng thường xuyên được sử dụng với thao tác cực tiểu. Như một ví dụ, hãy giả thiết rằng đối với một ứng dụng nhất định ta cần x2 giá trị trong phạm vi 0 đến 9. Ta có thể sử dụng một bảng xắp xếp thay cho việc tính toán nó. Điều này được chỉ ra trong ví dụ 5.8.