Download as pptx, pdf, or txt
Download as pptx, pdf, or txt
You are on page 1of 62

CHƯƠNG 3

TẬP LỆNH
MCU ATmega324P

* Chương 3: Tập lệnh ATmega324P BMĐT - 1 - HCMUT Nguyễn Trọng Luật *


NHÓM LỆNH CHUYỂN DỮ LIỆU
Nhóm lệnh này trao đổi dữ liệu giữa 2 toán hạng: 1 toán hạng là thanh ghi trong
tập thanh ghi GPRs và toán hạng còn lại là các thành phần của bộ nhớ: thanh ghi
GPR, thanh ghi I/0, SRAM, stack, FLASH hay hằng số.

SRAM
FLASH
I/0 mở rộng
ST, STD, STS LP
LD, LDD, LDS M
GPRs MOV,
(R0 ÷ R31) MOVW
OU
POP
T
PUS
IN H
Thanh ghi I/0 STACK
LDI
chuẩn

Hằng số

* Chương 3: Tập lệnh ATmega324P BMĐT - 2 - HCMUT Nguyễn Trọng Luật *


1. Thanh ghi GPRs:
 Thanh ghi với thanh ghi :
Mnemonics Operands Operation Words Clocks Note
MOV Rd, Rr Rd  Rr 1 1 d,r : 0 ÷ 31
MOVW Rd+1:Rd, Rr+1:Rr
Rd+1:Rd  Rr+1:Rr 1 1 d,r : 0, 2, .., 30
MOVW Rd, Rr
Vd: chuyển nội dung thanh ghi R16 vào thanh ghi R1 MOV R1, R16
Vd: chuyển nội dung cặp thanh ghi R1:R0 vào thanh ghi Z
MOVW R31:R30, R1:R0 MOVW R30, R0
 Thanh ghi với hằng số :
Mnemonics Operands Operation Words Clocks Note
LDI Rd, K Rd  K 1 1 d : 16 ÷ 31, K : 0 ÷ 255

Vd: nạp giá trị 0x0F vào thanh ghi R1 và R20 LDI R20, 0x0F
MOV R1, R20
* Chương 3: Tập lệnh ATmega324P BMĐT - 3 - HCMUT Nguyễn Trọng Luật *
2. GPRs với SRAM:
Lệnh Load: LD Rd, th ; Rd  th: chuyển dữ liệu từ toán hạng th vào GPRs
Lệnh Store: ST th, Rd ; th  Rd: chuyển dữ liệu từ GPRs vào toán hạng th
 Truy xuất SRAM bằng pp địa chỉ trực tiếp :
Mnemonics Operands Operation Words Clocks Note
LDS Rd, k Rd  (k) * 2 2 d,r : 0 ÷ 31, k là địa chỉ bộ nhớ SRAM k: 0 ÷ 8FFH
STS k, Rr (k)  Rr 2 2 nếu 60H  k  FFH có thể thay bằng tên tghi I/O

* (k) là ô nhớ có địa chỉ k

Vd: ghi giá trị 100 vào ô nhớ SRAM có địa chỉ 20FH LDI R16, 100
STS 0x20F, R16
Vd: chuyển nội dung ô nhớ SRAM có địa chỉ B2H vào ô nhớ có địa chỉ cao nhất
LDS R10, 0xB2 hay LDS R10, TCNT2
STS 0x8FF, R10 (ô nhớ có địa chỉ B2H là thanh ghi I/O có tên TCNT2)
* Chương 3: Tập lệnh ATmega324P BMĐT - 4 - HCMUT Nguyễn Trọng Luật *
 Truy xuất SRAM bằng pp địa chỉ gián tiếp :
Mnemonics Operands Operation Words Clocks Note
LD Rd, I_reg Rd  (I_reg) * 1 2
d, r : 0 ÷ 31
LD Rd, I_reg + Rd  (I_reg), I_reg  I_reg + 1 1 2
LD Rd, - I_reg I_reg  I_reg - 1, Rd  (I_reg) 1 2 I_reg: X, Y, Z
(con trỏ ô nhớ)
ST I_reg, Rr (I_reg)  Rr 1 2 X=XH:XL≡ R27:R26
ST I_reg +, Rr (I_reg)  Rr, I_reg  I_reg + 1 1 2 Y=YH:YL≡ R29:R28
Z=ZH:ZL≡ R31:R30
ST - I_reg, Rr I_reg  I_reg – 1, (I_reg)  Rr 1 2
Vd: xóa ô nhớ SRAM có địa chỉ 2FFH * (I_reg) là ô nhớ có địa chỉ là con trỏ I_reg

LDI R16, 0 LDI R16, 0 LDI R16, 0 LDI R16, 0


LDI R26, 0xFF LDI XL, 0xFF LDI XL, 0xFF LDI XL, 0x00
LDI R27, 0x02 LDI XH, 0x02 LDI XH, 0x02 LDI XH, 0x03
ST X, R16 ST X, R16 ST X+, R16 ST - X, R16
XH:XL ≡ R27:R26 X = 300H X = 2FFH
► I_reg+, -I_reg thuận tiện khi truy xuất chuỗi ô nhớ SRAM có địa chỉ liên tiếp
* Chương 3: Tập lệnh ATmega324P BMĐT - 5 - HCMUT Nguyễn Trọng Luật *
Vd: Xóa 5 ô nhớ SRAM có địa chỉ từ 100H đến 104H
LDI R16, 0 LDI R16, 0 LDI R16, 0
STS 0x100, R16 LDI YL, 0x00 LDI R17, 5
STS 0x101, R16 LDI YH, 0x01 LDI YL, 0x00
STS 0x102, R16 ST Y+, R16 LDI YH, 0x01
STS 0x103, R16 ST Y+, R16 LP: ST Y+, R16
STS 0x104, R16 ST Y+, R16 DEC R17
ST Y+, R16 BRNE LP
ST Y+, R16
LDI R16, 0 LDI R16, 0
LDI ZL, 0x05 LDI R17, 5
LDI ZH, 0x01 LDI ZL, 0x05
ST -Z, R16 LDI ZH, 0x01
ST -Z, R16 LP: ST -Z, R16
ST -Z, R16 DEC R17
ST -Z, R16 BRNE LP
ST -Z, R16
* Chương 3: Tập lệnh ATmega324P BMĐT - 6 - HCMUT Nguyễn Trọng Luật *
 Truy xuất SRAM bằng pp địa chỉ gián tiếp với độ dời q :
Mnemonics Operands Operation Words Clocks Note
LDD Rd, Y+q Rd  (Y+q) 1 2
LDD Rd, Z+q Rd  (Z+q) 1 2 d, r: 0 ÷ 31,
STD Y+q, Rr (Y+q)  Rr 1 2 độ dời q : 0 ÷ 63

STD Z+q, Rr (Z+q)  Rr 1 2

Vd: sao chép 5 ô nhớ SRAM có địa chỉ đầu là 100H vào lần lượt các thanh ghi
R16, R17, R18, R19, R20
LDI YH, 0x01
LDI YL, 0x00
LD R16, Y
LDD R17, Y+1
LDD R18, Y+2
LDD R19, Y+3
LDD R20, Y+4
* Chương 3: Tập lệnh ATmega324P BMĐT - 7 - HCMUT Nguyễn Trọng Luật *
3. GPRs với thanh ghi I/O cơ bản:
Các thanh ghi I/O cơ bản ngoài địa chỉ bộ nhớ từ 20H đến 5FH, có địa chỉ I/0 từ
00H đến 3FH. Nhóm lệnh này sử dụng địa chỉ I/O để truy xuất thanh ghi.
Mnemonics Operands Operation Words Clocks Note
IN Rd, P Rd  Tghi I/O có địa chỉ P 1 1 d,r : 0 ÷ 31, P: 0 ÷ 63
OUT P, Rr Tghi I/O có địa chỉ P  Rr 1 1 P có thể thay thế bằng tên tghi

Vd: cất nội dung thanh ghi có địa chỉ I/0 là 3FH vào thanh ghi R10
IN R10, 0x3F hay IN R10, SREG
Vd: nhập dữ liệu từ Port B và xuất dữ liệu ra Port D (các Port đã được định hướng I/0)
IN R16, PINB
OUT PORTD, R16
► lệnh LDS R10, 0x5F cũng cho kết quả tương tự lệnh IN R10, 0x3F nhưng lệnh
LDS là lệnh 4B, trong khi lệnh IN chỉ có 2B. Ngoài ra thực hiện lệnh LDS cần 2MC so
với lệnh IN chỉ 1MC. Cũng tương tự với lệnh STS và OUT. Vì vậy khi làm việc với
thanh ghi I/O cơ bản nên dùng lệnh IN/OUT
* Chương 3: Tập lệnh ATmega324P BMĐT - 8 - HCMUT Nguyễn Trọng Luật *
4. GPRs với bộ nhớ chương trình (Program Memory):
Mnemonics Operands Operation Words Clocks Note
LPM R0  (Z) 1 3
d: 0 ÷ 31
LPM Rd, Z Rd  (Z) 1 3 Thanh ghi Z là con trỏ
bộ nhớ chương trình
LPM Rd, Z+ Rd  (Z), Z Z+1 1 3
 Bộ nhớ chương trình (Flash) được tổ chức theo Word, mỗi địa chỉ ô nhớ chứa 2
