You are on page 1of 46

NHÓM LỆNH RẼ NHÁNH

- GỌI CHƢƠNG TRÌNH CON

- KẾT THÚC CHƢƠNG TRÌNH CON

- KẾT THÚC CHƢƠNG TRÌNH PHỤC VỤ NGẮT

- NHẢY KHÔNG ĐIỀU KIỆN

- NHẢY CÓ ĐIỀU KIỆN

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH GỌI CHƢƠNG TRÌNH CON
Khái niệm
Gọi chƣơng trình con
MAIN: ...
CALL SUBLABEL
...
...
SUBLABEL: ...
...
RET Chƣơng trình con

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH GỌI CHƢƠNG TRÌNH CON
ACALL <addr_11>
LCALL <addr_16>

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Lệnh ACALL <addr_11>
- Lệnh này gọi không điều kiện một chương trình con có địa chỉ nằm trong
phạm vi cùng một trang 2K với PC lệnh kế.
- Thao tác thực thi lệnh:
PC  PC + 2
SP  SP + 1
(SP)  PC 7÷0
SP  SP + 1
(SP)  PC 15÷8
PC  page-addr_addr11
- Các cờ không bị ảnh hưởng.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Ví dụ
Giả sử ban đầu SP = 07, nhãn SUBRTN đặt tại vị trí 0345H của bộ nhớ
chƣơng trình và lệnh ACALL đặt tại địa chỉ 0123H. Xem sự thay đổi của các
thanh ghi bị tác động sau lệnh: ACALL SUBRTN

- Thao tác thực thi lệnh: - Lệnh ACALL tại địa chỉ 0123H, và
PC  PC + 2 lệnh này là 2byte.
SP  SP + 1  PC =PC + 2 = 0125H,
(SP)  PC 7÷0 PC 7÷0 = DPL = 25H
SP  SP + 1 PC 15÷8 = DPH = 01H.
(SP)  PC 15÷8  SP = SP + 1 = 08  (08) = 25H
PC  page-addr_addr11  SP = SP + 1 = 09  (09) = 01H
 PC = addr(SUBRTN) = 0345H

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Lệnh LCALL <addr_16>
- Lệnh này gọi không điều kiện một chương trình con có địa chỉ được đặt ở
bất kỳ vị trí nào trong bộ nhớ chương trình.
- Thao tác thực thi lệnh:
PC  PC + 3
SP  SP + 1
(SP)  PC 7÷0
SP  SP + 1
(SP)  PC 15÷8
PC  addr16
- Các cờ không bị ảnh hưởng.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH KẾT THÚC CHƢƠNG TRÌNH CON
RET

- Lệnh trở về từ chương trình con.


- Lệnh này sẽ lấy lại giá trị các byte cao và byte thấp của PC từ vùng stack.
Việc thực thi chương trình được tiếp tục với lệnh ở địa chỉ chứa trong PC.
- Các cờ không bị ảnh hưởng.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Tóm lại
CALL & RET (RETURN)

ACALL: 2K
CALL
LCALL: 64K

Thao tác tƣơng tự nhƣ một lệnh nhảy


ACALL <address ll bit> ; stack  PC (Push PC)
; PC  address 11 bit
LCALL <address 16bit> ; stack  PC (Push PC)
; PC  address 16 bit
RET ; PC  stack (Pop PC)

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH K.THÚC TRÌNH PHỤC VỤ NGẮT
RETI

- Lệnh trở về từ chương trình phục vụ ngắt.


- Lệnh này sẽ lấy lại giá trị các byte cao và byte thấp của PC từ vùng stack,
phục hồi logic ngắt để có thể nhận các ngắt khác có cùng ưu tiên với ngắt
vừa được xử lý. Không có thanh ghi nào khác bị ảnh hưởng, PSW không
được tự động phục hồi trở lại trạng thái trước khi xử lý ngắt.
- Việc thực thi chương trình được tiếp tục với lệnh ở địa chỉ chứa trong PC.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH NHẢY KHÔNG ĐIỀU KIỆN

Các lệnh này chuyển việc thực thi chương trình đến địa chỉ được chỉ
ra trong lệnh.
SJMP : 8-bit offset

JMP AJMP : 11-bit address (2KB segment)

