Giáo trình Vi điều khiển - Chương 2: Lập trình hợp ngữ 8051

2.1.1 Các thanh ghi.
Trong CPU các thanh ghi được dùng để lưu cất thông tin tạm thời, những
thông tin này có thể là một byte dữ liệu cần được sử lý hoặc là một địa chỉ đến
dữ liệu cần được nạp. Phần lớn các thanh ghi của 8051 là các thanh ghi 8 bit.
Trong 8051 chỉ có một kiểu dữ liệu: Loại 8 bit, 8 bit của một thanh ghi được
trình bày như sau:

với MSB là bit có giá trị cao nhất D7 cho đến LSB là bit có giá trị thấp nhất
D0. (MSB - Most Sigfican bit và LSB - Leart Significant Bit). Với một kiểu
dữ liệu 8 bit thì bất kỳ dữ liệu nào lớn hơn 8 bit đều phải được chia thành các
khúc 8 bit trước khi được xử lý. Vì có một số lượng lớn các thanh ghi trong
8051 ta sẽ tập trung vào một số thanh ghi công dụng chung đặc biệt trong các
chương kế tiếp 

pdf 23 trang thamphan 27/12/2022 3460
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Vi điều khiển - Chương 2: Lập trình hợp ngữ 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_2_lap_trinh_hop_ngu_8051.pdf