byte. Lệnh LPM chỉ đọc 1 byte dữ liệu, vì vậy Z cần chứa chính xác địa chỉ byte
cao hay byte thấp của 1 ô nhớ.
Địa chỉ Địa chỉ Địa chỉ Vd: đọc byte thấp của ô nhớ có địa chỉ $0001 về R0
BỘ NHỚ BYTE CAO BYTE THẤP LDI ZH,
$0000 $0001 $0000 LDI ZH, 0x00
HIGH(0x0002)
$0001 $0003 $0002 LDI ZL, 0x02
LDI ZL, LOW(0x0002)
… … … LPM
$0100 $0201 $0200 LPM
$0101 $0203 $0202
Vd: đọc ô nhớ có địa chỉ LDI ZH, 0x02
… … … $0100 về cặp tghi R17:R16 LDI ZL, 0x00
$03FF $07FF $07FE LP R16, Z+
LP R17, Z
* Chương 3: Tập lệnh ATmega324P BMĐT - 9 - HCMUT Nguyễn Trọng Luật *
 Hợp ngữ cho phép dùng các lệnh sau để lấy địa chỉ byte thấp và byte cao từ địa chỉ ô nhớ
LDI ZH, HIGH($0100<<1) LDI ZH, HIGH($0100<<1|1)
LDI ZL, LOW($0100<<1) LDI ZL, LOW($0100<<1|1)
 Bộ nhớ Flash chứa các dữ liệu cố định như chuỗi ký tự hay bảng tham chiếu (LUT-Look
Up Table). Các dữ liệu này được lưu chung cùng với chương trình. Khi viết chương
trình thì dữ liệu này được khai báo bằng dẫn xuất .DB
.ORG 0x100  Bảng dữ liệu bên có 10 byte liên tiếp có giá trị là x 2 (với
.DB 0, 1, 4, 9, 16, 25 x là phần tử 0, 1, .. 9 của chuỗi dữ liệu). Hay nói cách khác
.DB 36, 49, 64, 81 bảng chứa dữ liệu cho hàm F(x)=x2. Để tra bảng tìm F(x)
ĐỊA CHỈ BYTE BYTE thì tham chiếu byte có địa chỉ = địa chỉ byte đầu (byte thấp
BỘ NHỚ CAO THẤP của ô nhớ đầu bảng) + giá trị x.

$0100 $01 $00 Vd: Viết đoạn ctrình tính LDI ZH, HIGH($0100<<1)
$0101 $09 $04 bình phương giá trị nhập LDI ZL, LOW($0100<<1)
$0102 $19 $10 từ Port A (chỉ có giá trị IN R16, PINA
$0103 $31 $24 0..9) và xuất ra Port C ADD ZL, R16
$0104 $51 $40 LPM
OUT PORTC, R0
* Chương 3: Tập lệnh ATmega324P BMĐT - 10 - HCMUT Nguyễn Trọng Luật *
5. GPRs với ngăn xếp (Stack):
 Khi dùng toán hạng thực hiện công việc, mà không muốn mất giá trị đang có của
nó, thì ta lưu giá trị của nó. Rồi sau khi thực hiện xong công việc, thì trả lại giá trị
cũ cho toán hạng. Ngăn xếp được dùng để làm công việc đó.
Mnemonics Operands Operation Words Clocks Note
PUSH Rr (SP)  Rr, SP  SP-1 1 2 d,r : 0 ÷ 31
POP Rd SP  SP+1, Rd  (SP) 1 2 SP: con trỏ ngăn xếp

 Nếu có nhiều toán hạng cất vào và lấy ra khỏi stack, thì nhớ theo thứ tự LIFO
Vd: PUSH R16 Vd: hoán đổi nội dung 2 thanh ghi
PUSH R0 R16 và R0 cho nhau.
PUSH R20 PUSH R16
… PUSH R0
POP R20 POP R16
POP R0 POP R0
POP R16
 ATmega324P giá trị đầu của thanh ghi SP là 0x08FF.
* Chương 3: Tập lệnh ATmega324P BMĐT - 11 - HCMUT Nguyễn Trọng Luật *
NHÓM LỆNH SỐ HỌC - LOGIC
 Nhóm lệnh này thực hiện trên các thanh ghi GPRs.
 Có tác động đến các cờ trong thanh ghi trạng thái SREG sau khi thực thi lệnh.
1. Phép toán cộng:
Mnemonics Operands Operation Words Clocks Note
ADD Rd, Rr Rd  Rd + Rr 1 1 d,r : 0 ÷ 31
ADC Rd, Rr Rd  Rd + Rr + C 1 1 Cờ: H,S,V,N,Z,C
dl:24,26,28,30; dh=dl+1; K:0÷63
ADIW Rdl, K Rdh:Rdl  Rdh:Rdl + K 1 2
Cờ: S,V,N,Z,C
Vd: cộng nội dung 2 ô nhớ SRAM có Vd: thanh ghi SREG sau khi $54 + $3C
địa chỉ $200 và $201. Kết quả 8 bit cất Vị trí bit 7 6 5 4 3 2 1 0
Bit nhớ 0 1 1 1 1 1 0 0 0 Số có dấu
vào ô nhớ SRAM có địa chỉ $202 $54 0 1 0 1 0 1 0 0 +84
LDS R16, $200 $3C 0 0 1 1 1 1 0 0 +60
$90 1 0 0 1 0 0 0 0 +144
LDS R17, $201
ADD R16, R17 I T H S V N Z C
STS $202, R16 SREG - - 1 0 1 1 0 0
* Chương 3: Tập lệnh ATmega324P BMĐT - 12 - HCMUT Nguyễn Trọng Luật *
Vd: cộng 2 số 16 bit: số thứ nhất là nội dung của cặp ô nhớ SRAM có địa chỉ là $200 và
$201; số thứ hai là nội dung ô nhớ Flash có địa chỉ là $100. Kết quả là số 16 bit cất vào
cặp ô nhớ SRAM có địa chỉ là $202_$203. (Biết rằng trong mỗi cặp ô nhớ SRAM thì ô
nhớ có địa chỉ cao chứa byte cao)
LDS R16, $200 ; R16 chứa byte thấp của th1
LDS R17, $201 ; R17 chứa byte cao của th1
LDI ZL, LOW($100<<1) ; Z chứa địa chỉ byte thấp của th2
LDI ZH, HIGH($100<<1)
LPM R18, Z+ ; R18 chưa byte thấp của th2
LPM R19, Z ; R19 chứa byte cao của th2
ADD R16, R18 ; cộng 2 byte thấp trước (không cờ C)
ADC R17, R19 ; cộng 2 byte cao có cờ C (từ kết quả cộng byte thấp)
STS $202, R16 ; cất kết quả vào SRAM
STS $203, R17
 Lệnh ADIW thực hiện phép cộng một hằng số K (6 bit) với nội dung của 1 cặp
thanh ghi thuộc 8 thanh ghi cao nhất R24÷R31; trong đó có 3 con trỏ X,Y,Z.
ADIW R30, 63 ADIW ZL, 63 ADIW R31:R30, $2A ADIW ZH:ZL, $2A
* Chương 3: Tập lệnh ATmega324P BMĐT - 13 - HCMUT Nguyễn Trọng Luật *
2. Phép toán trừ:
Mnemonics Operands Operation Words Clocks Note
SUB Rd, Rr Rd  Rd - Rr 1 1
SBC Rd, Rr Rd  Rd - Rr - C 1 1 d,r : 0 ÷ 31
K: 0 ÷ 255
SUBI Rd, K Rd  Rd - K 1 1 Cờ: H,S,V,N,Z,C
SBCI Rd, K Rd  Rd - K - C 1 1
dl:24,26,28,30; dh=dl+1; K:0÷63
SBIW Rdl, K Rdh:Rdl  Rdh:Rdl - K 1 2
Cờ: S,V,N,Z,C

Vd: trừ nội dung thanh ghi X cho thanh ghi Y, kết quả cất trong thanh ghi Z
SUB XL, YL
SBC XH, YH

MOVW ZL, XL
Vd: trừ nội dung cặp thanh ghi R17:R16 cho giá trị $9B, kết quả cất lại cặp thanh ghi
SUBI R16, $9B
SBCI R17, 0

* Chương 3: Tập lệnh ATmega324P BMĐT - 14 - HCMUT Nguyễn Trọng Luật *


3. Tăng/ Giảm 1:
Mnemonics Operands Operation Words Clocks Note
INC Rd Rd  Rd + 1 1 1 d: 0 ÷ 31
DEC Rd Rd  Rd - 1 1 1 Cờ: S,V,N,Z (Không tác động đến cờ C,H)

 Rd thường dùng như bộ đếm số lần lặp vòng. Ở mỗi lần lặp, bộ đếm được tăng
hay giảm 1, và làm điều kiện để tiếp tục lặp vòng hay kết thúc.
Vd: Xóa 5 ô nhớ SRAM có địa chỉ từ 100H đến 104H
LDI R16, 0
LDI R17, 5
LDI YL, 0x00
LDI YH, 0x01
LP: ST Y+, R16
DEC R17
BRNE LP

* Chương 3: Tập lệnh ATmega324P BMĐT - 15 - HCMUT Nguyễn Trọng Luật *


4. Phép toán nhân :
 Nhân số nguyên :
Mnemonics Operands Operation Words Clocks Note
R1:R0  Rd x Rr d,r: 0 ÷ 31
MUL Rd, Rr 1 2
(unsigned)  (unsigned) x (unsigned) Cờ: Z,C
R1:R0  Rd x Rr d,r: 16 ÷ 31
MULS Rd, Rr 1 2
(signed)  (signed) x (signed) Cờ: Z,C
R1:R0  Rd x Rr d,r: 16 ÷ 23
MULSU Rd, Rr 1 2
(signed)  (signed) x (unsigned) Cờ: Z,C
 Phép nhân 2 toán hạng 8 bit, cho kết quả là 16 bit được mặc định cất vào cặp thanh
ghi R1:R0 (R1 là byte cao)
Vd: nhân 2 số 8 bit không dấu là nội dung của thanh ghi R15 và R14, kết quả cất lại
vào R15:R14 (R15 chứa byte cao)
MUL R15, R14 MUL R15, R14 Giả sử R15 = $1F và R14 = 10.
MOV R14, R0 MOVW R14, R0 Sau khi thực hiện đoạn ctrình
bên thì R15 và R14 là bao nhiêu?
MOV R15, R1 R15 = $01 R14 = $36
* Chương 3: Tập lệnh ATmega324P BMĐT - 16 - HCMUT Nguyễn Trọng Luật *
 Nhân số không nguyên (số lẻ):