LJMP : 16-bit

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH NHẢY CÓ ĐIỀU KIỆN TRÊN BIT

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Tóm tắt điều kiện nhảy đối với các bit
JZ Nhảy nếu A = 0
JNZ Nhảy nếu A ≠ 0
JC Nhảy nếu CY = 1
JNC Nhảy nếu CY = 0
JB bit Nhảy nếu bit = 1
JNB bit Nhảy nếu bit = 0
JBC bit Nhảy nếu bit = 1 và xóa bit

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH NHẢY CÓ ĐIỀU KIỆN
CJNE <Op1_byte>, <Op2_byte>, rel

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH NHẢY CÓ ĐIỀU KIỆN
CJNE <Op1_byte>, <Op2_byte>, rel
- So sánh và nhảy nếu không bằng.
- Lệnh này so sánh giá trị của 2 toán hạng đầu tiên
(<Op1_byte>&<Op2_byte>) và rẽ nhánh nếu các giá trị của 2 toán hạng
không bằng nhau.
- Địa chỉ rẽ nhánh đến được xác định bằng cách cộng độ dời tương đối
(offset = rel) với PC lệnh kế.
- Cờ nhớ CY được set lên 1 nếu giá trị nguyên không dấu của toán hạng
<Op1_byte> nhỏ hơn giá trị nguyên không dấu của toán hạng
<Op2_byte>, ngược lại cờ nhớ bị xóa.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Một số ký hiệu hoặc chỉ dẫn thường sử dụng
1. Chỉ dẫn ORG & END
ORG : thay đổi nội dung PC đến vị trí mới cho các lệnh theo sau.
VD: ORG 1000H hoặc ORG ($+1000H) AND 0FF00H
END: phát biểu cuối chƣơng trình, các lệnh theo sau sẽ không đƣợc xử lý bởi
trình dịch hợp ngữ.

2. $ : tham chiếu đến giá trị hiện hành của PC.


VD: SJMP $  LOOP: SJMP LOOP
CJNE A, direct, $+3  CJNE A,direct, LOOP
LOOP:…….

3. EQU : gán giá trị tƣơng ứng cho tên đƣợc định nghĩa.
VD: SW0 EQU P1.0
CS1 EQU 2000H

4. DB: định nghĩa các byte data trong bộ nhớ chƣơng trình
VD: SQUARES: DB 0,1,4,9,16,25
MESSAGE: DB „WORD‟
 “WORD”
 „W‟,‟O‟,‟R‟,‟D‟

5. HIGH,LOW: lấy byte cao hoặc byte thấp của toán hạng
VD: MOV A,#HIGH 1234H  MOV A,#12H
MOV B,#LOW 1234H  MOV B,#34H
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP1

N
A = 05H?
CJNE A,#05H,Skip
Y
(Statement 1)
Skip: (Continue)
Statement 1
…………..

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP1
Ví dụ: Viết chương trình thực hiện giảm giá trị của thanh ghi
DPTR đi 1. Giả sử ban đầu DPTR=0100H.
DPH  high_addr(DPTR)

DPL  low_addr(DPTR)

DPLDPL - 1

N
DPL = 0FFH?

Y
DPHDPH - 1

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP1
Ví dụ: Viết chương trình thực hiện giảm giá trị của thanh ghi
DPTR đi 1. Giả sử ban đầu DPTR=0100H.
DPH  01H

MOV DPH,#01H
MOV DPL,#00H DPL  00H
DEC DPL
MOV A,DPL DPLDPL - 1
CJNE A,#0FFH,EXIT
DEC DPH N
DPL = 0FFH?
EXIT: NOP

Y
DPHDPH - 1

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP1

Statement 1 …………..
Again:
(Statement 1)
N
A = 05H? CJNE A,#05H,Again
(Continue)
Y …………..

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP1
Ví dụ: Viết chương trình ghi giá trị 40H vào RAM nội bắt đầu từ
địa chỉ 30H đến 36H.
Ri  30H

(Ri)  40H

RiRi+1

N
Ri = 37H?

Y
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP1
Ví dụ: Viết chương trình ghi giá trị 40H vào RAM nội bắt đầu từ
địa chỉ 30H đến 36H.
Ri  30H

ORG 0000H
MOV R1,#30H (Ri)  40H
Again:
MOV @R1,#40H RiRi+1
INC R1
CJNE R1,#37H, Again
N
END Ri = 37H?

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh bằng/không bằng – PP2

N CJNE A,#05H,Not_Eq
A = 05H? (Statement 1)
SJMP Next
Y Not_Eq: (Statement 2)
Next: (Continue)
Statement 2 Statement 1

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh  hoặc < – PP1
CJNE A,#05H,Next
Next: JC LessThan
N
A ≥ 05H? (Statement 1)
LessThan:(Continue)
Y
Statement 1 Có thể viết lại nhƣ sau:

CJNE A,#05H,$+3
JC LessThan
(Statement 1)
LessThan:(Continue)

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Ví dụ: Viết chương trình kiểm tra nội dung của thanh ghi A.
Nếu 5 ≤ A ≤ 10 thì xuất giá trị của A ra Port 1; ngược lại
xuất A ra Port 2.
ORG 0
CJNE A,#5,$+3
JC PORT2
CJNE A,#11,$+3
JNC PORT2
MOV P1,A
SJMP DONE
PORT2: MOV P2,A
DONE: NOP
END

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
CJNE – So sánh  hoặc < – PP2

N
CJNE A,#05H,$+3
A ≥ 05H? JNC GT_Eq
(Statement 2)
Y
SJMP Next
Statement 2 Statement 1 GT_Eq: (Statement 1)
Next: (Continue)

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Bài tập
Cho hai số 8 bit, số thứ 1 chứa trong (30H), số thứ 2
chứa trong (31H). Viết CT so sánh hai số này. Nếu số
thứ 1 lớn hơn hoặc bằng số thứ 2 thì set cờ F0, nếu
ngược lại thì xóa cờ F0.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH NHẢY CÓ ĐIỀU KIỆN
DJNZ <Op>, rel

- Giảm byte của toán hạng đi 1 và nhảy nếu khác không.


- Địa chỉ rẽ nhánh đến được xác định bằng cách cộng độ dời tương đối
(offset = rel) với PC lệnh kế.
- Các cờ không bị ảnh hưởng.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
LỆNH NOP

- Lệnh này sẽ không thực hiện việc gì nhưng tốn thời gian 1MC. Việc thực
thi chương trình được tiếp tục với lệnh kế.
- Không có thanh ghi hay cờ nào bị ảnh hưởng.
- Được dùng trong các chương trình tạo thời gian trễ với những khoảng thời
gian rất nhỏ (s) để tạo các xung có tần số lớn.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
DJNZ – Sử dụng cho vòng lặp

Lặp 10 lần
MOV R7,#10
LOOP: (begin loop)


(end loop)
DJNZ R7,LOOP
(continue)

- Nếu muốn lặp 1000 lần?

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
DJNZ – Sử dụng cho vòng lặp
Viết chương trình ghi giá trị 40H vào RAM nội bắt đầu từ địa
chỉ 30H đến 36H. R5  7

ORG 0000H R1  30H


MOV R5,#7
MOV R1,#30H
(R1)  40H
Again:
MOV @R1,#40H
R1R1+1
INC R1
DJNZ R5, Again R5R5-1
END

N
R5=0?

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh Y
So sánh 2 cách viết
Viết chương trình ghi giá trị 40H vào RAM nội bắt đầu từ địa
chỉ 30H đến 36H.

ORG 0000H ORG 0000H


MOV R5,#7 MOV R1,#30H
MOV R1,#30H
Again: Again:
MOV @R1,#40H MOV @R1,#40H
INC R1 INC R1
DJNZ R5, Again CJNE R1,#37H, Again
END END

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Chƣơng trình tạo xung

P1.0  1

Delay

P1.0  0

Delay

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
ORG 0
LOOP:
SETB P1.0
P1.0  1 ACALL DELAY
CLR P1.0
ACALL DELAY
Delay
SJMP LOOP
DELAY:
P1.0  0 MOV R6,#200
DL1:
MOV R7,#250
Delay DJNZ R7,$
DJNZ R6,DL1
RET
END

 Dạng sóng? Chu kỳ? Tần số?


Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
ORG 0
LOOP:
SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP LOOP
DELAY:
MOV R6,#200 ; 1MC x 1
DL1:
MOV R7,#250 ; 1MC x1 501 MC
DJNZ R7,$ ; 2MC x 250
DJNZ R6,DL1
RET
END

DJNZ R7,$  loop: DJNZ R7, loop


Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
ORG 0
LOOP:
SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP LOOP
DELAY:
MOV R6,#200 ; 1MC x 1
DL1:
MOV R7,#250 ; 501MC x 200 100.601 MC
DJNZ R7,$
DJNZ R6,DL1 ; 2MC x 200
RET
END

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
ORG 0
LOOP:
SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP LOOP
DELAY:
MOV R6,#200
DL1:
MOV R7,#250 ;100.601MC
DJNZ R7,$ 100.603 MC
DJNZ R6,DL1
RET ; 2MC
END
Kết luận: Để thực hiện hết CT con DELAY mất một khoảng thời gian là
100.603MC.
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
ORG 0
LOOP:
SETB P1.0 ; 1MC tH
ACALL DELAY ; 2MC + 100.603MC
CLR P1.0 ; 1MC
ACALL DELAY ; 2MC + 100.603MC tL
SJMP LOOP ; 2MC
DELAY:
MOV R6,#200
DL1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
END
tH = 1+2+100.603 = 100,066 MC
tL = 1+2+100.603+2 = 100,068 MC
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
Giả sử thạch anh dùng trong mạch là 12 MHz  1 MC = 1 μs
 tH = 100.066 MC = 100.066 μs
