16. Inter-Integrated Circuit (I2C)
Ngoại vi I2C hỗ trợ đầy đủ các chức năng của chế độ Master và Slave của chuẩn bus I2C. Nó có
thể cấu hình hoạt động với các chức năng sau:
Master và có ngắt có start và stop bit
Master không có ngắt start và stop bit
Slave 10-bit địa chỉ và có ngắt có start và stop bit
Slave 7-bit địa chỉ và có ngắt có start và stop bit
Slave 10-bit địa chỉ không có ngắt có start và stop bit
Slave 7-bit địa chỉ và không có ngắt có start và stop bit
100 trang |
Chia sẻ: phuongt97 | Lượt xem: 401 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Hướng dẫn sử dụng vi điều khiển 8-Bit SG8V1 (Phần 2), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
chọn đích để ghi vào
dst = 0: lưu vào thanh ghi ACC
dst = 1: ghi vào thanh ghi trỏ bởi reg
dest Đích ghi vào, nó là thanh ghi ACC hoặc một thanh ghi chức năng
reg 8-bit vị trí thanh ghi cần truy xuất (00h tới FFh)
imm Giá trị hằng số trong mã lệnh (có thể là 8 hoặc 15 bit)
label Tên nhãn chương trình
Off
18/28 Địa chỉ tương đối (số bù 2) cho các lệnh nhảy tương đố hoặc địa chỉ trực
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 162
tiếp cho các lệnh Call/Branch và Return.
u Không sử dụng hoặc không thay đổi
x Giá trị không cần quan tâm. Mã bit tự tạo ra là giá trị 0.
(reg) Nội dung của reg
[reg][n] Sử dụng bit n của thanh ghi reg
= Gán giá trị
[ ] Trường bit trong thanh ghi
|| Ghép chuỗi các bit
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 163
19.2. Thanh ghi cờ phép toán
Tên Bit R/W Mô tả
Không sử dụng
[7:3] R
Z
[2] R/W
Cờ không
0: kết quả không bằng 0
1: kết quả bằng 0
HC
[1] R/W
Cờ nhớ một nửa (Half-Carry)
0: không có chuyển số nhớ từ số thấp qua số cao
1: có chuyển số nhớ từ số thấp qua số cao
C
[0] R/W
Cờ nhớ/Cờ mượn (Carry / Borrow)
0: không có cờ nhớ tại ngõ ra
1: có cờ nhớ tại ngõ ra
19.3. Tóm tắt tập lệnh
Bảng 19-2 liệt kê tất cả các lệnh của VĐK SG8V1
Bảng 19-2: Tập lệnh SG8V1
Tên Đối số Chức năng Cờ ảnh hưởng
Nhóm số học
ADDI imm ACC = (ACC) + imm C, HC, Z
ADDR reg, dst, bse dest = (ACC) + (reg) C, HC, Z
ADDRC reg, dst, bse dest = (ACC) + (reg) + C C, HC, Z
DEC reg, dst, bse dest = (reg) - 1 C, HC, Z
INC reg, dst, bse dest = (reg) + 1 C, HC, Z
MULI imm HI:LO = (ACC) x imm không
MULR reg, bse HI:LO = (ACC) x (reg) không
SUBAR reg, dst, bse dest = (ACC) - (reg) C, HC, Z
SUBARC reg, dst, bse dest = (ACC) - (reg) - C C, HC, Z
SUBI imm ACC = (ACC) - imm C, HC, Z
SUBRA reg, dst, bse dest = (reg) - (ACC) C, HC, Z
SUBRAC reg, dst, bse dest = (reg) - (ACC) - C C, HC, Z
Nhóm lo-gic
ANDI imm ACC = (ACC) AND imm Z
ANDR reg, dst, bse dest = (ACC) AND (reg) Z
BCLR reg, bit, bse R[bit] = 0 không
BSET reg, bit, bse R[bit] = 1 không
CLR reg, bse R = 00h Z
CPL reg, dst, bse dest = NOT (reg) Z
DA
HC_tmp || ACC[3:0] = ([ACC[3:0] > 9] và [HC = 1])
?(ACC [3:0]) + 6 : ACC [3:0])
ACC [7:4] = ([ACC [7:4] > 9] và [C = 1]) ? (ACC
[7:4]) + 6 + HC_tmp; C = 1 : (ACC [7:4]) + HC_tmp
C
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 164
NOP không làm gì cả không
ORI imm ACC = (ACC) OR imm Z
ORR reg, dst, bse dest = (ACC) OR (reg) Z
RL reg, dst, bse dest[7:0] = R[6:0] || R[7] Z
RLC reg, dst, bse C || dest[7:0] = R[7:0] || C C, Z
RR reg, dst, bse dest[7:0] = R[0] || R[7:1] Z
RRC reg, dst, bse C || dest[7:0] = R[0] || C || R[7:1] C, Z
SET reg, bse R = FFh không
XCHD reg, dst, bse dest [7:0] = R[3:0] || R[7:4] không
XORI imm ACC = (ACC) XOR imm Z
XORR reg, dst, bse dest = (ACC) XOR (reg) Z
Nhóm rẽ nhánh chương trình
BRC n C=1; PC = (PC) + 1 + off8 không
BRNC n C=0; PC = (PC) + 1 + off8 không
BRNZ n Z=0; PC = (PC) + 1 + off8 không
BRZ n Z=1; PC = (PC) + 1 + off8 không
BTBC reg, bit, bse R[bit] = 0; bỏ qua lệnh tiếp theo không
BTBS reg, bit, bse R[bit] = 1; bỏ qua lệnh tiếp theo không
DBNZ reg, dst, bse
dest = (reg) - 1
IF dest ≠ 0; bỏ qua lệnh tiếp theo
không
DBZ reg, dst, bse
dest = (reg) - 1
IF dest = 0; bỏ qua lệnh tiếp theo
không
IBNZ reg, dst, bse
dest = (reg) + 1
IF dest ≠ 0; bỏ qua lệnh tiếp theo
không
IBZ reg, dst, bse
dest = (reg) + 1
IF dest = 0; bỏ qua lệnh tiếp theo
không
JMPA PC = (PC) + 1 + (TPS,ACC) không
RET PC = (TS) không
RETA imm
PC = (TS)
ACC = imm
không
RETI
PC = (TS)
GIE/GIEH = 1 hoặc PIE/GIEL = 1
không
SCALL n
PC = (PC) + 1 + off11
TS = (PC) + 1
không
SJMP n PC = (PC) + 1+ off11 không
TBZ IF (reg) = 0, bỏ qua lệnh tiếp theo
không
LCALL imm
PC = imm
không
TS = (PC) + 2
LJMP imm PC = imm không
Nhóm điều khiển hệ thống
IDLE
00h → WDT postscaler,
0 → WDT prescaler,
0 → WDTO,
1 → PWD
WDTO, PWD
CLRWDT
000h → WDT,
000h → WDT postscaler,
0→ WDTO,
0→ PWD
WDTO, PWD
PUSH TS = (PC) + 1, tăng con trỏ Stack không
POP Xóa (TS), giảm con trỏ Stack không
Nhóm sao chép dữ liệu
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 165
IDP0 imm
DPH0 = imm[13:8]
không
DPL0 = imm[7:0]
IDP1 imm
DPH1 = imm[13:8]
không
DPL1 = imm[7:0]
IBS imm BS = imm[5:0] không
IACC imm ACC = imm không
IDPOFF imm DPOFF = imm không
LD reg, bse ACC = (reg) Z
ST reg, bse R = (ACC) không
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 166
19.4. Hoạt động của lệnh
Giải thích các giá trị giới hạn cho các đối số:
0 ≤ reg ≤ 255
0 ≤ imm ≤ 255
-128 ≤ Off8 ≤ 127
-1024 ≤ Off11 ≤ 1023
0 ≤ dst ≤ 1
0 ≤ bse ≤ 1
0 ≤ bit ≤ 7
Các chú ý đối với tập lệnh:
Đối với những lệnh có bit d trong mã lệnh (bit thứ [9]), thì nếu d = 0, kết quả sẽ lưu lại trong
thanh ghi ACC. Nếu d = 1 thì kết quả sẽ lưu lại trong thanh ghi reg.
Đối với những lệnh có bit e trong mã lệnh (bit thứ [8]), nếu bit e = 0, thì băng bộ nhớ 0 sẽ được
chọn. Nếu e = 1 thì băng bộ nhớ được chọn sẽ phụ thuộc giá trị của thanh ghi BS.
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 167
ADDI - ADD constant to ACC
ADDI imm
OPCODE imm (constant)
15 7 08
OPCODE = 0000_1111
ACC = (ACC) + imm
Cộng nội dung của thanh ghi tích lũy ACC với giá trị tức thời trong mã lệnh. Kết quả lưu trong
thanh ghi ACC.
Các bit cờ ảnh hưởng: C, HC, Z
ADDI 0x15; Trước lệnh: ACC = 10h
Sau lệnh: ACC = 25h
ADDR - ADD ACC to reg
ADDR reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0010_01
Cộng nội dung của thanh ghi tích lũy ACC với nội dung thanh ghi reg. Vị trí lưu kết quả phụ
thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
dest = (ACC) + (reg)
Các bit cờ ảnh hưởng: C, HC, Z
ADDR REG, 0, 0 Trước lệnh: ACC = 17h, REG = 0C2h
Sau lệnh: ACC = 0D9h, REG= 0C2h
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 168
ADDRC - ADD ACC and Carry bit to reg
ADDRC reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0010_00
dest = (ACC) + (reg) + C
Cộng nội dung của thanh ghi tích lũy ACC với nội dung thanh ghi reg và cờ nhớ. Vị trí lưu kết
quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: C, HC, Z
ADDRC REG, 0, 0 Trước lệnh: Carry bit = 1, REG = 02h, ACC = 4Dh
Sau lệnh: Carry bit = 0, REG = 02h, ACC = 50h
ANDI - AND constant to ACC
ANDI imm
OPCODE imm (constant)
15 7 08
OPCODE = 0000_1011
ACC = (ACC) AND imm
Nội dung của thanh ghi tích lũy ACC được AND với giá trị tức thời trong mã lệnh. Kết quả lưu
trong thanh ghi ACC.
Các bit cờ ảnh hưởng: Z
ANDI 0x5F Trước lệnh: ACC = A3h
Sau lệnh: ACC = 03h
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 169
ANDR - AND ACC to reg
ANDR reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
\
OPCODE = 0001_01
dest = (ACC) AND (reg)
Nội dung của thanh ghi tích lũy ACC được AND nội dung thanh ghi reg. Vị trí lưu kết quả phụ
thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z
ANDR REG, 0, 0 Trước lệnh: ACC = 17h, REG = C2h
Sau lệnh: ACC = 02h, REG = C2h
BCLR - Bit Clear reg
BCLR reg, bit, bse
OPCODE bit bse reg
15 11 9 8 7 012
OPCODE = 1001
R[bit] = 0
Tong thanh ghi reg, tại vị trí bit, giá trị sẽ bị xóa 0. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
BCLR REG, 6, 0 Trước lệnh: REG = C7h
Sau lệnh: REG = 87h
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 170
BRC - Branch if Carry
BRC off8
OPCODE off8
15 7 08
OPCODE = 1110_0010
IF C=1 then
PC = (PC) + 1 + off8
Else
PC = (PC) + 1
Nếu cờ nhớ C = 1 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu
dạng bù 2. Lệnh này là một lệnh 2 chu kỳ.
Các bit cờ ảnh hưởng: không có
BRC 5 Trước lệnh: PC = địa chỉ lệnh BRC
Sau lệnh: Nếu Carry = 1; PC = address (HERE + 6)
Nếu Carry = 0; PC = address (HERE + 1)
BRNC - Branch if Not Carry
BRNC off8
OPCODE off8
15 7 08
OPCODE = 1110_0011
IF C=0 then
PC = (PC) + 1 + off8
Else
PC = (PC) + 1
Nếu cờ nhớ C = 0 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu
dạng bù 2. Lệnh này là một lệnh 2 chu kỳ.
Các bit cờ ảnh hưởng: không có
BRNC TARGET Trước lệnh: PC = địa chỉ lệnh BRNC
Sau lệnh: Nếu Carry = 0; PC = address (TARGET)
Nếu Carry = 1; PC = address (TARGET)
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 171
BRNZ - Branch if Not Zero
BRNZ off8
OPCODE off8
15 7 08
OPCODE = 1110_0001
IF Z=0 then
PC = (PC) + 1 + off8
Else
PC = (PC) + 1
Nếu cờ không Z = 0 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu
dạng bù 2. Lệnh này là một lệnh 2 chu kỳ.
Các bit cờ ảnh hưởng: không có
BRNZ TARGET Trước lệnh: PC = địa chỉ lệnh BRNZ
Sau lệnh: Nếu Zero = 0; PC = address (TARGET)
Nếu Zero = 1; PC = address (TARGET)
BRZ - Branch if Zero
BRZ off8
OPCODE off8
15 7 08
OPCODE = 1110_0000
IF Z=1 then
PC = (PC) + 1 + off8
Else
PC = (PC) + 1
Nếu cờ không Z = 1 thì chương trình sẽ rẽ nhánh đến địa chỉ đích mới. Giá trị off8 là số có dấu
dạng bù 2. Lệnh này là một lệnh 2 chu kỳ.
Các bit cờ ảnh hưởng: không có
BRZ TARGET Trước lệnh: PC = địa chỉ lệnh BRZ
Sau lệnh: Nếu Zero = 1; PC = address (TARGET)
Nếu Zero = 0; PC = address (TARGET)
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 172
BSET - Bit Set reg
BSET reg, bit, bse
OPCODE bit bse reg
15 11 9 8 7 012
OPCODE = 1000
R[bit] = 1
Tong thanh ghi reg, tại vị trí bit, giá trị sẽ được gán lên 1. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
BSET REG, 7, 1 Trước lệnh: REG = 0Ah
Sau lệnh: REG = 8Ah
BTBC - Bit Test reg, Bypass if Clear
BTBC reg, bit, bse
OPCODE bit bse reg
15 11 9 8 7 012
OPCODE = 1011
IF (R[bit] = 0) bỏ qua lệnh tiếp theo
Tong thanh ghi reg, tại vị trí bit, nếu giá trị của bit này bằng 0 thì lệnh tiếp theo sẽ không được
thực thi. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
BTBC FLAG, 1, 0 Trước lệnh: PC = địa chỉ của BTBC
Sau lệnh: Nếu FLAG[1] = 0; PC = PC + 2
Nếu FLAG[1] = 1; PC = PC + 1
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 173
BTBS - Bit Test reg, Bypass if Set
BTBS reg, bit, bse
OPCODE bit bse reg
15 11 9 8 7 012
OPCODE = 1010
IF (R[bit] = 1) bỏ qua lệnh tiếp theo
Tong thanh ghi reg, tại vị trí bit, nếu giá trị của bit này bằng 1 thì lệnh tiếp theo sẽ không được
thực thi. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: không có
BTBS FLAG, 1, 0 Trước lệnh: PC = địa chỉ của BTBS
Sau lệnh: Nếu FLAG[1] = 1; PC = PC + 2
Nếu FLAG[1] = 0; PC = PC + 1
CLR - Clear reg
CLR reg, bse
OPCODE bse reg
15 9 8 7 0
OPCODE = 0110_101
IF (reg > ACC) bỏ qua lệnh tiếp theo
Xóa nội dung của thanh ghi reg về 0. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z
CLR REG,1 Trước lệnh: REG = 7Fh, Z = ?
Sau lệnh: REG = 00h, Z = 1
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 174
CLRWDT - Clear Watchdog Timer
CLRWDT
OPCODE
15 0
OPCODE = 0000_0000_0000_0100
WDT postscaler = 000h
WDT prescaler = 000h
WDTO = 0
PWD = 1
Xóa nội dung của bộ đếm Watchdog về 0.
Các bit cờ ảnh hưởng: WDTO, PWD
CLRWDT Trước lệnh: WDT Counter = ?
Sau lệnh: WDT Counter = 00h, WDT Postscaler = 0, WDTO = 0, PWD = 0
CPL - Complement reg
CPL reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0001_11
dest = NOT (reg)
Lấy bù 1 của nội dung thanh ghi reg. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được
lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z
CPL REG, 0, 0 Trước lệnh: REG = 00h
Sau lệnh: REG = 00h, ACC = FFh
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 175
DA - Decimal Adjust ACC Register
DA
OPCODE
15 0
OPCODE = 0000_0000_0000_0111
HC_tmp || ACC[3:0] = ([ACC[3:0] > 9] và [HC = 1]) ?(ACC [3:0]) +
6 : ACC [3:0])
ACC [7:4] = ([ACC [7:4] > 9] và [C = 1]) ? (ACC [7:4]) + 6 +
HC_tmp; C = 1 : (ACC [7:4]) + HC_tmp
Sau khi thực hiện các phép toán trên các số BCD, lệnh này chỉnh sửa giá trị trong thanh ghi ACC
cho đúng với BCD. Kết quả được lưu lại thanh ghi ACC.
Các bit cờ ảnh hưởng: C
DA Trước lệnh: ACC = B3h, C = 0, HC = 0
Sau lệnh: ACC = 13h, C = 1, HC = 0
DBNZ - Decrement reg, Bypass if not 0
DBNZ reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0100_11
dest = (reg)- 1
IF (dest ≠ 0) bỏ qua lệnh tiếp theo
Giảm nội dung thanh ghi reg đi 1 đơn vị. Nếu kết quả sau khi giảm khác 0 thì bỏ qua lệnh tiếp
theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ.
Các bit cờ ảnh hưởng: không có
DBNZ TEMP, 1, 0 Trước lệnh: TEMP = ?
Sau lệnh: TEMP = TEMP – 1
If TEMP = 0
PC = (PC) + 1
If TEMP ≠ 0;
PC = (PC) + 2
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 176
DBZ - Decrement reg, Bypass if 0
DBZ reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0010_11
dest = (reg)- 1
IF (dest = 0) bỏ qua lệnh tiếp theo
Giảm nội dung thanh ghi reg đi 1 đơn vị. Nếu kết quả sau khi giảm bằng 0 thì bỏ qua lệnh tiếp
theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ.
Các bit cờ ảnh hưởng: không có
DBZ TEMP, 1, 0 Trước lệnh: TEMP = ?
Sau lệnh: TEMP = TEMP – 1
If TEMP ≠ 0
PC = (PC) + 1
If TEMP = 0;
PC = (PC) + 2
DEC - Decrement reg
DEC reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0000_01
dest = (reg)- 1
Giảm nội dung thanh ghi reg đi 1 đơn vị. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng
được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: C, HC, Z
DEC CNT, 1, 0 Trước lệnh: CNT = 01h, Z = 0
Sau lệnh: CNT = 00h, Z = 1
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 177
IACC - Immediate value to ACC
IACC imm
OPCODE imm (constant)
15 7 08
OPCODE = 0000_1110
ACC = imm
Nạp nội dung 8-bit cho thanh ghi ACC. Kết quả lưu vào thanh ghi ACC.
Các bit cờ ảnh hưởng: không có
IACC 0x3C Trước lệnh: ACC = ?
Sau lệnh: ACC = 3Ch
IBZ - Increment reg, Bypass if not 0
IBNZ reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0100_10
dest = (reg)+ 1
IF (dest ≠ 0) bỏ qua lệnh tiếp theo
Tăng nội dung thanh ghi reg lên 1 đơn vị. Nếu kết quả sau khi tăng khác 0 thì bỏ qua lệnh tiếp
theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ.
Các bit cờ ảnh hưởng: không có
IBNZ REG, 1, 0 Trước lệnh: PC = địa chỉ lệnh IBNZ
Sau lệnh: If REG ≠ 0;
PC = (PC) + 2
If REG = 0;
PC = (PC) + 1
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 178
IBS - Immediate value to Bank Select
IBS imm
OPCODE imm (constant)
15 7 08
00
6 5
OPCODE = 0000_0001
BS = imm
Nạp nội dung 6 bit cho thanh ghi chọn băng BS. Kết quả lưu vào thanh ghi BS.
Các bit cờ ảnh hưởng: không có
IBS 0x01 Trước lệnh: BS = ?
Sau lệnh: BS = 01h
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 179
IBZ - Increment reg, Bypass if 0
IBZ reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0011_11
dest = (reg)+ 1
IF (dest = 0) bỏ qua lệnh tiếp theo
Tăng nội dung thanh ghi reg lên 1 đơn vị. Nếu kết quả sau khi tăng bằng 0 thì bỏ qua lệnh tiếp
theo. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Chú ý: lệnh sẽ tốn 3 chu kỳ để thực hiện nếu lệnh theo sau lệnh này là lệnh 2 chy kỳ.
Các bit cờ ảnh hưởng: không có
IBZ REG, 1, 0 Trước lệnh: PC = địa chỉ lệnh IBZ
Sau lệnh: If REG =0;
PC = (PC) + 2
If REG ≠ 0;
PC = (PC) + 1
IDLE - Enter Idle Mode
IDLE
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0011_11
WDT postscaler = 000h
WDT prescaler = 000h
WDTO = 0
PWD = 1
Đưa thiết bị về chế độ tiết kiệm năng lượng. Trong trạng thái này thì các ngoại vi không bắt buộc
phải chạy sẽ được tắt xung clock (chi tiết xem mục Chế độ tiết kiệm năng lượng (IDLE Mode)).
Các bit cờ ảnh hưởng: không có
IDLE Trước lệnh: WDTO = ?, PWD = ?
Sau lệnh: WDTO = 0 *, PWD = 1
* Nếu thiết bị đánh thức bởi Watchdog thì bit này sẽ được gán lên 1.
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 180
IDP0 - Immediate value to Data Pointer 0
IDP0 imm
OPCODE1 imm [13:8] (constant)
15 9 010
0
8 7
OPCODE1 = 1101_00
OPCODE2 imm [7:0]
15 11 012
0
6 5
OPCODE2 = 0111
DPH0 = imm[13:8]
DPL0 = imm[7:0]
Nạp nội dung 14 bit cho cặp thanh ghi DPH0 và DPL0 của con trỏ số 0.
Các bit cờ ảnh hưởng: không có
IDP0 0x100 Trước lệnh: DPH0 = ?, DPL0 = ?
Sau lệnh: DPH0 = 01h, DPL0 = 00h
IDP1 - Immediate value to Data Pointer 1
IDP1 imm
OPCODE1 imm [13:8] (constant)
15 9 010
0
8 7
OPCODE1 = 1101_01
OPCODE2 imm [7:0]
15 11 012
0
6 5
OPCODE2 = 0111
DPH1 = imm[13:8]
DPL1 = imm[7:0]
Nạp nội dung 14 bit cho cặp thanh ghi DPH1 và DPL1 của con trỏ số 1.
Các bit cờ ảnh hưởng: không có
IDP1 0x234 Trước lệnh: DPH1 = ?, DPL1 = ?
Sau lệnh: DPH1 = 02h, DPL1 = 34h
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 181
IDPOFF - Immediate value to Data Pointer Offset
IDPOFF imm
OPCODE imm (constant)
15 7 08
OPCODE = 1110_0111
IDPOFF 0xA1
Nạp nội dung 8-bit cho thanh ghi DPOFF. Kết quả lưu vào thanh ghi DPOFF.
Các bit cờ ảnh hưởng: không có
IDPOFF 0xA1 Trước lệnh: DPOFF = ?
Sau lệnh: DPOFF = A1h
INC - Increment reg
INC reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0010_10
dest = (reg)+ 1
Tăng nội dung thanh ghi reg lên 1 đơn vị. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst. Băng
được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: C, HC, Z
INC COUNT, 1, 0 Trước lệnh: COUNT = FFh, Z = 0, C = ?, HC= ?
Sau lệnh: COUNT = 00h, Z = 1, C = 1, HC = 1
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 182
JMPA - Jump with ACC
JMPA
OPCODE 0
15 7 08
OPCODE = 1110_0110
PC = (PC) + 1 + (TPS,ACC)
Nhảy đến địa chỉ bất cứ vị trí nào trong bộ nhớ chương trình. Nội dung của PC + 1 được cộng với
nội dung cặp thanh ghi TPS và ACC. Trong đó, TPS là các bit cao, còn ACC là các bit thấp.
Chú ý: nếu nội dung của thanh ghi TPS hoặc ACC thay đổi thì phải trễ sau 1 chu kỳ mới được
phép thực hiện lệnh JMPA.
Các bit cờ ảnh hưởng: không có
JMPA Trước lệnh: PC = địa chỉ lệnh JMPA, ACC = 08h, TPS = 00h
Sau lệnh: PC = (PC) + 9, ACC = 08h, TPS = 00h
LCALL - Long Subroutine Call
LCALL imm
OPCODE imm [7:0]
15 7 08
OPCODE1 = 1110_0101
OPCODE2 imm [7:0]
15 8 012
0
711
OPCODE2 = 0111
PC = target16
TS = (PC) + 2
Gọi chương trình con tại bất cứ vị trí nào trong bộ nhớ chương trình. Trước khi nhảy đến chương
trình con thì địa chỉ (PC) + 2 sẽ được lưu lại trong Stack. Sau đó chương trình sẽ tiếp tục tại vị trí
của chương trình con.
Các bit cờ ảnh hưởng: không có
LCALL FUNCTION Trước lệnh: PC = địa chỉ lệnh LCALL
Sau lệnh: PC = địa chỉ của FUCNTION
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 183
Ld - Load reg to ACC
LD reg, bse
OPCODE 0 bse reg
15 10 9 8 7 0
OPCODE = 0101_00
PC = target16
TS = (PC) + 2
Nạp thanh ghi tích lũy ACC giá trị của thanh ghi reg.
Các bit cờ ảnh hưởng: Z
LD REG, 0 Trước lệnh: ACC = ?, REG = 55h
Sau lệnh: ACC = 00h, REG = 00h, Z = 1
LJMP - Long Jump
LJMP imm
OPCODE imm [7:0]
15 7 08
OPCODE1 = 1110_0100
OPCODE2 imm [7:0]
15 8 012
0
711
OPCODE2 = 0111
PC = target16
Nhảy đến vị trí bất kỳ trong bộ nhớ chương trình. Sau đó chương trình sẽ tiếp tục tại vị trí của
nhảy đến.
Các bit cờ ảnh hưởng: không có
LJMP THERE Trước lệnh: PC = địa chỉ lệnh LJMP
Sau lệnh: PC = địa chỉ của THERE
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 184
MULI - Multiply Constant with ACC
MULI imm
OPCODE imm (constant)
15 7 08
OPCODE = 0000_1101
HI:LO = (ACC) x imm
Thực hiện phép toán nhân không dấu giữa thanh ghi tích lũy ACC và giá trị tức thời trong mã
lệnh. Kết quả phép nhân được lưu vào cặp thanh ghi HI:LO. Với HI là phần 8-bit cao của tích và
LO là phần 8-bit thấp của tích.
Các bit cờ ảnh hưởng: không có
MULI 0x3C Trước lệnh: ACC = A8h, HI = ?, LO = ?
Sau lệnh: ACC = A8h, HI = 27h, LO = 60h
MULR - Multiply reg with ACC
MULR reg, bse
OPCODE bse reg
15 9 8 7 0
OPCODE = 0000_001
HI:LO = (ACC) x (reg)
Thực hiện phép toán nhân không dấu giữa thanh ghi tích lũy ACC và thanh ghi reg. Kết quả phép
nhân được lưu vào cặp thanh ghi HI:LO. Với HI là phần 8-bit cao của tích và LO là phần 8-bit
thấp của tích.
Các bit cờ ảnh hưởng: không có
MULR REG, 1 Trước lệnh: ACC = C4h, REG = D1h, HI =?, LO = ?
Sau lệnh: ACC = C4h, REG = D1h, HI = A0h, LO = 04h
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 185
NOP - No Operation
NOP
OPCODE
15 0
OPCODE = 0000_0000_0000_0000
Không làm gì cả
Lệnh này không thực hiện bất cứ thay đổi nào trong trạng thái hệ thống. Sau lệnh này chỉ tăng giá
trị của PC lên thôi.
Các bit cờ ảnh hưởng: không có
NOP Sau lệnh: không thay đổi trạng thái
ORI - OR Constant with ACC
ORI imm
OPCODE imm (constant)
15 7 08
OPCODE = 0000_1001
ACC = (ACC) OR imm
Thực hiện OR nội dung của thanh ghi tích lũy ACC với giá trị tức thời trong mã lệnh.
Các bit cờ ảnh hưởng: Z
ORI 0x35 Trước lệnh: ACC = 9Ah
Sau lệnh: BFh
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 186
ORR - OR ACC with reg
ORR reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0001_00
dest = (ACC) OR (reg)
Thực hiện OR nội dung của thanh ghi tích lũy ACC với nội dung của thanh ghi reg. Vị trí lưu kết
quả phụ thuộc vào giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z
ORR REG, 0, 1 Trước lệnh: REG = 13h, ACC = 91h
Sau lệnh: REG = 13h, ACC = 93h
POP - Pop Top of Return Stack
POP
OPCODE
15 0
OPCODE = 0000_0000_0000_0110
Xóa (TS), giảm con trỏ Stack
Lấy một mục ra khỏi Stack đồng thời giảm giá trị của con trỏ đọc Stack đi 1 đơn vị.
Các bit cờ ảnh hưởng: không có
POP Trước lệnh: TS = 31A2h, Stack (thấp hơn 1 mức) = 4332h
SJMP NEW Sau lệnh: TS = 4332h, PC = địa chỉ của NEW
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 187
PUSH - Push Top of Return Stack
PUSH
OPCODE
15 0
OPCODE = 0000_0000_0000_0101
TS = (PC) + 1, tăng con trỏ Stack
Đẩy giá trị của (PC) + 1 vào Stack đồng thời tăng giá trị của con trỏ lên 1 đơn vị.
Các bit cờ ảnh hưởng: không có
PUSH Trước lệnh: TS = 345Ah, PC = 0124h
Sau lệnh: PC = 0126h, TS = 0126h, Stack (thấp hơn 1 mức) = 345Ah
RET - Return from Subroutine
RET
OPCODE
15 0
OPCODE = 0000_0000_0000_0010
PC = (TS)
Trở về từ chương trình con, địa chỉ PC được cập nhật với giá trị nhận được từ Stack.
Các bit cờ ảnh hưởng: không có
RETA k0 Trước lệnh: ACC = ?
Sau lệnh: ACC = k0
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 188
RETI - Return from Interrupt
RETI
OPCODE
15 0
OPCODE = 0000_0000_0001_0000
PC = (TS)
GIE/GIEH = 1 hoặc PIE/GIEL = 1
Trở về từ chương trình xử lý ngắt, Stack được đọc ra và giảm địa chỉ con trỏ Stack. Giá trị đọc từ
Stack sẽ được cập nhật cho thanh ghi bộ đếm chương trình PC.
Các bit cờ ảnh hưởng: không có
RETI Trước lệnh: PC = địa chỉ lệnh RETI
Sau lệnh: PC = (TS), GIE/GIEH, PIE/GIEL = 1
RL - Rotate Left reg (no carry)
RL reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0100_01
dest[7:0] = R[6:0] || R[7]
Nội dung của thanh ghi reg được xoay trái 1 bit. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst.
Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z
RL REG, 1, 0 Trước lệnh: REG = 1010 1011
Sau lệnh: REG = 0101 0111
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 189
RLC - Rotate Left reg through Carry
RLC reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0011_01
C || dest[7:0] = R[7:0] || C
Nội dung của thanh ghi reg được xoay trái 1 bit qua cờ nhớ C. Vị trí lưu kết quả phụ thuộc vào
giá trị bit dst. Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z, C
RLC REG, 0, 0 Trước lệnh: REG = 1110 0110, ACC = ?, C = 0
Sau lệnh: REG = 1110 0110, ACC = 1100 1100, C = 1
RR - Rotate Right reg (no carry)
RR reg, dst, bse
OPCODE dst bse reg
15 10 9 8 7 0
OPCODE = 0100_00
dest[7:0] = R[0] || R[7:1]
Nội dung của thanh ghi reg được xoay phải 1 bit. Vị trí lưu kết quả phụ thuộc vào giá trị bit dst.
Băng được lựa chọn phụ thuộc bit bse.
Các bit cờ ảnh hưởng: Z
RR REG, 0, 0 Trước lệnh: ACC = ?, REG = 1101 0111
Sau lệnh: ACC = 1110 1011, REG = 1101 0111
Tập lệnh
© 2012 ICDREC SG8V1 - Hướng dẫn sử dụng 190
RRC - Rotate Right reg through Carry
RRC reg, dst, bse
OPCODE dst bse reg
15 10
Các file đính kèm theo tài liệu này:
- huong_dan_su_dung_vi_dieu_khien_8_bit_sg8v1_phan_2.pdf