Mnemonics Operands Operation Words Clocks Note
R1:R0  (Rd x Rr) <<1
FMUL Rd, Rr 1 2
(unsigned)  (unsigned) x (unsigned)
R1:R0  (Rd x Rr)<<1 d,r: 16 ÷ 23
FMULS Rd, Rr 1 2
(signed)  (signed) x (signed) Cờ: Z,C
R1:R0  (Rd x Rr)<<1
FMULSU Rd, Rr 1 2
(signed)  (signed) x (unsigned)
 Số không nguyên 1 byte được biểu diễn dạng (1.7) nghĩa là giữa bit 7 và bit 6 là
hàm ý có dấu chấm cơ số. Bit 7 là bit bên trái dấu chấm (phần nguyên) và 7 bit còn
lại bên phải dấu chấm (phần không nguyên).
Vd: cho thanh ghi R16 = 40H = 01000000B là 0.5 và R23 = $20 = 00100000B là 0.25
 Số không nguyên 2 byte được biểu diễn dạng (1.15).
 Nhân số 1 byte dạng (1.7) với số 1 byte dạng (1.7) được số 2 byte dạng (2.14). Sau
đó dịch trái 1 bit để chuyển về dạng (1.15)
FMUL R16, R23 ; R16 x R23 = 40H x 20H = 0800H
R1:R0 = 0800H <<1 = $1000 = 0001 0000 0000 0000 B là 0.125
* Chương 3: Tập lệnh ATmega324P BMĐT - 17 - HCMUT Nguyễn Trọng Luật *
5. Phép toán logic AND/OR/XOR:
Mnemonics Operands Operation Words Clocks Note
AND Rd, Rr Rd  Rd AND Rr 1 1
d,r : 0 ÷ 31
OR Rd, Rr Rd  Rd OR Rr 1 1
Cờ: S,V=0,N,Z
EOR Rd, Rr Rd  Rd XOR Rr 1 1
ANDI Rd, K Rd  Rd AND K 1 1 d: 16 ÷ 31; K: 0 ÷ 255
ORI Rd, K Rd  Rd OR K 1 1 Cờ: S,V=0,N,Z

Vd: ANDI R16, 0b00000001 ; giữ bit 0 của thanh ghi R16, xóa các bit còn lại
LDI R16, $0F ; xóa 4 bit cao của thanh ghi R2
AND R2, R16
ORI R25, $AA ; set lên 1 các bit ở vị trí lẻ của thanh ghi R25
LDI R23, $F0 ; lấy bù 4 bit cao của thanh ghi R5
EOR R5, R23
EOR R19, R19 ; xóa thanh ghi R19
* Chương 3: Tập lệnh ATmega324P BMĐT - 18 - HCMUT Nguyễn Trọng Luật *
6. Bù -1/Bù-2:
Mnemonics Operands Operation Words Clocks Note
Rd  $FF – Rd:
COM Rd Bù_1
1 1 d : 0 ÷ 31, Cờ: S, V=0, N, Z, C=1

NEG Rd Rd  $00 – Rd: Bù_2


1 1 d : 0 ÷ 31, Cờ: H, S, V, N, Z, C
Vd: lấy bù 2 của ô nhớ SRAM có địa chỉ $100 LDS R16, $100
NEG R16
STS $100, R16
Vd: lấy bù 2 của LDS R16, $100
1 số 16 bit là nội LDS R17, $101
COM R17 ; bù 1 byte cao LDS R24, $100
dung của 2 ô nhớ LDS R25, $101
COM R16 ; bù 1 byte thấp
SRAM có địa chỉ LDI R18, 1 ; cộng 1 COM R25
$100 và $101. ADD R16, R18 COM R24
(Byte cao chứa CLR R18 ADIW R24, 1
trong ô nhớ có ADC R17, R18 STS $100, R24
địa chỉ cao). STS $100, R16 STS $101, R25
STS $101, R17
* Chương 3: Tập lệnh ATmega324P BMĐT - 19 - HCMUT Nguyễn Trọng Luật *
7. Set/Clear các bit trong thanh ghi GPR:
Mnemonics Operands Operation Words Clocks Note
SBR Rd, K Rd  Rd OR K 1 1 d : 16 ÷ 31, K : 0 ÷ 255
CBR Rd, K Rd  Rd AND ($FF – K) 1 1 Cờ: S, V=0, N, Z

 Cần set hay xóa các bit nào trong thanh ghi Rd, thì cho các vị trí bit đó trong K bằng 1
Vd: Xoá 4 bit cao của thanh ghi R10 MOV R16, R10
CBR R16, 0b11110000
MOV R10, R16
8. Các lệnh khác:
Mnemonics Operands Operation Words Clocks Note
CLR Rd Rd  $00 1 1 d : 0 ÷ 31, Cờ: S=0, V=0, N=0, Z=1
SER Rd Rd  $FF 1 1 d : 0 ÷ 31
TST Rd Rd  Rd AND Rd 1 1 d : 0 ÷ 31, Cờ: S, V=0, N, Z

 Lệnh TST dùng để kiểm tra thanh ghi chứa giá trị =0 (cờ Z), dương hay âm (cờ S, N)
* Chương 3: Tập lệnh ATmega324P BMĐT - 20 - HCMUT Nguyễn Trọng Luật *
►Phép Chia:
 Trong AVR không có lệnh chia, vì vậy phép chia được thực hiện thông qua giải thuật
trừ nhiều lần
 Để thực hiện phép, chúng ta đặt số bị chia vào một thanh ghi và liên tục trừ cho số chia
đến khi không còn trừ được (cờ nhớ bằng 1). Thương số chính là số lần thực hiện phép
trừ, và phần còn lại của số bị chia chính là số dư của phép toán.

Vd: đoạn chương trình sau thực hiện phép chia toán hạng 8 bit cho toán hạng 8 bit:
- R20 chứa số bị chia, R21 chứa số chia.
- Kết quả thương số chứa trong thanh ghi R22, và phần dư chứa lại vào R20

CLR R22 ; thương số = 0


L1: INC R22 ; tăng thương số
SUB R20, R21 ; số bị chia trừ đi số chia
BRCC L1 ; nếu cờ C=0 tiếp tục quay lại trừ
DEC R22 ; C=1 bỏ qua lần trừ
ADD R20, R21 ; trả lại số dư vào R20

* Chương 3: Tập lệnh ATmega324P BMĐT - 21 - HCMUT Nguyễn Trọng Luật *


Vd: viết chương trình .ORG 0
đổi số nhị phân 1 byte LDS R20, $200 ; số bị chia = ($200)
là nội dung ô nhớ LDI R21, 10 ; số chia = 10
CLR R22 ; thương số = 0
$200 thành 3 chữ số
L1: INC R22 ; chia 10 lần 1
thập phân (BCD): SUB R20, R21
hàng đơn vị, hàng BRCC L1
chục và hàng trăm DEC R22 ; phần nguyên sau khi chia 10
cất vào lần lượt 3 ô ADD R20, R21 ; phần dư sau chia là BCD hàng đơn vị
nhớ có địa chỉ $201, STS $201, R20
$202 và $203. MOV R20, R22 ; lấy phần nguyên để chia 10 lần thứ 2
CLR R22
($200) = $FD = 253 L2: INC R22 ; chia 10 lần 2
• ($203)=$02 = 2 SUB R20, R21
BRCC L2
• ($202)=$05 = 5
DEC R22 ; phần nguyên sau chia là BCD hàng tram
• ($201)=$03 = 3 ADD R20, R21 ; phần dư sau chia là BCD hàng chục
STS $202, R20
STS $203, R22
L3: RJMP L3

* Chương 3: Tập lệnh ATmega324P BMĐT - 22 - HCMUT Nguyễn Trọng Luật *


Vd: Cho các giá trị BCD: BCD hàng trăm chứa trong thanh ghi R23, BCD hàng chục
chứa trong thanh ghi R22, BCD hàng đơn vị chứa trong thanh ghi R21. Viết chương trình
đổi 3 giá trị BCD trên thành giá trị nhị phân tương ứng cất vào cặp thanh ghi R20:R19
(R20 chứa byte cao). Chú ý không làm thay đổi nội dung ban đầu của các thanh ghi
R20:R19 ← 100 × R23 + 10 × R22 + R21
.ORG 0
LDI R16, 10
MUL R16, R22 ; R1:R0 = 10 x R22 (chỉ lấy byte thấp)
ADD R0, R21
MOV R19, R0 ; R19 = 10 x R22 + R21
LDI R16, 100
MUL R16, R23 ; R1:R0 = 100 x R23
ADD R19, R0 ; cộng byte thấp R0 với R19
LDI R20, 0
ADC R20, R1 ; cộng cờ nhớ với byte cao R1
LP: RJMP LP
* Chương 3: Tập lệnh ATmega324P BMĐT - 23 - HCMUT Nguyễn Trọng Luật *
NHÓM LỆNH RẼ NHÁNH (thay đổi thanh ghi PC hiện hành)
1. Lệnh nhảy không điều kiện:
Mnemonics Operands Operation Words Clocks Note
JMP k PC  k 2 3 k: 22 bit (0  k  222 = 4M Word)
IJMP PC  Z 1 2 Z = 16 bit (216 = 64K Word)
RJMP k PC  PC + 1 + k 1 2 k: 12 bit có dấu (-2048  k  +2047)
 Bộ nhớ Flash của ATmega324P có FLASHEND = $3FFF
 Khi viết lệnh, toán hạng k là địa chỉ của lệnh nhảy tới hoặc được thay bằng 1 nhãn