tL = 100.068 MC = 100.068 μs
P1.0  1
 T = tH + tL = 200.134 μs
 f = 1/T = 4.99 Hz Delay tH

P1.0  0

tH tL
Delay tL
T

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
ORG 0
LOOP:
SETB P1.0
ACALL DELAY
CLR P1.0
ACALL DELAY
SJMP LOOP
DELAY:
MOV R6,#200
DL1:
MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
END
Có thể tính gần đúng
tH = tL ≈ tDELAY ≈ 200 x 250 x 2 MC = 100.000 MC
= 100.000 μs
 T ≈ 200.000 μs
 f ≈ 5 Hz
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Tổng quát cho một chƣơng trình con DELAY
DELAY:
MOV R6,#m ; 1MC x 1
DL1:
MOV R7,#n ; 1MC x1
(2n+1) x m (MC)
DJNZ R7,$ ; 2MC x n
DJNZ R6,DL1 ; 2MC x m
RET ; 2MC
Tổng chu kỳ máy thực hiện:
1 + {(2n+1) x m} + 2m + 2 = (2mn + 3m + 3) MC
Với các giá trị m,n rất lớn thì có thể tính gần đúng bằng 2mn.

Lƣu ý: CT này thường dùng cho các xung có tần số lớn, còn những tần số nhỏ
thường dùng Timer sẽ được học ở chương sau.
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Chƣơng trình tạo xung
P1.0  NOT
(P1.0)
P1.0  1 t H = tL
Delay
Delay tH
ORG 0
P1.0  0 LOOP: CPL P1.0
ACALL DELAY
SJMP LOOP
DELAY:
Delay tL MOV R6,#200
DL1: MOV R7,#250
DJNZ R7,$
DJNZ R6,DL1
RET
END
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Tạo sóng vuông 10KHz
Viết chƣơng trình tạo sóng vuông 10KHz (D=50%)
trên chân P1.3. Giả sử XTAL = 24MHz.
f = 10KHz  T = 100 s ; D=50%  tH = tL= 50s = delay
XTAL=24MHz  1MC=0.5 s  delay = 100MC

ORG 0000H
lap: CPL P1.3
ACALL delay P1.3  NOT (P1.3)
SJMP lap
delay:
MOV R4,#50 Delay
DJNZ R4,$
RET
END
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Tạo sóng vuông 10KHz – D = 30%
Viết chƣơng trình tạo sóng vuông 10KHz (D=30%) trên chân
P1.3. Giả sử XTAL = 24MHz.
f = 10KHz  T = 100 s ; D=30%  tH =30%T; tL= 70%T
MC=0.5 s  delay1=60MC, delay2 =140MC
ORG 0000H
lap: SETB P1.3
ACALL delay1 P1.3  1
CLR P1.3
ACALL delay2
SJMP lap Delay tH
Delay1: MOV R4,#30
DJNZ R4,$
RET P1.3  0
Delay2: MOV R4,#70
DJNZ R4,$
RET Delay tL
END
Bài giảng môn Vi xử lý
GV: Lê Thị Kim Anh
Tạo sóng vuông 100KHz
Viết chƣơng trình tạo sóng vuông 100KHz (D=50%) trên chân
P1.1. Giả sử XTAL = 12MHz.
XTAL=12MHz  1MC = 1 s
f = 100KHz  T = 10 s ; D=50%  tH = tL= 50%T= 5s = 5MC

ORG 0000H
lap: CPL P1.1
NOP
NOP
SJMP lap
END

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Tạo sóng vuông 100KHz – D = 40%
Viết chƣơng trình tạo sóng vuông 100KHz (D=40%) trên chân
P1.2. Giả sử XTAL = 12MHz.

ORG 0000H
lap: SETB P1.2
NOP
NOP
NOP
CLR P1.2
NOP
NOP
NOP
SJMP lap
END

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh
Bài tập
Viết CT tạo một xung dương ( ) tại chân P1.0 với độ rộng
xung 1ms, biết rằng xtal là 12 MHz.

Bài giảng môn Vi xử lý


GV: Lê Thị Kim Anh

You might also like