Nội dung text: Giáo trình Vi điều khiển - Chương 2: Lập trình hợp ngữ 8051

  1. 2. Nếu các giá trị 0 đến F được chuyển vào một thanh ghi 8 bit thì các bit còn lại được coi là tất cả các số 0. Ví dụ, trong lệnh “MOV A,#5” kết quả là A=0.5, đó là A = 0000 0101 ở dạng nhị phân. 3. Việc chuyển một giá trị lớn hơn khả năng chứa của thanh ghi sẽ gây ra lỗi ví dụ: MOV A, #7F2H ; Không hợp lệ vì 7F2H > FFH MOV R2, 456 ; Không hợp lệ vì 456 > 255 (FFH) 4. Để nạp một giá trị vào một thanh ghi thì phải gán dấu “#” trước giá trị đó. Nếu không có dấu thì nó hiểu rằng nạp từ một vị trí nhớ. Ví dụ “MOV A, 17H” có nghĩa là nạp giá trị trong ngăn nhớ có giá trị 17H vào thanh ghi A và tại địa chỉ đó dữ liệu có thể có bất kỳ giá trị nào từ 0 đến FFH. Còn để nạp giá trị là 17H vào thanh ghi A thì cần phải có dấu “#” trước 17H như thế này. “MOV A, #17H”. Cần lưu ý rằng nếu thiếu dấu “#” trước một thì sẽ không gây lỗi vì hợp ngữ cho đó là một lệnh hợp lệ. Tuy nhiên, kết quả sẽ không đúng như ý muốn của người lập trình. Đây sẽ là một lỗi thường hay gặp đối với lập trình viên mới. 2.1.3 Lệnh cộng ADD. Lệnh cộng ADD có các phép như sau: ADD a, nguồn ; Cộng toán hạng nguồn vào thanh ghi A. Lệnh cộng ADD nói CPU cộng byte nguồn vào thanh ghi A và đặt kết quả thanh ghi A. Để cộng hai số như 25H và 34H thì mỗi số có thể chuyển đến một thanh ghi và sau đó cộng lại với nhau như: MOV A, #25H ; Nạp giá trị 25H vào A MOV R2, #34H ; Nạp giá trị 34H vào R2 ADD A, R2 ; Cộng R2 vào A và kết quả A = A + R2 Thực hiện chương trình trên ta được A = 59H (vì 25H + 34H = 59H) và R2 = 34H, chú ý là nội dụng R2 không thay đổi. Chương trình trên có thể viết theo nhiều cách phụ thuộc vào thanh ghi được sử dụng. Một trong cách viết khác có thể là: MOV R5, #25H ; Nạp giá trị 25H vào thanh ghi R5 MOV R7, #34H ; Nạp giá trị 34H vào thanh ghi R7 MOV A, #0 ; Xoá thanh ghi A (A = 0) ADD A, R5 ; Cộng nội dung R5 vào A (A = A + R5) ADD A, R7 ; Cộng nội dung R7 vào A (A = A + R7 = 25H + 34H) Chương trình trên có kết quả trong A Là 59H, có rất nhiều cách để viết chương trình giống như vậy. Một câu hỏi có thể đặt ra sau khi xem đoạn chương trình trên là liệu có cẩn chuyển cả hai dữ liệu vào các thanh ghi trước
  2. Ngày nay, ta có thể sử dụng nhiều ngôn ngữ lập trình khác nhau, chẳng hạn như Basic, Pascal, C, C++, Java và vô số ngôn ngữ khác. Các ngôn ngữ này được coi là nhưng ngôn ngữ bậc cao vì lập trình viên không cần phải tương tác với các chi tiết bên trong của CPU. Một trình hợp dịch được dùng để dịch chương trình hợp ngữ ra mã máy còn (còn đôi khi cũng còn được gọi mà đối tượng (Object Code) hay mã lệnh Opcode), còn các ngôn ngữ bậc cao được dịch thành các ngôn ngữ mã máy bằng một chương trình gọi là trình biên dịch. Ví dụ, để viết một chương trình trong C ta phải sử dụng một trình biên dịch C để dịch chương trình về dạng mã máy. Bây giờ ta xét dạng thức hợp ngữ của 8051 và sử dụng trình hợp dịch để tạo ra một chương trình sẵn sàng chạy ngay được. 2.2.1 Cấu trúc của hợp ngữ. Một chương trình hợp ngữ bao gồm một chuỗi các dòng lệnh hợp ngữ. Một lệnh hợp ngữ có chứa một từ gợi nhớ (mnemonic) và tuy theo từng lệnh và sau nó có một hoặc hai toán hạng. Các toán hạng là các dữ liệu cần được thao tác và các từ gợi nhớ là các lệnh đối với CPU nói nó làm gì với các dữ liệu. ORG 0H ; Bắt đầu (origin) tại ngăn nhớ 0 MOV R5, #25H ; Nạp 25H vào R5 MOV R7, #34H ; Nạp 34H vào R7 MOV A, #0 ; Nạp 0 vào thanh ghi A ADD A, R5 ; Cộng nôi dụng R5 vào A (A = A + R5) ADD A, R7 ; Cộng nội dung R7 vào A (A = A + R7) ADD A, #12H ; Cộng giá trị 12H vào A (A = A + 12H) HERE: SJMP HERE ; ở lại trong vòng lặp này END ; Kết thúc tệp nguồn hợp ngữ Chương trình 2.1: Ví dụ mẫu về một chương trình hợp ngữ. Chương trình 2.1 cho trên đây là một chuỗi các câu lệnh hoặc các dòng lệnh được viết hoặc bằng các lệnh hợp ngữ như ADD và MOV hoặc bằng các câu lệnh được gọi là các chỉ dẫn. Trong khi các lệnh hợp ngữ thì nói CPU phải làm gì thì các chỉ lệnh (hay còn gọi là giả lệnh) thì đưa ra các chỉ lệnh cho hợp ngữ. Ví dụ, trong chương trình 2.1 thì các lệnh ADD và MOV là các lệnh đến CPU, còn ORG và END là các chỉ lệnh đối với hợp ngữ. ORG nói hợp ngữ đặt mã lệnh tại ngăn nhớ 0 và END thì báo cho hợp ngữ biết kết thúc mã nguồn. Hay nói cách khác một chỉ lệnh để bắt đầu và chỉ lệnh thứ hai để kết thúc chương trình. Cấu trúc của một lệnh hợp ngữ có 4 trường như sau: [nhãn:] [từ gợi nhớ] [các toán hạng] [; chú giải] Các trường trong dấu ngoặc vuông là tuỳ chọn và không phải dòng lệnh nào cũng có chúng. Các dấu ngoặc vuông không được viết vào. Với dạng thức trên đây cần lưu ý các điểm sau:
  3. 1. Trước hết ta sử dụng mộ trình soạn thảo để gỡ vào một chương trình giống như chương trình 2.1. Có nhiều trình soạn thảo tuyệt vời hoặc các bộ sử lý từ được sử dụng để tạo ra và/ hoặc để soạn thảo chương trình. Một trình soạn thảo được sử dụng rộng rãi là trình soạn thảo EDIT của MS-DOS (hoặc Noterad của Windows) đều chạy trên hệ điều hành Microsoft. Lưu ý rằng, trình soạn thảo phải có khả năng tạo ra tệp mã ASCII. Đối với nhiều trình hợp ngữ thì các tên tệp tuân theo các quy ước thường lệ củ DOS, nhưng phần mở rộng của các tệp nguồn phải là “asm” hay “src” tuỳ theo trình hợp ngữ mà ta sử dụng. 2. Tệp nguồn có phần mở rộng “asm” chứa mã chương trình được tạo ra ở bước 1 được nạp vào trình hợp dịch của 8051. Trình hợp dịch chuyển các lệnh ra mã máy. Trình hợp dịch sẽ tạo ra một tệp đối tượng và một tệp liệt kê với các thành phần mở rộng “obj” và “lst” tương ứng. 3. Các trình hợp dịch yêu cầu một bước thứ ba gọi là liên kết. Chương trình liên kết lấy một hoặc nhiều tệp đối tượng và tạo ra một tệp đối tượng tuyệt đối với thành phần mở rộng “abs”. Tệp “abs” này được sử dụng bởi thùng chứa của 8051 có một chương trình giám sát. 4. Kế sau đó tệp “abs” được nạp vào một chương trình được gọi là “0H” (chuyển đối tượng object về dạng số Hex) để tạo ra một tệp với đuôi mở rộng “Hex” có thể nạp tốt vào trong ROM. Chương trình này có trong tất cả mọi trình hợp ngữ của 8051 các trình hợp ngữ dựa trên Windows hiện nay kết hợp các bước 2 đến 4 vào thành một bước. Hình 2.2: Các bước để tạo ra một chương trình. 2.3.1 Nói thêm về các tệp “.asm” và “.object”. Tệp “.asm” cũng được gọi là tệp nguồn và chính vì lý do này mà một số trình hợp ngữ đòi hỏi tệp này phải có một phần mở rộng “src” từ chữ “source” là nguồn. Hãy kiểm tra hợp ngữ 8051 mà ta sử dụng xem nó có đòi hỏi như vậy không? Như ta nói trước đây tệp này được tạo ra nhờ một trình biên tập chẳng hạn như Edit của DOS hoặc Notepad của Windows. Hợp ngữ của 8051 chuyển đổi các tệp hợp ngữ trong tệp .asm thành ngôn ngữ mã máy và cung cấp tệp đối tượng .object. Ngoài việc tạo ra tệp đối tượng trình hợp ngữ cũng cho ra tệp liệt kê “lst” (List file). 2.3.2 Tệp liệt kê “.lst”. Tệp liệt kê là một tuỳ chọn, nó rất hữu ích cho lập trình viên vì nó liệt kê tất cả mọi mã lệnh và địa chỉ cũng như tất cả các lỗi mà trình hợp ngữ phát hiện ra. Nhiều trình hợp ngữ giả thiết rằng, tệp liệt kê là không cần thiết trừ khi ta báo rằng ta muốn tạo ra nó. Tệp này có thể được truy cập bằng một trình biên dịch như Edit của DOS hoặc Notepad của Window và được hiển thị trên màn hình hoặc được gửi ra máy in. Lập trình viên sử dụng tệp liệt kê để tìm các lỗi cú pháp. Chỉ sau khi đã sửa hết các lỗi được đánh dấu trong tệp liệt kê thì tệp đối tượng mới sẵn sàng làm đầu vào cho chương trình liên kết.
  4. của chương trình mẫu và cách đặt mã vào ROM chương trình 8051 như thế nào? Như ta có thể thấy, mã lệnh và toán hạng đối với mỗi lệnh được liệt kê ở bên trái của lệnh liệt kê. Chương trình 2.1: Ví dụ mẫu về một chương trình hợp ngữ. Chương trình 2.1 cho trên đây là một chuỗi các câu lệnh hoặc các dòng lệnh được viết hoặc bằng các lệnh hợp ngữ như ADD và MOV hoặc bằng các câu lệnh được gọi là các chỉ dẫn. Trong khi các lệnh hợp ngữ thì nói CPU phải làm gì thì các chỉ lệnh (hay còn gọi là giả lệnh) thì đưa ra các chỉ lệnh cho hợp ngữ. Ví dụ, trong chương trình 2.1 thì các lệnh ADD và MOV là các lệnh đến CPU, còn ORG và END là các chỉ lệnh đối với hợp ngữ. ORG nói hợp ngữ đặt mã lệnh tại ngăn nhớ 0 và END thì báo cho hợp ngữ biết kết thúc mã nguồn. Hay nói cách khác một chỉ lệnh để bắt đầu và chỉ lệnh thứ hai để kết thúc chương trình. Cấu trúc của một lệnh hợp ngữ có 4 trường như sau: [nhãn:] [từ gợi nhớ] [các toán hạng] [; chú giải] Các trường trong dấu ngoặc vuông là tuỳ chọn và không phải dòng lệnh nào cũng có chúng. Các dấu ngoặc vuông không được viết vào. Với dạng thức trên đây cần lưu ý các điểm sau: Trường nhãn cho phép chương trình tham chiếu đến một dòng lệnh bằng tên. Nó không được viết quá một số ký tự nhất định. Hãy kiểm tra quy định này của hợp ngữ mà ta sử dụng. Từ gợi nhớ (lệnh) và các toán hạng là các trường kết hợp với nhau thực thi công việc thực tế của chương trình và hoàn thiện các nhiệm vụ mà chương trình được viết cho chúng. Trong hợp ngữ các câu lệnh như: “ ADD A, B” “MOV A, #67H” Thì ADD và MOV là những từ gơi nhớ tạo ra mã lệnh, còn “A, B” và “A, #67H” là những toán hạng thì hai trường có thể chứa các lệnh giả hoặc chỉ lệnh của hợp ngữ. Hãy nhớ rằng các chỉ lệnh không tạo ra mã lệnh nào (mã máy) và chúng chỉ dùng bởi hợp ngữ, ngược lại đối với các lệnh là chúng được dịch ra mã máy (mã lênh) cho CPU thực hiện. Trong chương trình 2.1 các lệnh ORG và END là các chỉ lệnh (một số hợp ngữ của 8051 sử dụng dạng .ORG và .END). Hãy đọc quy định cụ thể của hợp ngữ ta sử dụng. Trương chú giải luôn phải bắt đầu bằng dấu chấm phẩy (;). Các chú giải có thể bắt đầu ở đầu dòng hoặc giữa dòng. Hợp ngữ bỏ qua (làm ngơ) các chú giải nhưng chúng lại rất cần thiết đối với lập trình viên. Mặc dù các chú giải là tuỳ chọn, không bắt buộc nhưng ta nên dùng chúng để mô tả chương trình để giúp cho người khác đọc và hiểu chương trình dễ dàng hơn. Lưu ý đến nhãn HERE trong trường nhãn của chương trình 2.1. Một nhãn bất kỳ tham chiếu đến một lệnh phải có dấu hai chấm (:) đứng ở sau. Trong câu lệnh nhảy ngắn SJMP thì 8051 được ra lệnh ở lại trong vòng lặp
  5. trình. Trong trường hợp của chương trình này là mã 7D để chuyển một toán hạng vào R5. Khi thực hiện mã lệnh CPU nạp giá trị 25 vào bộ đếm chương trình được tăng lên để chỉ đến 0002 (PC = 0002) có chứa mã lệnh 7F là mã của lệnh chuyển một toán hạng vào R7 “MOV R7, ”. 2. Khi thực hiện mã lệnh 7F thì giá trị 34H được chuyển vào R7 sau đó PC được tăng lên 0004. 3. Ngăn nhớ 0004 chứa mã lệnh của lệnh “MOV A, #0”. Lệnh này được thực hiện và bây giờ PC = 0006. Lưu ý rằng tất cả các lệnh trên đều là những lệnh 2 byte, nghĩa là mỗi lệnh chiếm hai ngăn nhớ. 4. Bây giờ PC = 0006 chỉ đến lệnh kế tiếp là “ADD A, R5”. Đây là lệnh một byte, sau khi thực hiện lệnh này PC = 0007. 5. Ngăn nhớ 0007 chứa mã 2F là mã lệnh của “ADD A, R7”. Đây cũng là lệnh một byte, khi thực hiện lệnh này PC được tăng lên 0008. Qúa trình này cứ tiếp tục cho đến khi tất cả moi lệnh đều được nạp và thực hiện. Thực tế mà bộ đếm chương trình chỉ đến lệnh kế tiếp cần được thực hiện giải thích tại sao một số bộ vi xử lý (đáng nói là × 86) gọi bộ đếm là con trỏ lệnh (Instruction Pointer). 2.4.5 Bản đồ nhớ ROM trong họ 8051. Như ta đã thấy ở chương trước, một số thành viên họ 8051 chỉ có 4k byte bộ nhớ ROM trên chíp (ví dụ 8751, AT 8951) và một số khác như AT 8952 có 8k byte ROM, DS 5000-32 của Dallas Semiconductor có 32k byte ROM trên chíp. Dallas Semiconductor cũng có motọ 8051 với ROM trên chíp là 64k byte. Điểm cần nhớ là không có thành viên nào của họ 8051 có thể truy cập được hơn 64k byte mã lệnh vì bộ đếm chương trình của 8051 là 16 bit (dải địa chỉ từ 0000 đến FFFFH). Cần phải ghi nhớ là lệnh đầu tiên của ROM chương trình đều đặt ở 0000, còn lệnh cuối cùng phụ thuộc vào dung lượng ROM trên chíp của mỗi thành viên họ 8051. Trong số các thành viên họ 8051 thì 8751 và AT 8951 có 4k byte ROM trên chíp. Bộ nhớ ROM trên chíp này có các địa chỉ từ 0000 đến 0FFFH. Do vậy, ngăn nhớ đầu tiên có địa chỉ 0000 và ngăn nhớ cuối cùng có địa chỉa 0FFFH. Hãy xét ví dụ 2.1. Ví dụ 2.1: Tìm địa chỉ bộ nhớ ROM của mỗi thành viên họ 8051 sau đây. a) AT 8951 (hoặc 8751) với 4k byte b) DS 5000-32 với 32k byte Lời giải: a) Với 4k byte của không gian nhớ ROM trên chíp ta có 4096 byte bằng 1000H ở dạng Hex (4 × 1024 = 4096 hay 1000 ở dạng Hex). Bộ nhớ này được xắp xếp trong các ngăn nhớ từ 0000 đến 0FFFH. Lưu ý 0 luôn là ngăn nhớ đầu tiên.
  6. DATA3: DB 39H ; Số dạng Hex ORG 510H DATA4: DB “2591” ; Các số ASCII ORG 518H DATA5 DB “My name is Joe” ; Các ký tự ASCII Các chuỗi ASCII có thể sử dụng dấu nháy đơn ‘như thế này’ hoặc nháy kép “như thế này”. Dùng dấu phẩy kép sẽ hữu ích hơn đối với trường hợp dấu nháy đơn được dùng sở hữu cách như thế này “Nhà O’ Leary”. Chỉ lệnh DB cũng được dùng để cấp phát bộ nhớ theo từng đoạn kích thước một byte. 2.5.3 Các chỉ lệnh của hợp ngữ. 1. Chỉ lệnh ORG: Chỉ lệnh ORG được dùng để báo bắt đầu của địa chỉ. Số đi sau ORG có kể ở dạng Hex hoặc thập phân. Nếu số này có kèm chữ H đằng sau thì là ở dạng Hex và nếu không có chữ H ở sau là số thập phân và hợp ngữ sẽ chuyển nó thành số Hex. Một số hợp ngữ sử dụng dấu chấm đứng trước “ORG” thay cho “ORG”. Hãy đọc kỹ về trình hợp ngữ ta sử dụng. 2. Chỉ lệnh EQU: Được dùng để định nghĩa một hằng số mà không chiếm ngăn nhớ nào. Chỉ lệnh EQU không dành chỗ cất cho dữ liệu nhưng nó gắn một giá trị hằng số với nhãn dữ liệu sao cho khi nhãn xuất hiện trong chương trình giá trị hằng số của nó sẽ được thay thế đối với nhãn. Dưới đây sử dụng EQU cho hằng số bộ đếm và sau đó hằng số được dùng để nạp thanh ghi RS. COUNT EQU 25 MOV R3, #count Khi thực hiện lện “MOV R3, #COUNT” thì thanh ghi R3 sẽ được nạp giá trị 25 (chú ý đến dấu #). Vậy ưu điểm của việc sử dụng EQU là gì? Giả sử có một hằng số (một giá trị cố định) được dùng trong nhiều chỗ khác nhau trong chương trình và lập trình viên muốn thay đổi giá trị của nó trong cả chương trình. Bằng việc sử dụng chỉ lệnh EQU ta có thể thay đổi một số lần và hợp ngữ sẽ thay đổi tất cả mọi lần xuất hiện của nó là tìm toàn bộ chương trình và gắng tìm mọi lần xuất hiện. 3. Chỉ lệnh END: Một lệnh quan trọng khác là chỉ lệnh END. Nó báo cho trình hợp ngữ kết thúc của tệp nguồn “asm” chỉ lệnh END là dòng cuối cùng của chương trình 8051 có nghĩa là trong mã nguồn thì mọi thứ sau chỉ lệnh END để bị trình hợp ngữ bỏ qua. Một số trình hợp ngữ sử dụng .END có dấu chấm đứng trước thay cho END. 2.5.4 Các quy định đố với nhãn trong hợp ngữ. Bằng cách chọn các tên nhãn có nghĩa là một lập trình viên có thể làm cho chương trình dễ đọc và dễ bảo trì hơn, có một số quy định mà các tên nhãn
  7. 1 0 2 10H - 17H 1 1 3 18H - 1FH Hình 2.4: Các bit của thanh ghi PSW Dưới đây là giải thích ngắn gọn về 4 bit cờ của thanh ghi PSW. 1. Cờ nhớ CY: Cờ này được thiết lập mỗi khi có nhớ từ bit D7. Cờ này được tác động sau lệnh cộng hoặc trừ 8 bit. Nó cũng được thiết lập lên 1 hoặc xoá về 0 trực tiếp bằng lệnh “SETB C” và “CLR C” nghĩa là “thiết lập cờ nhớ” và “xoá cờ nhớ” tương ứng. Về các lệnh đánh địa chỉ theo bit được bàn kỹ ở chương 8. 2. Cờ AC: Cờ này báo có nhớ từ bit D3 sang D4 trong phép cộng ADD hoặc trừ SUB. Cờ này được dùng bởi các lệnh thực thi phép số học mã BCD (xem ở chương 6). 3. Cờ chẵn lẻ P: Cờ chẵn lẻ chỉ phản ánh số bit một trong thanh ghi A là chẵn hay lẻ. Nếu thanh ghi A chứa một số chẵn các bit một thì P = 0. Do vậy, P = 1 nếu A có một số lẻ các bit một. 4. Cờ chàn OV: Cờ này được thiết lập mỗi khi kết quả của một phép tính số có dấu quá lớn tạo ra bit bậc cao làm tràn bit dấu. Nhìn chung cờ nhớ được dùng để phát hiện lỗi trong các phép số học không dấu. Còn cờ tràn được dùng chỉ để phát hiện lỗi trong các phép số học có dấu và được bàn kỹ ở chương 6. 2.6.2 Lệnh ADD và PSW. Bây giờ ta xét tác động của lệnh ADD lên các bit CY, AC và P của thanh ghi PSW. Một số ví dụ sẽ làm rõ trạng thái của chúng, mặc dù các bit cờ bị tác động bởi lệnh ADD là CY, P, AC và OV nhưng ta chỉ tập trung vào các cờ CY, AC và P, còn cờ OV sẽ được nói đến ở chương 6 vì nó liên quan đến phép tính số học số có dấu. Các ví dụ 2.2 đến 2.4 sẽ phản ánh tác động của lệnh ADD lên các bit nói trên. Bảng 2.1: Các lệnh tác động lên các bit cờ. Ví dụ 2.2: Hãy trình bày trạng thái các bit cờ CY, AC và P sau lệnh cộng 38H với 2FH dưới đây: MOV A, #38H ADD A, #2FH ; Sau khi cộng A = 67H, CY = 0 Lời giải: 38 00111000 + 2F 00101111 67 01100111
  8. 1. Tổng cộng 32 byte từ ngăn nhớ 00 đến 1FH được dành cho các thanh ghi và ngăn xếp. 2. Tổng cộng 16 byte từ ngăn nhớ 20H đến 2FH được dành cho bộ nhớ đọc/ ghi đánh địa chỉ được theo bit. Chương 8 sẽ bàn chi tiết về bộ nhớ và các lệnh đánh địa chỉ được theo bit. 3. Tổng cộng 80 byte từ ngăn nhớ 30H đến 7FH được dùng cho lưu đọc và ghi hay như vẫn thường gọi là bảng nháp (Serach pad). Những ngăn nhớ này (80 byte) của RAM được sử dụng rộng rãi cho mục đích lưu dữ liệu và tham số bởi các lập trình viên 8051. Chúng ta sẽ sử dụng chúng ở các chương sau để lưu dữ liệu nhận vào CPU qua các cổng vào-ra. 2.7.2 Các băng thanh ghi trong 8051. Như đã nói ở trước, tổng cộng 32 byte RAM được dành riêng cho các băng thanh ghi và ngăn xếp. 32 byte này được chia ra thành 4 băng các thanh ghi trong đó mỗi băng có 8 thanh ghi từ R0 đến R7. Các ngăn nhớ RAM số 0, R1 là ngăn nhớ RAM số 1, R2 là ngăn nhớ RAM số 2 v.v Băng thứ hai của các thanh ghi R0 đến R7 bắt đầu từ thanh nhớ RAM số 2 cho đến ngăn nhớ RAM số 0FH. Băng thứ ba bắt đầu từ ngăn nhớ 10H đến 17H và cuối cùng từ ngăn nhớ 18H đến 1FH là dùng cho băng các thanh ghi R0 đến R7 thứ tư. 00 R0 - R7 07 08R0 - R7 0F10R0 - R7 1718R0 - R7 RAM1F 20 đ ánh RAM 2F 30bă ng địa chỉ theo nhớ bit (Seratch Pad) Băng0 Hình 2.5: Ngăn xếp các thanh nhớ RAM trong 8051. Bank 0 Bank 1 Bank 2 Bank 3 7 R7 F R7 1 R7 1F R7 6 R6 E R6 1 R6 1E R6 5 R5 D R5 1 R5 1D R5 4 R4 C R4 1 R4 1C R4 3 R3 B R3 1 R3 1B R3 2 R2 A R2 1 R2 1A R2 1 R1 9 R1 1 R1 19 R1 0 R0 8 R0 1 R0 18 R0 Hình 2.6: Các băng thanh ghi của 8051 và địa chỉ của chúng.
  9. MOV 02, #3FH ; Nạp thanh ghi R2 giá trị 3FH MOV 07, #63H ; Nạp thanh ghi R7giá trị 63H MOV 05, #12H ; Nạp thanh ghi R5 giá trị12H 2.6.4 Chuyển mạch các băng thanh ghi như thế nào? Như đã nói ở trên, băng thanh ghi 0 là mặc định khi 8051 được cấp nguồn. Chúng ta có thể chuyển mạch sang các băng thanh ghi khác bằng cách sử dụng bit D3 và D4 của thanh ghi PSW như chỉ ra theo bảng 2.2. Bảng 2.2: Bit lựa chọn các băng thanh ghi RS0 và RS1. RS1 (PSW.4) RS0 (PSW.3) Băng 0 0 0 Băng 1 0 1 Băng 2 1 0 Băng 3 1 1 Bit D3 và D4 của thanh ghi PSW thường được tham chiếu như là PSW.3 và PSW.4 vì chúng có thể được truy cập bằng các lệnh đánh địa chỉ theo bit như SETB và CLR. Ví dụ “SETB PSW.3” sẽ thiết lập PSW.3 và chọn băng thanh ghi 1. Xem ví dụ 2.7 dưới đây. Ví dụ 2.7: Hãy phát biểu nội dung các ngăn nhớ RAM sau đoạn chương trình dưới đây: SETB PSW.4 ; Chọn băng thanh ghi 4 MOV R0, #99H ; Nạp thanh ghi R0 giá trị 99H MOV R1, #85H ; Nạp thanh ghi R1 giá trị 85H MOV R2, #3FH ; Nạp thanh ghi R2 giá trị 3FH MOV R7, #63H ; Nạp thanh ghi R7giá trị 63H MOV R5, #12H ; Nạp thanh ghi R5 giá trị12H Lời giải: Theo mặc định PSW.3 = 0 và PSW.4 = 0. Do vậy, lệnh “SETB PSW.4” sẽ bật bit RS1 = 1 và RS0 = 0, bằng lệnh như vậy băng thanh ghi R0 đến R7 số 2 được chọn. Băng 2 sử dụng các ngăn nhớ từ 10H đến 17H. Nên sau khi thực hiện đoạn chương trình trên ta có nội dung các ngăn nhớ như sau: Ngăn nhớ vị trí 10H có giá trị 99H Ngăn nhớ vị trí 11H có giá trị 85H Ngăn nhớ vị trí 12H có giá trị 3FH Ngăn nhớ vị trí 17H có giá trị 63H Ngăn nhớ vị trí 15H có giá trị 12H
  10. 0A 0A 0A 0A F3 09 09 09 12 09 12 08 08 25 08 25 08 25 Bắt đầu SP = SP = 08 SP = 09 SP = 0A 07 2.6.8 Lấy nôi dung thanh ghi ra từ ngăn xếp. Việc lấy nội dung ra từ ngăn xếp trở lai thanh ghi đã cho là qúa trình ngược với các nội dung thanh ghi vào ngăn xếp. Với mỗi lần lấy ra thì byte trên đỉnh ngăn xếp được sao chép vào thanh ghi được xác định bởi lệnh và con trỏ ngăn xếp được giảm xuống 1. Ví dụ 2.9 minh hoạ lệnh lấy nội dung ra khỏi ngăn xếp. Ví dụ 2.9: Khảo sát ngăn xếp và hãy trình bày nội dung của các thanh ghi và SP sau khi thực hiện đoạn chương trình sau đây: POP 3 ; Lấy ngăn xếp trở lại R3 POP 5 ; Lấy ngăn xếp trở lại R5 POP 2 ; Lấy ngăn xếp trở lại R2 Lời giải: Sau POP3 Sau POP 5 Sau POP 2 0B 54 0B 0B 0B 0A F9 0A F9 0A 0A 09 76 09 76 09 76 09 08 6C 08 6C 08 6C 08 6C Bắt đầu SP = SP = 0A SP = 09 SP = 08 0B 2.6.9 Giới hạn trên của ngăn xếp. Như đã nói ở trên, các ngăn nhớ 08 đến 1FH của RAM trong 8051 có thể được dùng làm ngăn nhớ 20H đến 2FH của RAM được dự phòng cho bộ nhớ đánh địa chỉ được theo bit và không thể dùng trước cho ngăn xếp. Nếu trong một chương trình đã cho ta cần ngăn xếp nhiều hơn 24 byte (08 đến 1FH = 24 byte) thì ta có thể đổi SP chỉ đến các ngăn nhớ 30 đến 7FH. Điều này được thực hiển bởi lẹnh “MOV SP, #XX”. 2.6.10 Lệnh gọi CALL và ngăn xếp. Ngoài việc sử dụng ngăn xếp để lưu cất các thanh ghi thì CPU cũng sử dụng ngăn xếp để lưu cất tam thời địa chỉ của lệnh đứng ngay dưới lệnh CALL. Điều này chính là để PCU biết chỗ nào để quay trở về thực hiện tiếp các lệnh