(label). Nhãn được đặt trước lệnh nhảy tới, phân cách bởi dấu “:”.
 Dùng các lệnh nhảy này để nhảy đến địa chỉ của lệnh mong muốn.
RJMP LABEL ; LABEL phải trong phạm vi địa chỉ hợp lệ
 Thường dùng lệnh nhảy để thực hiện vòng lặp vô hạn hay để kết thúc chương trình:
LAP: … HERE: RJMP HERE

JMP LAP
* Chương 3: Tập lệnh ATmega324P BMĐT - 24 - HCMUT Nguyễn Trọng Luật *
 Xác định độ dời k trong lệnh nhảy tương đối RJMP:
Độ dời k (12 bit) = Địa chỉ lệnh nhảy đến – Địa chỉ lệnh kế lệnh nhảy
Vd: Cho đoạn chương trình sau Vd: Cho lệnh RJMP LB chứa trong ô nhớ
Address Code có địa chỉ $10F9, xác định vùng địa chỉ
.ORG 0x100
$0100 LDI R16, 5 hợp lệ của nhãn LB
$0101 MOV R10, R16
$0102 RJMP LB ; (1) - Địa chỉ cao nhất có độ dời dương là +2047
$0103 LDI R17, 0xFF k = 0111 1111 1111 = $7FF
$0104 ADD R16, R17
 $10FA + $07FF = $18F9
$0105 LB: ANDI R16, 0xAA
$0106 STS 0x1FF, R16 - Địa chỉ thấp nhất có độ dời âm là -2048
$0108 RJMP LB ; (2)
k = 1000 0000 0000 = $800
 $10FA + $F800 = $08FA
- Lệnh (1) có độ dời: $0105 - $0103 = $0002
 k = 0000 0000 0010 = + 2 Vùng địa chỉ hợp lệ của nhãn LB:
- Lệnh (2) có độ dời: $0105 - $0109 = $FFFC $08FA ÷ $18F9
 k = 1111 1111 1100 = - 4
* Chương 3: Tập lệnh ATmega324P BMĐT - 25 - HCMUT Nguyễn Trọng Luật *
2. Lệnh nhảy có điều kiện:  Khi điều kiện (ĐK) đúng thì
Y label
ĐK nhảy đến lệnh (nhãn label),
PC PC+k+1 sai thì thực hiện lệnh kế tiếp
N
PC PC+1 bit 7 6 5 4 3 2 1 0
 Điều kiện được xét là 1 bit bất kỳ thuộc thanh ghi SREG SREG I T H S V N Z C
Mnemonics Operands Operation Words Clocks Note
BRBS s, k nhảy khi ĐK đúng: Bit (s)=1 1 1/2 s: 0÷7; k: 7 bit có dấu (-64  k  +63)
BRBC s, k nhảy khi ĐK đúng: Bit (s)=0 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng
k là địa chỉ hoặc nhãn của lệnh nhảy tới khi ĐK đúng
Vd: nếu cờ T bằng 0 thì tăng 1 thanh ghi R20, ngược lại tăng 1 thanh ghi R21. Sau đó
cùng tiếp tục.
BRBC 6, BANG_0 BRBS 6, BANG_1
INC R21 INC R20
RJMP TTUC RJMP TTUC
BANG_0: INC R20 BANG_1: INC R21
TTUC: … TTUC: …
* Chương 3: Tập lệnh ATmega324P BMĐT - 26 - HCMUT Nguyễn Trọng Luật *
 Lệnh riêng cho từng bit cụ thể trong thanh ghi SREG
Mnemonics Operands Operation Words Clocks Note
BREQ k nhảy khi Z = 1 (EQual - bằng) 1 1/2 k: 7 bit có dấu (-64  k  +63)
BRNE k nhảy khi Z = 0 (Not Equal) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng

BRMI k nhảy khi N = 1 (MInus - âm) 1 1/2


k: 7 bit có dấu (-64  k  +63)
BRPL k nhảy khi N = 0 (PLus -dương) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng
BRIE k Nhảy khi I = 1 (Int. Enabled) 1 1/2
k: 7 bit có dấu (-64  k  +63)
BRID k Nhảy khi I = 0 (Int. Disabled) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng
BRTS k Nhảy khi T = 1 (T Set) 1 1/2
k: 7 bit có dấu (-64  k  +63)
BRTC k Nhảy khi T = 0 (T Cleared) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng
BRVS k Nhảy khi V = 1 (V Set) 1 1/2
k: 7 bit có dấu (-64  k  +63)
BRVC k Nhảy khi V = 0 (V Cleared) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng
BRHS k Nhảy khi H = 1 (H Set) 1 1/2
k: 7 bit có dấu (-64  k  +63)
BRHC k Nhảy khi H = 0 (H Cleared) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng
* Chương 3: Tập lệnh ATmega324P BMĐT - 27 - HCMUT Nguyễn Trọng Luật *
Mnemonics Operands Operation Words Clocks Note
BRCS k Nhảy khi C = 1 (C Set) 1 1/2 k: 7 bit có dấu (-64  k  +63)
BRCC k Nhảy khi C = 0 (C Cleared) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng

 Để so sánh 2 toán hạng không dấu bằng các lệnh SUB/SUBI, CP/CPI và dùng cờ cary C
để xét trường hợp  hay . Sau khi thực hiện lệnh so sánh thì có thể dùng các lệnh:
BRLO k Nhảy khi C = 1 (LOwer) 1 1/2
k: 7 bit có dấu (-64  k  +63)
BRSH k Nhảy khi C = 0 (Same/Higher) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng

Vd: tìm giá trị lớn hơn (số không dấu) trong 2 thanh ghi R20 và R21 và cất vào thanh ghi
R22. MOV R16, R20
MOV R16, R20
SUB R16, R21
SUB R16, R21
BRCS NHO
BRLO NHO
MOV R22, R20
MOV R22, R20
RJMP TTUC
RJMP TTUC
NHO: MOV R22, R21
NHO: MOV R22, R21
TTUC: RJMP TTUC
TTUC: RJMP TTUC
* Chương 3: Tập lệnh ATmega324P BMĐT - 28 - HCMUT Nguyễn Trọng Luật *
 Để so sánh 2 toán hạng có dấu bằng các lệnh SUB/SUBI, CP/CPI và dùng cờ S (NV) để
xét trường hợp  hay .
Mnemonics Operands Operation Words Clocks Note
BRLT k Nhảy khi S = 1 (Less Than) 1 1/2 k: 7 bit có dấu (-64  k  +63)
BRGE k Nhảy khi S = 0 (Greater/Equal) 1 1/2 CK=1 nếu ĐK sai, CK=2 nếu ĐK đúng

Vd: tìm giá trị lớn hơn (số có dấu) trong 2 thanh ghi R20 và R21 và cất vào thanh ghi R22.
MOV R16, R20
SUB R16, R21
BRLT NHO
MOV R22, R20
RJMP TTUC
NHO: MOV R22, R21
TTUC: RJMP TTUC
 Chú ý: - Các lệnh nhảy theo cờ sẽ xét trạng thái cờ bị thay đổi bởi lệnh gần nhất.
- Các lệnh nhảy có điều kiện này giống lệnh nhảy tương đối RJMP nhưng
k chỉ có 7 bit (-64÷63)
* Chương 3: Tập lệnh ATmega324P BMĐT - 29 - HCMUT Nguyễn Trọng Luật *
 Vòng lặp có số lần lặp vòng giới hạn là n: khi cần thực hiện chuỗi lệnh hay 1 thao tác
nhiều lần, thì dùng vòng lặp có số lần lặp vòng mong muốn
SLV = n
LDI R16, n
LAP LAP: …
Các lệnh được lặp …
DEC R16
BRNE LAP
Giảm SLV

SLV ≠ 0 Vd: Xóa 100 ô nhớ SRAM có địa chỉ từ 100H


Y
N
LDI R17, 0
LDI YL, 0x00 ; con trỏ ô nhớ chứa địa chỉ đầu = 100H
LDI YH, 0x01
LDI R16, 100 ; số lần lặp vòng là số ô nhớ (bộ đếm) = 100
LP: ST Y+, R17 ; xóa ô nhớ có địa chỉ là con trỏ và tăng 1 con trỏ
DEC R16 ; giảm 1 bộ đếm (nếu = 0 thì cờ Z =1;  0 thì Z = 0)
BRNE LP ; Z = 0 quay lại LP (vòng lặp) để xóa ô nhớ kế tiếp
* Chương 3: Tập lệnh ATmega324P BMĐT - 30 - HCMUT Nguyễn Trọng Luật *
3. Lệnh so sánh và nhảy bỏ qua lệnh kế tiếp nếu bằng:
Mnemonics Operands Operation Words Clocks Note
CP Rd, Rr Rd – Rr 1 1 d,r : 0 ÷ 31
CPC Rd, Rr Rd – Rr – C 1 1 Cờ: H,S,V,N,Z,C
d: 16 ÷ 31, K : 0 ÷ 255
CPI Rd, K Rd – K 1 1
Cờ: H,S,V,N,Z,C
CPSE Rd, Rr nếu Rd=Rr thì bỏ qua lệnh kế 1 1/2/3 d,r : 0 ÷ 31

 Các lệnh CP/CPC/CPI tương tự phép trừ tương ứng chỉ khác là không lưu kết quả.
MOV R16, R20
Vd: tìm giá trị lớn SUB R16, R21 CP R20, R21
hơn trong 2 thanh ghi BRCS NHO BRCS NHO
R20 và R21 và cất vào MOV R22, R20 MOV R22, R20
thanh ghi R22. Chú ý RJMP TTUC RJMP TTUC
không được thay đổi NHO: MOV R22, R21 NHO: MOV R22, R21
nội dung R20 và R21 TTUC: RJMP TTUC TTUC: RJMP TTUC

