Các chủ đề
zSốhọc các sốcó dấu và sốkhông dấu
zCác sốnhịphân và mã BCD
zCác lệnh cộng
zPhép trừ
zPhép nhân
zPhép chia
zCác phép toán Logic
zCác phép Quay và hoán đổi
zBộnhớ địa chỉhoá Bit và các lệnh trên bit đơn
23 trang |
Chia sẻ: Mr Hưng | Lượt xem: 1310 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Lập trình 8051 số học và lô gic, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
DCE
LẬP TRÌNH 8051
SỐ HỌC VÀ LÔ GIC
Microcontroller
Chapter 4
Ngo Nhu Khoa
Department of Computer Engineering
ThaiNguyen University of Technology
10/1/2005 2 DCE
Các chủ đề
z Số học các số có dấu và số không dấu
z Các số nhị phân và mã BCD
z Các lệnh cộng
z Phép trừ
z Phép nhân
z Phép chia
z Các phép toán Logic
z Các phép Quay và hoán đổi
z Bộ nhớ địa chỉ hoá Bit và các lệnh trên bit đơn
10/1/2005 3 DCE
1. Phép cộng không dấu
z Cú pháp
add a, source ; A = A + source
– Giá trị nhớ (nếu có) sẽ đặt trong cờ CY
mov A, #0F5H
add A, #0BH ; A = F5 + B0 = 00, CY=1
z Phép cộng các số 16 bit
addc A, source ; A = A + source + CY
– Cộng 2 byte thấp bằng lệnh add
– Lưu lại kết quả
– Cộng 2 byte cao bằng lệnh addc
10/1/2005 4 DCE
1. Phép cộng không dấu ...
z Ví dụ phép cộng các số 16 bit
Cộng UUVV và PPQQ
clr C
mov A, QQ
add A, VV
mov r6, A
mov A, PP
addc A, UU
mov r7, A
Kết quả là số 16 bit đặt trong các thanh ghi R7:R6 và
CY
10/1/2005 5 DCE
2. Cộng các số BCD
z BCD – Binary Coded Decimal
– 4 bits được sử dụng để mô tả 1 số hệ 10 từ 0-9
z Gói BCD chứa 2 số BCD trong 1 Byte
– 17 PBCD = 17decimal = 11hex
z Phép cộng gói BCD có thể không là 1 số BCD hợp lệ.
Do đó người ta phải sử dụng lệnh hiệu chỉnh thập
phân (da A) để sửa lại
z Sau phép cộng 2 gói BCD, gọi da để nhận được
PBCD đúng
mov A, #47H ; first BCD = 47d
mov B, #25H ; second BCD = 25d
add A,B ; A = 6CH (binary addition of 47H and 25H)
da A ; A = 72H (BCD result of addition)
10/1/2005 6 DCE
2. Cộng các số BCD ...
z Để hiệu chỉnh 1 số BCD không hợp lệ, cộng 6 với chữ
số mà lớn hơn 9
z Cơ chế thực hiện của lệnh da
– Nếu nibble thấp > 9 hay AC=1 thì cộng 6 (0110) với nibble
thấp
– Nếu nibble cao > 9 hay CY=1 thì cộng 6 với nibble cao
z Chú ý:
da chỉ có hiệu lực đối với lệnh ADD. Với các lệnh khác (inc,
sub, ...), thì sự hiệu chỉnh này phải được thực hiện bằng tay.
10/1/2005 7 DCE
3. Phép trừ không dấu
z Cú pháp:
subb x, y ; x = x-y with borrow from CY
z Thực hiện:
– Lấy số bù 2 của số trừ (y)
– Cộng nó với số bị trừ (x)
– Đảo bit cờ nhớ
z Nếu cờ CY được lập sau phép trừ, thì kết quả là số âm
với giá trị tuyệt đối là số bù 2 của kết quả
z Chú ý:
– Lệnh subb thực hiện trừ có nhớ, nếu CY được lập trước khi
gọi lệnh. đặc điểm này được sử dụng cho phép trừ các số
16bit
– Để nhận được thông thường, phải xoá cờ CY trước khi gọi
lệnh subb
10/1/2005 8 DCE
3. Phép trừ không dấu ...
z Ví dụ
clr c ; xoá cờ CY cho phép trừ
mov A, #4CH ;
subb A, #6EH ; hai toán hạng, thực hiện: 4C – 6E
jnc done ; nếu CY= 0 kết qủa là số dương
cpl A ; CY=1, kết quả là số âm $ đảo bit giá trị chứa trong A
inc A ; và cộng thêm 1
done: mov R1, A ; kết quả cuối cùng đặt trong R1
z Trừ 2 số 16 bit: 2762H – 1296H
clr C ; xóa CY
mov A, #62H ;
subb A, #96H ; 62H – 96H = CCH và CY=1
mov R7, A ; lưu byte thấp của kết quả vào R7
mov A, #27H ; trừ các byte cao
subb A, #12H ; 27H – 12H - 1 = 14H
mov R6, A ; lưu byte cao KQ vào R6; 16 bit KQ đặt trong R6:R7
10/1/2005 9 DCE
4. Phép nhân và phép chia
z MUL AB ; A x B, kết quả đặt trong BA
mov A, #25H ; operand1: 25H
mov B, #65H ; operand2: 65H
mul AB ; 25H * 65H = E99H ; B = 0EH, A = 99H
z DIV AB ; A/B, đặt thương trong A số dư trong B
mov A, #95H
mov B, #10
div AB ; A = 9 (thương - quotient), B = 5 (dư - remainder)
10/1/2005 10 DCE
5.1. Các số có dấu – Khái niệm
z Biểu diễn dấu
– Chỉ dùng 1 bit trong số tất cả các bit biểu diễn cho các số
– Thường là MSB (most significant bit) được gán làm bít dấu
– Các bit còn lại biểu diễn độ lớn của số - magnitude
z 8051 chỉ có các thanh ghi 8-bit
– Chỉ có thể dùng 7 bit để biểu diễn độ lớn các số có dấu
– Các số dương trong 8051 = 0 đến +127 (7 bits)
– Các số âm: từ -128 đến –1
10/1/2005 11 DCE
5.2. Các số có dấu – Số âm
z Biểu diễn số âm trong số học các số có dấu như sau:
– Bit dấu (MSB) được lập là 1
– Độ lớn là 1 dạng của số bù 2
z Các ví dụ
Biểu diễn: –5
5 = 0000 0101
Cpl = 1111 1010
+1 = 1111 1011
Hex = FBH
Vậy: –5 = FBh
Biểu diễn: –34H
34H = 0011 0100
Cpl = 1100 1011
+1 = 1100 1100
Hex = CCH
Vậy: –34H = CCH
Biểu diễn: –128
128 = 1000 0000
Cpl = 0111 1111
+1 = 1000 0000
Hex = 80H
Vậy: –128 = 80H
Khoảng
-128 = 80H
-127 = 81H
..
-1 = FFH
0 = 00H
1 = 01H
+127 = 7FH
10/1/2005 12 DCE
5.3. Các số có dấu – Sử dụng
z Các ứng dụng trong thực tế có thể yêu cầu 1 giá trị xác
định được biểu diễn như 1 số có dấu
– Đo nhiệt độ:–20deg, +10deg vv
– Đo mức Nước/Gas/Beer trong bể chứa
z Dữ liệu được thu nhận và lưu trữ như là 1 mảng các
số có dấu
– Một số phần tử trong mảng có thể là âm, trong khi các phần tử
khác lại là số dương
– Việc nhận diện số âm nhờ MSB. Nếu MSB=1, số đó là âm
z Cùng các phép toán (add, sub, mul, div vv) có thể cần
thiết được thực hiện trên các phần tử của mảng và kết
quả cũng có thể là số dương hoặc âm.
10/1/2005 13 DCE
6. 8051 – Số học các số có dấu
z 8051 sử dụng sự biểu diễn số âm trong lệnh trừ
(subb). Tuy nhiên, như thế chưa đủ!
z Khi các số có dấu được sử dụng, thì người lập trình
phải quan tâm đến số học các số có dấu.
z Sự tràn số phải được đề cập đến. Cờ nhớ là chưa đủ,
vì chỉ có 7 bit để biểu diễn giá trị của các số có dấu.
z Do đó, 8051 còn cung cấp 1 cờ khác, đó là cờ tràn –
OV cho mục đích này.
10/1/2005 14 DCE
6. 8051 – Số học các số có dấu ...
z Phép cộng A+B A = 01H, B = FFH
A = +1, B = -1
A = 0000 0001
B = 1111 1111
+ = 1 0000 0000
A+B = 0H
A+B A = FEH, B = FFH
A = -2, B = -1
A = 1111 1110
B = 1111 1111
+ = 1 1111 1101
A+B = FDH = -3
A-B; A = FEH, B = 01H
A = -2, B = +1
2’s(B) = 1111 1110 +1 = 1111 1111
A = 1111 1110
2’s(B) = 1111 1111
+ = 1 1111 1101
A-B = FDH = -3
A-B; A = 01H, B = FFH
A = +1, B = -1
2’s(B) = 0000 0000 +1 = 0000 0001
A = 0000 0001
2’s(B) = 0000 0001
+ = 0 0000 0010
A-B = 02H
z Phép trừ
10/1/2005 15 DCE
6. 8051 – Số học các số có dấu
z Sự tràn có thể xảy ra do độ lớn của các số có dấu, mà
nó có thể làm thay đổi bit dấu.
z Cờ OV được kiểm tra để xác định lỗi xảy ra trong số
học các số có dấu.
z Ví dụ
A+B, A=+96 (60H), B=+70(46H)
A = 0110 0000
B = 0100 0110
+ = 1010 0110 = A6H = -90 (wrong)
OV = 1, CY=0
96+70 = 166 > +127
10/1/2005 16 DCE
6. 8051 – Cờ tràn
z Sau các phép toán số học, OV được lập nếu:
– Nhớ từ D6 sang D7, nhưng không nhớ từ D7
– Nhớ từ D7 nhưng không nhớ từ D6 sang D7
– Các trường hợp trên chỉ thỉ 1 kết quả sai trong khi 8051 thực
hiện các phép toán với số có có dấu.
z Sau một lệnh số học liên quan đến các số có dấu,
kiểm tra cờ OV, để xác định lỗi
– Sử dụng lệnh jb PSW.2 hay jnb PSW.2
– PSW.2 = OV
10/1/2005 17 DCE
7. 8051 Các lệnh logic
z AND
– anl dest, source ; dest = dest AND source
– Thường sử dụng làm mặt nạ để che đi(set to 0) 1 vài bit trong 1 toán
hạng
z OR
– orl dest, source ; dest = dest OR source
– Commonly used to set a few bits in an operand
z XOR
– xrl dest, source ; dest = dest XOR source
– Commonly used to clear a register, check if two registers have the
same value and toggle a few bits
z Complement
– cpl A ; A = A’
z None of these instructions affect any flags
10/1/2005 18 DCE
8. 8051 – Lệnh so sánh
z CJNE
– Cjne dest, source, rel address
– So sánh đích (dest) với nguồn (source), và nhảy đến địa chỉ
quan hệ (relative address) nếu không bằng nhau
– Về cơ bản, 1 phép trừ mà không làm thay đổi các toán hạng,
nhưng lại tác động đến cờ CY:
– dest > source CY=0
– dest < source CY=1
z Ví dụ
– Kiểm soát liên tục P1
– và chỉ thoát, nếu:P1=63H
Cmp: cjne R5, #80, NEQ
EQ: . ;R5= #80
NEQ: jnc GREAT
LESS: ;R5< #80
GREAT: . ;R5 > #80
Loop: mov A, P1
cjne A, #63, loop
10/1/2005 19 DCE
9. 8051 – Hoán đổi và Quay
z Thao tác quay Bitwise được yêu cầu trong nhiều ứng
dụng, như truyền thông nối tiếp, điều khiển, ....
z Quay phải
– rr A ; rotate right A
z Quay trái
– rl A ; rotate left A
z Quay phải/trái có nhớ
– Sử dụng CY trong phép quay (9 bit rotate) theo thứ tự sau:
– rlc A ; D7 CY D0
– rrc A ; D0 CY D7
z Hoán đổi các nibble
– swap A ; Hoán đổi D7-D4 với D3-D0
Example for RR
mov A, #AAH
rr A ; now A = 55H
rr A ; now A = 2AH
Example for RL
mov A, #55H
rl A ; now A = AAH
rl A ; now A = 54H
10/1/2005 20 DCE
10. 8051 – Các lệnh Bit đơn
z Lập bit
– set bit_name ;bit = 1
z Xoá bit
– clr bit_name ;bit = 0
z Đảo bit
– cpl bit_name ;bit = bit’
z Lệnh nhảy có điều kiện trên giá trị của bit
– jb (jump if bit=1)
– jnb (jump if bit=0)
– jbc (jump if bit=1 and clear the bit)
10/1/2005 21 DCE
11. Bit addressable Regs and Memory
z Các cổng I/O (P0 – P3), B, PSW, IP, IE, ACC, SCON và
TCON là các thah ghi cókhả năng địa chỉ hoá theo Bit
(BARs)
z Các bit của BARs có thể được tham chiếu đến theo cú pháp
Register.bitnum (P0.1, PSW.2, IE.4 vv) hay bởi địa chỉ của
chúng
z Địa chỉ Bit là địa chỉ cơ sở của thanh ghi + số thứ tự Bit
– ACC địa chỉ cơ sở là E0H, do đó ACC.1=E1H, ACC.7=E7H
– P0, địa chỉ cơ sở là 80H, do đó P0.0=80H, P0.5=84H ...
z 16 bytes của bộ nhớ RAM nội cũng được địa chỉ hoá Bit
– 20H đến 2FH có 1 địa chỉ bit từ 00H đến 7FH
– clr 67H ; xoá D7H của RAM tại vị trí 2CH
– setb 05H ; lập bit 5 của RAM, tại vị trí 20H
10/1/2005 22 DCE
12. Các lệnh đơn bit với cờ nhớ CY
z 8051 có các lệnh đặc biệt để thao tác trực tiếp với cờ
nhớ CY
– setb C; clr C; cpl C; mov b,C; mov C,b; jnc, jc, anl C,b; anl
C,/b; orl C,b; orl C,/b
– anl C, /b ;C = CY AND b’
z Ví dụ: Bật quạt (P2.2) và ngắt đèn (P2.3)
Fan_on: setb C
orl C,P2.2 ;CY = CY OR P2.2
mov P2.2, C ; bật quạt nếu nó chưa thực sự bật
Light_off: clr C
anl C,P2.3 ;CY = CY AND P2.3
mov P2.3,C ; tắt đèn, nếu nó chưa thực sự tắt
10/1/2005 23 DCE
Chương 4: Ôn tập
z Số học các số có dấu và không dấu
z Các số nhị phân và mã BCD
z Phép cộng, trừ, nhân và chia
z Số học và biểu diễn số có dấu
z Các phép toán Logic
z Các lệnh quay và hoán đổi
z Vùng nhớ địa chỉ hoá Bit và các lệnh tác động đơn bit
Các file đính kèm theo tài liệu này:
- chap4_8051_programming_arithmetic_988.pdf