Professional Documents
Culture Documents
P (Full) C3 TapLenhATmega324P
P (Full) C3 TapLenhATmega324P
TẬP LỆNH
MCU ATmega324P
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ố
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
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
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
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
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
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
Để 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 (NV) để
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
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
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 STACKPC+2, PC k 2 4 k: 22 bit (0 k 222 = 4M Word)
ICALL STACKPC+1, PC Z 1 3 Z = 16 bit (216 = 64K Word)
RCALL k STACKPC+1, PCPC+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
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
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 C1 / C0 SES/CLS Set/Clear Sign S1 / S0
SEZ/CLZ Set/Clear Zero Z1 / Z0 SEH/CLH Set/Clear Half carry H1 / H0
SEN/CLN Set/Clear Negative N1 / N0 SET/CLT Set/Clear Temporary T1 / T0
SEV/CLV Set/Clear oVerflow V1 / V0 SEI/CLI Set/Clear Interrupt I1/ I0
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
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ễ.
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.