* Chương 3: Tập lệnh ATmega324P BMĐT - 31 - HCMUT Nguyễn Trọng Luật *


 Lệnh CPSE (ComPare, Skip if Equal): nếu Rd=Rr sẽ nhảy bỏ
Y qua 1 lệnh kế tiếp (là lệnh 1W hoặc 2W); ngược lại sẽ thực
Rd = Rr hiện lệnh kế tiếp đó. (Lệnh này không tác động đến các cờ)
N Rd  Rr PC  PC + 1 (thực hiện lệnh kế tiếp) CK = 1
PC PC+2 (3)
Lệnh PC  PC + 2 (bỏ qua lệnh kế tiếp 1W) CK = 2
Rd = Rr
PC  PC + 3 (bỏ qua lệnh kế tiếp 2W) CK = 3
LDI YL, 0x00 ; con trỏ ô nhớ (=0100H)
LDI YH, 0x01
LDI R16, 100 ; bộ đếm (=100)
Vd: đếm số ô nhớ chứa giá LDI R17, 0 ; bộ đếm ô chẵn (=0)
trị chẵn có trong 100 ô nhớ LDI R18, 0b00000001 ; giá trị so sánh
SRAM có địa chỉ đầu là LP: LD R19, Y+ ; đọc ô nhớ
$100, kết quả cất vào ô nhớ ANDI R19, 0x01 ; giữ bit LSB, xóa các bit khác
CPSE R19, R18 ; bit 0 của ô nhớ =1 (số lẻ): bỏ lệnh kế
SRAM có địa chỉ $FF. INC R17 ; số chẵn nên tăng 1 bộ đếm ô chẵn
DEC R16 ; giảm 1 bộ đếm
BRNE LP ; nếu khác 0 thì lặp lại LP
STS $FF, R17 ; cất bộ đếm số chẵn vào ô nhớ $FF
* Chương 3: Tập lệnh ATmega324P BMĐT - 32 - HCMUT Nguyễn Trọng Luật *
4. Lệnh nhảy bỏ qua lệnh kế tiếp nếu bit bằng 0 hay 1:
Mnemonics Operands Operation Words Clocks Note
SBRC Rr, b Rr(b)=0: PCPC+2 (3) 1 1/2/3
r : 0 ÷ 31, b : 0 ÷ 7
SBRS Rr, b Rr(b)=1: PCPC+2 (3) 1 1/2/3
SBIC P, b P(b)=0: PCPC+2 (3) 1 1/2/3 P: 0 ÷ 31, b : 0 ÷ 7
SBIS P, b P(b)=1: PCPC+2 (3) 1 1/2/3 P thanh ghi I/0 có địa chỉ $00÷$1F

LDI YL, 0x00 ; con trỏ ô nhớ (=0100H)


Vd: đếm số ô nhớ chứa giá LDI YH, 0x01
LDI R16, 100 ; bộ đếm (=100)
trị chẵn có trong 100 ô nhớ LDI R17, 0 ; bộ đếm ô chẵn (=0)
SRAM có địa chỉ đầu là LP: LD R18, Y+ ; đọc ô nhớ
$100, kết quả cất vào ô nhớ SBRS R18, 0 ; bit 0 của ô nhớ =1 (số lẻ): bỏ lệnh kế
SRAM có địa chỉ $FF. INC R17 ; số chẵn nên tăng 1 bộ đếm ô chẵn
DEC R16 ; giảm 1 bộ đếm
BRNE LP ; nếu khác 0 thì lặp lại LP
STS $FF, R17 ; cất bộ đếm số chẵn vào ô nhớ $FF

* Chương 3: Tập lệnh ATmega324P BMĐT - 33 - HCMUT Nguyễn Trọng Luật *


Vd: tính giá trị tuyệt đối của 1 số có dấu là nội dung ô nhớ $200. Kết quả cất vào ô nhớ
$201
Y
ĐK LDS R16, $200
N SBRC R16, 7
NEG R16
Lệnh
STS $201, R16

Vd: liên tục kiểm tra chân PA7. Nếu PA7=0 thì nhập dữ liệu từ Port B xuất ra ra Port C,
ngược lại xuất ra Port D (giả sử các Port đã được chọn xuất/nhập)
LAP: IN R16, PINB
Y SBIC PINA, 7
ĐK RJMP XUAT_D ; lệnh kế tiếp là lệnh nhảy
N OUT PORTC, R16
Lệnh nhảy RJMP LAP
XUAT_D: OUT PORTD, R16
RJMP LAP
* Chương 3: Tập lệnh ATmega324P BMĐT - 34 - HCMUT Nguyễn Trọng Luật *
5. Lệnh gọi chương trình con và trở về:
Mnemonics Operands Operation Words Clocks Note
CALL k STACKPC+2, PC  k 2 4 k: 22 bit (0  k  222 = 4M Word)
ICALL STACKPC+1, PC  Z 1 3 Z = 16 bit (216 = 64K Word)
RCALL k STACKPC+1, PCPC+1+k 1 3 k: 12 bit có dấu (-2048  k  +2047)
RET PC STACK 1 4
RETI PC STACK 1 4 Cờ I = 1
 Khi thực hiện lệnh CALL:  Khi thực hiện lệnh RET:
- (SP)  PCL - SP  SP + 1
- SP  SP - 1 - PCH  (SP)
- (SP)  PCH - SP  SP + 1
- SP  SP - 1 - PCL  (SP)
- PC  Địa chỉ CTCon
 PCH và PCL là byte cao và byte thấp của PC hiện hành (địa chỉ lệnh kế tiếp lệnh CALL)
 Lệnh RETI thực hiện giống lệnh RET; nhưng đồng thời làm cho cờ I = 1.
* Chương 3: Tập lệnh ATmega324P BMĐT - 35 - HCMUT Nguyễn Trọng Luật *
Address Code
Ngăn xếp trước khi Ngăn xếp sau khi
.ORG 0x100 thực hiện lệnh CALL thực hiện lệnh CALL
$0100 LDI R16, 5
$0101 LDI R20, $1A
$0102 CALL CTC $8FD $8FD  SP
$0104 STS 0x4FF, R16 $8FE $8FE $01
$0106 CLR R16 $8FF  SP $8FF $04
$0107 LB: RJMP LB
$0108 CTC: ADD R16, R16  PC = $0108
$0109 ADD R16, R20
$010A RET Ngăn xếp trước khi Ngăn xếp sau khi
thực hiện lệnh RET thực hiện lệnh RET

$8FD  SP $8FD
$8FE $01 $8FE
$8FF $04 $8FF  SP
 PC = $0104

* Chương 3: Tập lệnh ATmega324P BMĐT - 36 - HCMUT Nguyễn Trọng Luật *


Vd: viết chương trình con DIV8_8 có nhiệm vụ thực hiện phép chia 2 số 8 bit cho nhau:
số bị chia chứa trong thanh ghi R20 và số chia chứa trong thanh ghi R21. Kết quả thương
số nguyên sau khi chia chứa lại vào thanh ghi R20 và phần dư chứa lại vào thanh ghi
R21.
R20 = 253, R21 = 38  R20 = 6, R21 = 25
/* chương trình con DIV8_8
Input: R20: số bị chia, R21: số chia
Output: R20: thương số, R21: phần dư */
DIV8_8: CLR R22 ; thương số tạm = 0
L1: INC R22
SUB R20, R21
BRCC L1
DEC R22
ADD R20, R21
MOV R21, R20 ; R21 là phần

MOV R20, R22 ; R20 là thương
số
* Chương 3: Tập lệnh ATmega324P BMĐT - 37 - HCMUT Nguyễn Trọng Luật *
 Chương trình con có thể thực hiện trên các thông số nhập (input) và lưu kết quả vào
các thông số xuất (output)
 Input (thông số nhập): trước khi gọi CTcon cần chuyển dữ liệu vào các thông số
này. Thường là các thanh ghi, ô nhớ SRAM, thanh ghi I/O, ..
 Output (thông số xuất): sau khi gọi CTcon dùng các thông số này để làm dữ
liệu. Có thể là các thanh ghi hoặc các cờ trạng thái, ..
 Trong CTcon ngoài các thông số nhập DIV8_8: PUSH R22
(input) hay thông số xuất (output); còn có CLR R22
dùng các thanh ghi khác trong các phép
toán. Nếu muốn bảo toàn nội dung các L1: INC R22
thanh ghi thì có thể đưa nội dung thanh ghi
đó vào stack ở đầu CTcon. Và trả lại nội SUB R20,
R21
dung cho thanh ghi trước lệnh cuối cùng
BRCC L1
trong CTcon là lệnh RET.
 Cũng thực hiện tương tự với thanh ghi DEC R22
SREG khi cần lưu lại trạng thái các cờ. ADD R20,
* Chương 3: Tập lệnh ATmega324P BMĐT - 38 - HCMUT R21 Nguyễn Trọng Luật *
Vd: dùng ctcon .ORG 0
DIV8_8, viết chương LDS R20, $200 ; input: số bị chia R20 = ($200)
trình đổi số nhị phân LDI R21, 10 ; input: số chia R21= 10
1 byte là nội dung ô CALL DIV8_8 ; gọi ctcon DIV8_8
nhớ $200 thành 3 STS $201, R21 ; output: phần dư là BCD
chữ số thập phân hàng đơn vị
LDI R21, 10 ; chia 10 lần thứ 2
(BCD): hàng đơn vị,
CALL DIV8_8 ; gọi ctcon DIV8_8
hàng chục và hàng STS $202, R21 ; phần dư là BCD hàng chục
trăm cất vào lần lượt STS $203, R20 ; thương số là BCD hàng trăm
3 ô nhớ có địa chỉ LP: RJMP LP
$201, $202 và $203. DIV8_8: PUSH R22 ; ctcon DIV8_8
CLR R22  ATmega324P có SP mặc định là
L1: INC R22 SP=$8FF. Một số loại AVR lại có
($200) = $FD = 253
SUB SP=$00. Để tổng quát cho nhiều
R20, R21
• ($203)=$02 = 2 loại AVR khác nhau, ta dùng đoạn
• ($202)=$05 = 5 BRCC L1
• ($201)=$03 = 3 DEC R22 code sau:
.ORG 0
ADD R20, R21
LDI R16, HIGH(RAMEND)
MOV R21, R20OUT SPH, R16
MOV R20, R22LDI R16, LOW(RAMEND)
POP R22 OUT SPL, R16
* Chương 3: Tập lệnh ATmega324P BMĐT - 39 -RET
HCMUT Nguyễn Trọng Luật *
NHÓM LỆNH XỬ LÝ BIT
1. Lệnh SET và CLR bit trong thanh ghi I/0:
Mnemonics Operands Operation Words Clocks Note
SBI P, b I/O(P,b) 1 1 2 P: 0 ÷ 31, b : 0 ÷ 7
CBI P, b I/O(P,b) 0 1 2 P thanh ghi I/0 có địa chỉ $00÷$1F

Vd: viết đoạn chương trình chọn chân PB4 là ngõ vào, và có điện trở kéo lên.
CBI DDRB, 4 ; PB4 là ngõ vào
SBI PORTB, 4 ; PB4 có điện trở kéo lên

Vd: viết chương trình liên tục đảo trạng thái ngõ ra ở chân PD7.
SBI DDRD, 7 ; PD7 là ngõ ra
LP: SBI PORTD, 7 ; PD7 = 1
CBI PORTD, 7 ; PD7 = 0
RJMP LP
* Chương 3: Tập lệnh ATmega324P BMĐT - 40 - HCMUT Nguyễn Trọng Luật *
bit 7 6 5 4 3 2 1 0
2. Lệnh SET và CLR bit trong thanh ghi SREG: SREG I T H S V N Z C

Mnemonics Operands Operation Words Clocks Note


BSET s SREG(s)  1 1 1 s:0÷7
BCLR s SREG(s)  0 1 1 Cờ SREG(s)

Vd: viết đoạn chương trình xóa cờ Carry và cho phép sử dụng ngắt.
BCLR 0 ; cờ C ở vị trí 0 CLC
BSET 7 ; cờ I ở vị trí 7 SEI
 Lệnh riêng SE* hay CL*, với * là tên của cờ: (1W, 1CK)
Mnemonics Description Operation Mnemonics Description Operation
SEC/CLC Set/Clear Carry C1 / C0 SES/CLS Set/Clear Sign S1 / S0
SEZ/CLZ Set/Clear Zero Z1 / Z0 SEH/CLH Set/Clear Half carry H1 / H0
SEN/CLN Set/Clear Negative N1 / N0 SET/CLT Set/Clear Temporary T1 / T0
SEV/CLV Set/Clear oVerflow V1 / V0 SEI/CLI Set/Clear Interrupt I1/ I0

* Chương 3: Tập lệnh ATmega324P BMĐT - 41 - HCMUT Nguyễn Trọng Luật *


3. Lệnh sao chép bit trong thanh ghi GPRs:
Mnemonics Operands Operation Words Clocks Note
BST Rr, b Cờ T  Rr(b) 1 1 r : 0 ÷ 31, b : 0 ÷ 7 , Cờ T
BLD Rd, b Rd(b)  Cờ T 1 1 d : 0 ÷ 31, b : 0 ÷ 7

Vd: sao chép bit 2 của thanh ghi R17 vào bit 5 của thanh ghi R1.
BST R17, 2 ; T  R17(2)
BLD R1, 5 ; R1(5)  T
 Các lệnh xử lý bit chỉ có trên thanh ghi SREG, các thanh ghi GPRs và vùng I/O cơ
bản có địa chỉ $00÷$1F. Vì vậy muốn xử lý trên vùng SRAM khác thì dùng trung
gian qua các thanh ghi GPRs
Vd: sao chép MSB của ô nhớ SRAM có địa chỉ $10F vào LSB của ô nhớ đó.
LDS R20, $10F
BST R20, 7
BLD R20, 0
STS $10F, R20
* Chương 3: Tập lệnh ATmega324P BMĐT - 42 - HCMUT Nguyễn Trọng Luật *
4. Lệnh dịch (Shift) thanh ghi:
Mnemonics Operands Operation Words Clocks Note

d : 0 ÷ 31
LSL Rd 1 1
Cờ: H.S,V,N,Z,C

d : 0 ÷ 31
LSR Rd 1 1
Cờ: S,V,N=0,Z,C

d : 0 ÷ 31
ASR Rd 1 1
Cờ: S,V,N,Z,C

 Lệnh LSL (Logic Shift Left): dịch trái thanh ghi, đồng thời dịch bit b7 vào cờ Carry và
dịch 0 vào bit b0. Kết quả giống như nhân 2 nội dung thanh ghi.
 Lệnh LSR (Logic Shift Right): dịch phải thanh ghi, đồng thời dịch bit b0 vào cờ Carry và
dịch 0 vào bit b7. Kết quả như chia 2 nội dung thanh ghi (số không dấu).
 Lệnh ASR (Arithmetic Shift Right): dịch phải thanh ghi, đồng thời dịch bit b0 vào cờ
Carry và giữ nguyên bit b7 (bit dấu). Kết quả như chia 2 nội dung thanh ghi (số có dấu).
* Chương 3: Tập lệnh ATmega324P BMĐT - 43 - HCMUT Nguyễn Trọng Luật *
Vd: dịch trái thanh ghi R7 cho đến khi C=1, giả sử ban đầu R7 = 25H =00100101
CLC ; R7 = 00100101b = 37, C = 0
 Sau khi dịch có C=1, thì thanh
LSL R7 ; R7 = 01001010b = 74, C = 0
LSL R7 ; R7 = 10010100b = 148, C = 0 ghi không còn chứa giá trị x2
LSL R7 ; R7 = 00101000b = 40 , C = 1

Vd: dịch phải 3 lần thanh ghi R20 (số không dấu)
LDI R20, $25 ; R20 = 00100110b = 38
LSR R20 ; R20 = 00010011b = 19, C = 0
LSR R20 ; R20 = 00001001b = 9, C = 1
LSR R20 ; R20 = 00000100b = 4, C = 1

Vd: dịch phải 2 lần thanh ghi R25 (số có dấu)


LDI R25, $E4 ; R25 = 11100100b = -28
ASR R25 ; R25 = 11110010b = -14, C = 0
ASR R25 ; R25 = 11111001b = -7, C = 0

* Chương 3: Tập lệnh ATmega324P BMĐT - 44 - HCMUT Nguyễn Trọng Luật *


Vd: Viết chương trình con SOBIT_1, có nhiệm vụ đếm số bit 1 có trong thanh ghi R20.
Kết quả cất vào thanh ghi R21.
/* chương trình con SOBIT_1
Input: R20: dữ liệu kiểm tra
Output: R21: số bit 1 */
SOBIT_1: PUSH R16
LDI R16, 8 ; số lần lặp vòng (= 8)
CLR R21 ; bộ đếm bit 1 (= 0)
LAP: LSR R20 ; quay bit vào C LAP: SBRC R20, 0
BRCC TTUC ; C= 0 nhảy đến TTUC INC R21
INC R21 ; C=1 tăng bộ đếm bit 1 LSR R20
TTUC: DEC R16 ; giảm số lần lặp DEC R16
BRNE LAP ; …
POP R16
RET
Có thể dùng lệnh SBRC R20, 0 thay cho việc kiểm tra cờ C
* Chương 3: Tập lệnh ATmega324P BMĐT - 45 - HCMUT Nguyễn Trọng Luật *
5. Lệnh xoay (Rotate) thanh ghi:
Mnemonics Operands Operation Words Clocks Note

d : 0 ÷ 31
ROL Rd 1 1
Cờ: H.S,V,N,Z,C

d : 0 ÷ 31
ROR Rd 1 1
Cờ: S,V,N,Z,C

 Lệnh ROL (Rotate Left): dịch trái thanh ghi, đồng thời dịch bit b7 vào cờ Carry và dịch
cờ Carry vào bit b0. Lệnh này có thể kết hợp với lệnh LSL để x2 toán hạng 16 bit.
Vd: nhân 2 nội dung cặp thanh ghi R21:R20 LSL R20
ROL R21
 Lệnh ROR (Rotate Right): dịch phải thanh ghi, đồng thời dịch bit b0 vào cờ Carry và
dịch cờ Carry vào bit b7. Lệnh này kết hợp với lệnh LSR để chia 2 toán hạng 16 bit.
Vd: chia 2 nội dung LSR R21 ; số không dấu ASR R21 ; số có dấu
cặp thanh ghi R21:R20 ROR R20 ROR R20
* Chương 3: Tập lệnh ATmega324P BMĐT - 46 - HCMUT Nguyễn Trọng Luật *
6. Lệnh hoán đổi 4 bit thấp và 4 bit cao của thanh ghi:
Mnemonics Operands Operation Words Clocks Note
SWAP Rd Rd(7:4)  Rd(3:0) 1 1 d : 0 ÷ 31
Vd: LDI R16, 0b00101101 ; R16 = $2D
SWAP R16 ; R16 = $D2
Vd: viết đoạn chương trình chuyển số BCD không nén (Unpacked BCD) thành số BCD
nén (Packed BCD). Thanh ghi R20 chứa số BCD không nén hàng đơn vị, R21 chứa số
BCD không nén hàng chục. Kết quả số BCD nén (4 bit cao chứa chữ số BCD hàng
chục và 4 bit thấp chứa chữ số hàng đơn vị) cất vào thanh ghi R22.
R20 = $04, R21 = $07 => R22 = $74
MOV R22, R21 ; R22 : BCD hàng chục
SWAP R22 ; hoán đổi
ADD R22, R20 ; R22: BCD nén
 Unpacked BCD là 1 byte chứa 1 chữ số BCD (đặt ở 4 bit thấp), còn 4 bit cao bằng 0.
 Packed BCD là 1 byte chứa 2 chữ số BCD (chữ số trọng số cao hơn đặt ở 4 bit cao).
* Chương 3: Tập lệnh ATmega324P BMĐT - 47 - HCMUT Nguyễn Trọng Luật *
NHÓM LỆNH ĐIỀU KHIỂN MCU
Mnemonics Operands Operation Words Clocks Note
NOP No OPeration 1 1
SLEEP Lệnh cho MCU vào trạng thái NGỦ 1 1
WDR Lệnh làm reset bộ Watchdog 1 1
BREAK Được sử dụng bởi hệ thống gỡ lỗi (Debug) trên chip 1 1

 Lệnh NOP: không thực hiện thao tác gì cả nhưng tốn mất một chu kỳ máy. Lệnh này
thường được sử dụng trong các chương trình tạo trễ.

Vd: Cần tạo trễ 5s. ATmega324P sử NOP


dụng xung clock danh định FOSC = 8MHz NOP
NOP
(CKDIV8=0).
NOP
Một chu kỳ máy là 1/1MHz = 1s. NOP

* Chương 3: Tập lệnh ATmega324P BMĐT - 48 - HCMUT Nguyễn Trọng Luật *


MỘT SỐ VÍ DỤ
Vd1: Viết chương trình liên tục nhập dữ liệu là số có dấu 8 bit từ Port A. Tìm trị tuyệt đối
của nó và xuất ra Port C. Biết rằng chương trình sẽ kết thúc khi giá trị nhập về bằng 0,
giá trị này cũng được xuất ra Port C.
.ORG 0
LAP LDI R16, 0
R16 ← PINA OUT DDRA, R16
KTHUC
LDI R16, $FF
R16 = 0 Y OUT DDRC, R16
N LAP: IN R16, PINA
Y R16? PORTC ← R16 CPI R16, 0 ; TST R16
DƯƠNG BREQ KTHUC
BRPL XUAT ; SBRC R16,7
N END NEG R16
R16 ←Bù 2(R16)
XUAT: OUT PORTC, R16
XUAT RJMP LAP
KTHUC: OUT PORTC, R16
PORTC ← R16
DUNG: RJMP DUNG
* Chương 3: Tập lệnh ATmega324P BMĐT - 49 - HCMUT Nguyễn Trọng Luật *
Vd2: Viết CT thực hiện chức năng điều khiển trạng thái các chân port PB0 đến PB3
thông qua trạng thái của 2 bit PD0 vàPD1, như bảng sau.
.ORG 0 SS1: CPI R20, 1
PD1 PD0 Điều CLR R20 BRNE SS2
khiển OUT DDRD, R20 LDI R22, 0b00000010
0 0 Bù PB0 SER R20 EOR R21, R22
OUT DDRB, R20 RJMP TTUC
0 1 Bù PB1
LAP: IN R21, PORTB SS2: CPI R20, 2
1 0 Bù PB2 IN R20, PIND BRNE SS3
1 1 Bù PB3 ANDI R20, 0b00000011 LDI R22, 0b00000100
CPI R20, 0 EOR R21, R22
BRNE SS1 RJMP TTUC
LDI R22, 0b00000001 SS3: LDI R22, 0b00001000
EOR R21, R22 EOR R21, R22
RJMP TTUC TTUC: OUT PORTB, R21
RJMP LAP

* Chương 3: Tập lệnh ATmega324P BMĐT - 50 - HCMUT Nguyễn Trọng Luật *


Vd3: Viết chương trình liên tục nhập dữ liệu là mã ký tự ASCII từ Port A. Nếu dữ liệu là mã ASCII
của ký tự chữ viết in hoa (có mã ASCII là 41H đến 5AH) thì đổi sang mã ASCII của ký tự chữ viết
thường tương ứng (có mã ASCII từ 61H đến 7AH) và xuất ra Port C. Nếu dữ liệu là mã ASCII chữ
viết thường thì xuất dữ liệu đó ra Port C. Nếu không phải 2 trường hợp trên thì xuất giá trị 0 ra PortC.
61H 7AH
00H FFH
.ORG 0 41H 5AH
XOA
R16 < 41H CLR R16
Y
N OUT DDRA, R16 XUAT: OUT PORTC, R16
IN_HOA COM R16 RJMP LAP
R16 < 5BH OUT DDRC, R16 XOA: CLR R16
Y
N RJMP XUAT
LAP: IN R16, PINA IN_HOA:
Y
R16 < 61H CPI R16, $41 LDI R17, $20
N BRLO XOA ADD R16, R17
CPI R16, $5B RJMP XUAT
Y
R16 ≥ 7BH BRLO IN_HOA
R16← R16+ CPI R16, $61
R16 ← 0 N CPI R16, ’a’
20H
BRLO XOA
XUAT
CPI R16, $7B CPI R16, ’z’+1
* Chương 3: Tập lệnh ATmega324P
BRSH
BMĐT - 51 -
XOA
HCMUT Nguyễn Trọng Luật *
Vd4: Viết chương trình tính tổng chuỗi ô nhớ SRAM bắt đầu từ địa chỉ 200H, biết rằng số ô
nhớ SRAM là nội dung của ô nhớ SRAM có địa chỉ 1FFH (giả sử khác 0). Tổng tính được là 1
số 16 bit được cất vào cặp ô nhớ SRAM có địa chỉ là 1FDH và 1FEH (ô nhớ có địa chỉ cao
chứa byte cao của tổng)
.ORG 0
SumH_SumL = 0 R21:R20 LDI R20, 0 ; R20: SumL = 0
Cdai = (1FFH) R19 MOV R21, R20 ; R21: SumH = 0
ConTro = 200H X LDS R19, $1FF ; R19: Cdai =($1FF)
LAP LDI XL, $00 ; X: Contro =$200
SumL ← SumL + LDI XH, $02
Giảm Cdai
(ConTro) LAP: LD R16, X+ ; R16 = (Contro)
ADD R20, R16
Cdai ≠ 0 BT: làm lại vd4 nhưng
Y BRCC TT
Tăng ConTro tính tổng các byte dữ
N INC R21
(1FEH)_(1FDH) liệu chứa trong 10 ô
TT: DEC R19
C=0 nhớ FLASH từ địa chỉ
Y BRNE LAP
N
← SumH_SumL đầu $400 (mỗi ô nhớ
STS $1FD, R20
Tăng SumH chứa 2 byte). Kết quả
STS $1FE, R21
cất vào cặp ô nhớ
TT END ST: RJMP ST
SRAM như vd4.
* Chương 3: Tập lệnh ATmega324P BMĐT - 52 - HCMUT Nguyễn Trọng Luật *
 TẠO THỜI GIAN TRỄ (Time Delay) bằng vòng lặp:
- Thời gian trễ dùng trong trường hợp MCU cần giao tiếp với ngoại vi, định thì, tạo
xung … Để tạo trễ dùng 1 đoạn lệnh không có tác dụng gì ngoài việc tốn thời gian thực
hiện chúng thông qua thời gian từng lệnh tính theo chu kỳ máy (MC).
- Khi delay chỉ cần vài MC, có thể dùng nhiều lệnh NOP có thời gian thực hiện mỗi
lần là 1 MC. Nếu cần nhiều hơn thì có thể dùng vòng lặp.
Lệnh Chu kỳ máy (MC)
SLV = n LDI R20, n 1
LP LP: DEC R20 1 ×n
Giảm SLV BRNE LP 1/2 × n (nếu nhảy 2MC, ko nhảy 1MC)

SLV ≠ 0 tDL = 1 + (1 + 2) n - 1 = (1 + 2) n (MC) (nmax = 255)


Y
N Vd: Xác định n để tạo trễ 150s. Sử dụng FOSC theo danh định
FOSC = 8MHz  1MC = 1CK tDL = 3n (MC) = 150s  n = 50
CKDIV8 = 0 = 1/1MHz = 1s
 Chú ý khi n = 0: vòng lặp được thực hiện 256 lần
* Chương 3: Tập lệnh ATmega324P BMĐT - 53 - HCMUT Nguyễn Trọng Luật *
Vd5: Viết chương trình tạo sóng vuông có tần số F = 500Hz ở ngõ ra PB7. Sóng vuông
có chu kỳ nhiệm vụ DC = 50%.
PB7 tH tL
T DC (Duty Cycle) = tH / T (%)

LOOP T = 1/F = 1/500Hz = 2ms .ORG 0


PB7 = 1 DC = 50% SBI DDRB, 7 ; PB7 out
 tH = tL = T/2 = 1000µs LOOP: SBI PORTB, 7 ; PB7 = 1
LDI R20, 250 ; delay T/2
Delay tH tDL = 3n = 1000  n = 333 LP1: NOP
mà nmax = 255 DEC R20
PB7 = 0 BRNE LP1
Nên thêm NOP vào vòng lặp
CBI PORTB, 7 ; PB7 = 0
LDI R20, n ; 1 LDI R20, 250 ; delay T/2
Delay tL
LP: NOP ;1 LP2: NOP
DEC R20 ;1 DEC R20
BRNE LP ; 1/2 BRNE LP2
tDL = (1+1+2)n = 4n = 1000  n = 250 RJMP LOOP
* Chương 3: Tập lệnh ATmega324P BMĐT - 54 - HCMUT Nguyễn Trọng Luật *
 Trường hợp tạo xung có DC = 50%, .ORG 0
chương trình có thể viết theo lưu đồ SBI DDRB, 7 ; PB7 out
sau LOOP: IN R21, PORTB ; Bù PB7
LDI R22, 0b10000000
LOOP EOR R21, R22
Bù PB7 OUT PORTB, R21
LDI R20, 250 ; delay T/2
LP: NOP
Delay T/2
DEC R20
BRNE LP
RJMP LOOP
 Đoạn chương trình tạo trễ có thể viết thành chương trình con, để có thể dùng nhiều lần
Vd: Cho chương trình con DELAY
DELAY: LDI R20, 50 Thời gian tạo trễ của chương trình con DELAY cần
LP: NOP tính thêm thời gian thực hiện lệnh RET là 4MC
DEC R20
tDL = (1+1+2)50 + 4 = 204s
BRNE LP
RET ; 4MC
* Chương 3: Tập lệnh ATmega324P BMĐT - 55 - HCMUT Nguyễn Trọng Luật *
.ORG 0
Vd6: Viết chương trình tạo sóng vuông
SBI DDRB, 7 ; PB7 out
có tần số F = 500Hz ở ngõ ra PB7. Sóng LOOP: SBI PORTB, 7 ; PB7 = 1
vuông có chu kỳ nhiệm vụ DC = 20%. RCALL DL400 ; 400s
T = 1/F = 1/500Hz = 2ms = 2000s CBI PORTB, 7 ; PB7 = 0
LDI R19, 4 ; 4 × 400s
tH = 20% × T = 400µs = 4 nH (MC) LP1: RCALL DL400
=> nH = 100 DEC R19
tL = T – tH = 1600µs = 4 × 400s BRNE LP1
RJMP LOOP
Dùng chương trình con DL400 tạo DL400: LDI R20, 99
trễ 400s. Ctcon có lệnh RET là LP2: NOP
4MC, nên tính chính xác thời gian DEC R20
tạo trễ thì giảm 1 lần lặp vòng BRNE LP2
 nH = 99 RET
 Khi chạy chương trình, các lệnh bên ngoài chương trình con cũng tốn một số MC. Nếu
cần tạo xung chính xác, thì cần tính thêm MC của các lệnh này. Nếu chỉ tính thời gian trễ
của chương trình con thì sai số của chương trình là số MC của các lệnh bên ngoài.
* Chương 3: Tập lệnh ATmega324P BMĐT - 56 - HCMUT Nguyễn Trọng Luật *
 Trong trường hợp cần tạo thời gian trễ (tDL = 4n MC) mà số lần lặp vòng n>255. Thì ta
có thể chèn thêm các lệnh NOP vào trong vòng 1 lặp. Tuy nhiên cách này nếu cần nhiều
lệnh NOP thì sẽ tốn nhiều byte lệnh. Thay vào đó ta dùng cách lồng nhiều vòng lặp với
nhau. LDI R21 , m 1
SLV2 = m LP2: LDI R20 , n
LP2 LP1: NOP
4n
SLV1 = n DEC R20
LP1 ×m
BRNE LP1
Giảm SLV1 DEC R21 1
BRNE LP2 1/2 (n, m  255)
SLV1 ≠ 0
Y tDL = 1+ (4n + 3)m -1 = 4mn + 3m (MC)
N
Giảm SLV2 tDL ≈ 4mn (MC)
Công thức tDL ≈ 4mn (MC) có sai số là 3m (MC); nên m
SLV2 ≠ 0
Y càng nhỏ càng ít sai số, ta nên chọn n trước với giá trị lớn
N
nhất có thể được sao cho m và n là nguyên dương
* Chương 3: Tập lệnh ATmega324P BMĐT - 57 - HCMUT Nguyễn Trọng Luật *
Vd7: Viết chương trình tạo sóng vuông có .ORG 0
tần số F = 500Hz ở ngõ ra PB7. Sóng vuông SBI DDRB, 7 ; PB7 out
có chu kỳ nhiệm vụ DC = 20%. Biết rằng LOOP: SBI PORTB, 7 ; PB7 = 1
FOSC = 8MHz và CKDIV8 =1 (chưa lập trình) RCALL DL400 ; 400s
CBI PORTB, 7 ; PB7 = 0
1MC = 1CK = 1/8MHz = 125ns LDI R19, 4 ; 4 × 400s
LP: RCALL DL400
T = 1/F = 1/500Hz = 2ms = 2000s DEC R19
BRNE LP
tH = 20% × T = 400µs = 400000ns
RJMP LOOP
= 4 ×200 × 4 × 125ns
DL400: LDI R21, 4
 chọn n = 200 và m = 4
LP2: LDI R20, 200
tL = T – tH = 1600µs = 4 × 400s LP1: NOP
DEC R20
 Ctcon DL400 có sai số là: BRNE LP1
3m + 4 (MC) = 16 × 125ns = 2000ns = 2s; DEC R21
BRNE LP2
sai số = 2s/400s = 0.005 % RET
* Chương 3: Tập lệnh ATmega324P BMĐT - 58 - HCMUT Nguyễn Trọng Luật *
Vd8: Viết chương trình con DL1s có nhiệm vụ tạo trễ 1s. Với FOSC = 8MHz và CKDIV8 =1
1MC = 1CK = 1/8MHz = 125ns
tDL = 1s = 1000000µs = 1000000000ns = 32 × 250 × 250 × 4 × 125ns

Dùng 3 vòng lặp: n=250, m=250 và vòng lặp thứ 3 với p=32 (n,m,p  255)
DL1s: LDI R22, 32 Thời gian trễ chưa tính lệnh RET
1
LP3: LDI R21, 250
tDL = 1+ (4mn + 3m + 3)p -1
LP2: LDI R20, 250
= 4pmn + 3pm +3p (MC)
LP1: NOP 4mn+3m tDL ≈ 4pmn (MC)
DEC R20
×p  Sai số ctcon DL1s:
BRNE LP1
DEC R21 3pm + 3p + 4 (MC)
BRNE LP2 = 3×32×250 + 3×32 + 4 (MC)
1
DEC R22 = 24096ns
1/2
BRNE LP3
4 sai số = 24096ns/1s = 0.000024 %
RET
* Chương 3: Tập lệnh ATmega324P BMĐT - 59 - HCMUT Nguyễn Trọng Luật *
Vd9: Sử dụng chương trình con SOBIT_1 (trang 45), viết chương trình có nhiệm vụ đếm
số ô nhớ trong vùng nhớ SRAM có số bit 1 bằng số bit 0. Biết rằng vùng nhớ SRAM gồm
100 ô nhớ bắt đầu từ địa chỉ 200H, kết quả cất vào ô nhớ RAM nội có địa chỉ 1FFH
Bđếm = 0 R17
.ORG 0
SL = 100 R16
CLR R17 /* Ctcon SOBIT_1
ConTrỏ = 200H Z
LDI R16, 100Input: R20: dữ liệu ktra
LP
LDI ZH, 0x01Output: R21: số bit 1 */
R20 ← (ConTrỏ) CLR ZL SOBIT_1: PUSH R16
LP: LD R20, Z+ LDI R16, 8
Tăng ConTrỏ RCALL SOBIT_1 CLR R21
Giảm SL CPI R21, 4 LAP: LSR R20
SOBIT_1 BRNE TT BRCC TTUC
INC R17 INC R21
SL ≠ 0
Y
R21 ≠ 4 N TTUC: DEC R16
Y (1FFH) ← Bđếm TT: DEC R16 BRNE LAP
N BRNE LP POP R16
Tăng Bđếm STS 0x1FF, R17 RET
TT END DUNG: RJMP DUNG
* Chương 3: Tập lệnh ATmega324P BMĐT - 60 - HCMUT Nguyễn Trọng Luật *
Vd10: Sử dụng chương trình GIO = 0 (100H)
con DL1s (ở Vd8), viết chương PHUT = 0 (101H)
trình mô phỏng đồng hồ điện tử GIAY = 0 (102H)
với các biến GIO, PHUT, GIAY
là nội dung 3 ô nhớ SRAM có LAP
địa chỉ 100H, 101H và 102H.
Delay1s PHUT ≠ 60
Y
N
Các biến GIO, PHUT, GIAY là Tăng GIAY PHUT = 0
ô nhớ SRAM. Vì vậy muốn tăng
các biến này, cần dùng các Tăng GIO
GIAY ≠ 60
thanh ghi GPR. Để thuận tiện Y
N
dùng 3 thanh ghi R20, R21, GIO ≠ 24
R22 làm bộ đếm giờ, phút, giây. GIAY = 0 Y
N
Khi có bộ đếm nào thay đổi thì GIO = 0
Tăng PHUT
cập nhật vào ô nhớ SRAM.

* Chương 3: Tập lệnh ATmega324P BMĐT - 61 - HCMUT Nguyễn Trọng Luật *


CLR R22 DL1s: PUSH R20
.EQU GIO=$100
STS GIAY, R22 PUSH R21
.EQU PHUT=$101
INC R21 PUSH R22
.EQU GIAY=$102
STS PHUT, R21 LDI R22, 32
.ORG 0
CPI R21, 60 LP3: LDI R21, 250
CLR R20
BRNE LAP LP2: LDI R20, 250
STS GIO, R20
CLR R21
CLR R21
STS PHUT, R21 LP1: NOP
STS PHUT, R21
INC R20 DEC R20
CLR R22
STS GIO, R20 BRNE LP1
STS GIAY, R22
CPI R20, 24 DEC R21
LAP: RCALL DL1s
BRNE LAP BRNE LP2
INC R22
CLR R20 DEC R22
STS GIAY, R22
STS GIO, R20 BRNE LP3
CPI R22, 60
POP R22
BRNE LAP
RJMP LAP POP R21
POP R20
RET
* Chương 3: Tập lệnh ATmega324P BMĐT - 62 - HCMUT Nguyễn Trọng Luật *

You might also like