Professional Documents
Culture Documents
HCM
Khoa Điện – Điện Tử Viễn Thông
Học phần: Vi Xử Lý
3. Tập lệnh.
Taát caû caùc hoï vi xöû lyù khaùc nhau coù theå thöïc hieän ñöôïc moïi
coâng vieäc maø ta coù theå thaáy trong cuoäc soáng, töø ñieàu khieån
caùc quaù trình phöùc taïp, truyeàn thoâng, troø chôi ñieän töû…
Moät caâu hoûi ñaët ra laø: vaäy thì caùi gì ñaëc tröng cho boä vi xöû
lyù ñeå noù coù theå thöïc hieän chöùc naêng rieâng bieät cuûa vi xöû lyù.
Ñoù chính laø phaàn meàm (software), hay chöông trình.
4
1. Chương trình
- Chöông trình (program) laø chuoãi caùc caâu leänh hay phaùt bieåu ñöôïc
vieát trong moät daïng ñaëc thuø (ngoân ngöõ laäp trình). Caùc leänh naøy khi
ñöôïc thöïc hieän bôûi vi xöû lyù seõ thöïc hieän nhöõng thao taùc nhaát ñònh vôùi
keát quaû ñoaùn tröôùc ñöôïc.
- Coù nhieàu loaïi ngoân ngöõ laäp trình:
+ Ngoân ngöõ maùy (machine language)
Maõ nhò phaân
Maõ baùt phaân hoaëc thaäp luïc phaân
+ Hôïp ngöõ (assembly language) [caàn coù assembler – trình
dòch hôïp ngöõ]
Maõ kí hieäu
+ Ngoân ngöõ caáp cao [caàn coù compiler – trình bieân dòch]
Pascal, Fortran, Basic, C, C++, … 5
2. Lưu đồ chương trình
-Böôùc ñaàu tieân cuûa vieäc laäp trình laø xaùc ñònh roõ raøng muïc
ñích cuûa chöông trình vaø trình töï caàn thieát ñeå ñaït muïc ñích
ñoù. Moät trong nhöõng coâng cuï quan troïng trong vieäc phaùt
trieån chöông trình laø löu ñoà chöông trình.
- Löu ñoà chöông trình laø bieåu dieãn baèng hình aûnh thöù töï
caùc thao taùc caàn laøm ñeå giaûi quyeát moät vaán ñeå cuï theå. Löu
ñoà chöông trình khoâng phuï thuoäc ngoân ngöõ laäp trình hoaëc
loaïi vi xöû lyù cuï theå naøo. Löu ñoà chöông trình chæ phuï thuoäc
vaøo coâng vieäc maø ngöôøi laäp trình muoán hoaøn thaønh.
6
2. Lưu đồ chương trình
7
2. Lưu đồ chương trình
-Raát nhieàu ngöôøi laäp trình khi môùi baét ñaàu vôùi vieäc laäp trình
thöôøng khoâng thích söû duïng löu ñoà chöông trình vì nghó raèng
vieäc veõ löu ñoà laø toán thôøi gian. Ñieàu naøy chæ ñuùng vôùi caùc
chöông trình ngaén vaø ñôn giaûn, nhöng tröôøng hôïp chöông trình
daøi hôn thì neáu khoâng coù löu ñoà seõ raát deã bò roái raém. Löu ñoà
chöông trình giuùp saép xeáp caùc yù töôûng vaø lôøi giaûi cuûa töøng vaán
ñeà rieâng bieät. Sau khi hoaøn thaønh löu ñoà, ta coù theå trao ñoåi vôùi
ngöôøi khaùc veà yù töôûng cuûa mình. Coù löu ñoà chöông trình thì duø
sau moät thôøi gian daøi ta vaãn coù theå quay laïi vôùi chöông trình
cuûa mình moät caùch deã daøng maø khoâng bò “laïc” trong caùc doøng
leänh voán raát chi tieát cuûa chöông trình hôïp ngöõ.
8
3. Khuôn dạng của một chương trình hợp ngữ
Caùc doøng chöùa caùc leänh vaø caùc chæ daãn phaûi ñöôïc vieát theo caùc qui
luaät maø trình dòch hôïp ngöõ hieåu ñöôïc. Moãi doøng ñöôïc chia thaønh caùc
tröôøng caùch bieät nhau bôûi khoaûng traéng hay khoaûng tab. Khuoân daïng
toång quaùt cuûa moãi doøng nhö sau:
Teân (Nhaõn) Maõ gôïi nhôù Caùc toaùn haïng Chuù thích
trong ñoù chæ coù tröôøng maõ gôïi nhôù laø baét buoäc. Vôùi trình dòch hôïp
ngöõ ASM51, tröôøng maõ gôïi nhôù khoâng caàn ôû treân cuøng moät doøng vôùi
tröôøng nhaõn. Tuy nhieân, tröôøng toaùn haïng phaûi ôû treân cuøng moät doøng
vôùi tröôøng maõ gôïi nhôù. Coù theå vieát caùc doøng naøy baèng chöõ hoa hay
chöõ thöôøng vaø chuùng seõ ñöôïc coi laø töông ñöông vì trình dòch hôïp
ngöõ khoâng phaân bieät kieåu chöõ. 10
3. Khuôn dạng của một chương trình hợp ngữ
a. Tröôøng teân
Tröôøng naøy coù theå chöùa caùc nhaõn, teân bieán, hay teân chöông
trình con (thuû tuïc). Caùc teân vaø nhaõn naøy seõ ñöôïc trình dòch hôïp
ngöõ gaùn baèng caùc ñòa chæ cuï theå cuûa leänh (hoaëc döõ lieäu) theo
sau. Teân vaø nhaõn coù theå coù ñoä daøi töø 1 ñeán 31 kyù töï, khoâng chöùa
khoaûng traéng, phaûi baét ñaàu baèng kyù töï chöõ, daáu ‘?’ hay daáu ‘_’
vaø tieáp theo phaûi laø caùc kyù töï chöõ, caùc kyù soá, daáu ‘?’ hay daáu
‘_’. Caùc teân vaø nhaõn khoâng ñöôïc truøng vôùi caùc töø khoùa (caùc maõ
gôïi nhôù, caùc chæ daãn, caùc toaùn töû hay caùc kyù hieäu ñònh nghóa
tröôùc). Noùi chung, ta cöù ñaët caùc teân bình thöôøng vaø coù yù nghóa
laø seõ ít bò loãi. Moät nhaõn ñöôïc keát thuùc baèng daáu ‘:’.
11
3. Khuôn dạng của một chương trình hợp ngữ
Tröôøng naøy chöùa maõ gôïi nhôù (mnemonic) cho bieát chöùc
naêng cuûa leänh (ví duï nhö ADD, MOV, DIV, MUL, INC…)
hay chæ daãn cuûa trình dòch hôïp ngöõ (ví duï nhö ORG, END,
EQU, DB…). Caùc chæ daãn khoâng ñöôïc dòch ra maõ maùy.
12
3. Khuôn dạng của một chương trình hợp ngữ
Tröôøng naøy chöùa ñòa chæ hay döõ lieäu maø leänh seõ söû duïng.
Tuøy theo töøng loaïi leänh maø coù theå coù 0, 1, 2 hay 3 toaùn
haïng. Caùc toaùn haïng caùch nhau bôûi daáu phaåy.
13
3. Khuôn dạng của một chương trình hợp ngữ
Caùc chuù thích ñeå laøm roõ chöông trình ñöôïc ñaët trong
tröôøng chuù thích ôû cuoái doøng leänh. Ñieàu naøy giuùp cho
ngöôøi ñoïc chöông trình deã hieåu caùc thao taùc cuûa chöông
trình hôn. Caùc chuù thích caàn phaûi ñöôïc baét ñaàu baèng daáu
‘;’. Caùc chuù thích coù theå chieám nhieàu doøng rieâng vaø cuõng
phaûi baét ñaàu baèng daáu chaám ‘;’.
14
3. Khuôn dạng của một chương trình hợp ngữ
Khi ta vieát chöông trình baèng kí töï cuûa baûng chöõ caùi, ta goïi ñaây
laø daïng mnemonic (maõ gôïi nhôù). Vi xöû lyù/vi ñieàu khieån khoâng
hieåu ñöôïc caùc chöõ caùi naøy. Chuùng ñoøi hoûi caùc leänh phaûi ñöôïc
vieát döôùi daïng ñaëc bieät goïi laø object code (maõ ñoái töôïng, maõ
leänh). Mnemonic ñöôïc duøng trong chöông trình goác döôùi daïng
source code (maõ nguoàn) do ngöôøi laäp trình vieát baèng hôïp ngöõ
hoaëc (ngoân ngöõ laäp trình khaùc). Coøn object code laø ngoân ngöõ
chæ bao goàm caùc soá 1 vaø 0, ñaây laø ngoân ngöõ maø vi xöû lyù/vi ñieàu
khieån seõ laøm vieäc ñöôïc. Vi xöû lyù/vi ñieàu khieån ñoïc object code
töø boä nhôù döôùi daïng caùc byte vaø bieân dòch caùc döõ lieäu thaønh
leänh caàn thöïc thi. 15
3. Khuôn dạng của một chương trình hợp ngữ
Moät soá chæ daãn cuûa trình dòch hôïp ngöõ thöôøng duøng:
ORG
Daïng: ORG bieuthuc
Chæ daãn ORG thay ñoåi noäi dung boä ñeám chöông trình theo giaù trò cuûa
bieuthuc ñeå thieát laäp nôi baét ñaàu môùi cuûa chöông trình cho caùc phaùt
bieåu theo sau noù.
END
Daïng: END
END laø phaùt bieåu cuoái cuøng cuûa chöông trình nguoàn. Nhaõn khoâng
ñöôïc söû duïng treân doøng naøy. 16
3. Khuôn dạng của một chương trình hợp ngữ
Moät soá chæ daãn cuûa trình dòch hôïp ngöõ thöôøng duøng:
EQU
Daïng: kyhieu EQU bieuthuc
Chæ daãn EQU gaùn giaù trò cuûa bieuthuc cho kyhieu. Kyhieu phaûi laø teân
hôïp leä.
DB
Daïng: nhan: DB bieuthuc{, bieuthuc][…]
Chæ daãn DB thöôøng ñöôïc duøng ñeå ñònh nghóa caùc giaù trò byte töông
öùng vôùi caùc bieuthuc trong boä nhôù chöông trình baét ñaàu töø ñòa chæ
töông öùng vôùi nhan.
17
4. Biên dịch chương trình
- Sau ñoù ta naïp object code naøy vaøo boä nhôù vi xöû lyù/vi ñieàu
khieån vaø vi xöû lyù/vi ñieàu khieån chaïy chöông trình.
18
4. Biên dịch chương trình
-Khi vi xöû lyù/vi ñieàu khieån ñöôïc caáp nguoàn ñieän laàn ñaàu
hay ñöôïc khôûi ñoäng laïi baèng caùch kích hoaït vaøo chaân RST
thì vi xöû lyù/vi ñieàu khieån thöïc hieän moät soá leänh beân trong.
Moät trong caùc leänh ñoù laø xuaát moät ñòa chæ ñaëc bieät leân bus
ñòa chæ vaø ñoïc opcode ñaàu tieân taïi ñòa chæ ñoù. Ñoái vôùi Z80,
8080, 8085 vaø hoï MCS-51 thì ñoù laø ñòa chæ 0000H. Do ñoù,
opcode ñaàu tieân cuûa chöông trình caàn thöïc hieän phaûi ñöôïc
ñaët ôû vò trí 0000H trong boä nhôù chöông trình vaø khi vieát
chöông trình neân söû duïng chæ daãn ORG 0000H ôû doøng ñaàu
tieân cuûa chöông trình chính ñeå baùo cho trình dòch hôïp ngöõ
bieát chöông trình ñöôïc baét ñaàu ôû ñòa chæ 0000H. 20
5. Nạp chương trình vào bộ nhớ
-Chöông trình ñöôïc naïp vaøo boä nhôù thöïc chaát chæ laø caùc
soá nhò phaân hay hex. Trong caùc soá naøy, coù soá seõ laø
opcode, coù soá seõ laø döõ lieäu ñöôïc söû duïng bôûi caùc leänh. Vieäc
nhaàm laãn thöù töï leänh seõ daãn ñeán caùc keát quaû khoâng löôøng
tröôùc ñöôïc. Phöông phaùp duy nhaát ñeå phaân bieät giöõa
opcode vaø döõ lieäu laø caàn phaûi bieát ñòa chæ chính xaùc cuûa
opcode ñaàu tieân trong chöông trình vaø naïp chöông trình
ñuùng vò trí vaø theo thöù töï.
21
II. Các kiểu định địa chỉ
II. Các kiểu định địa chỉ
Caùc kieåu ñònh ñòa chæ laø phaàn caàn thieát cho toaøn boä taäp leänh cuûa moãi
moät boä vi xöû lyù hay vi ñieàu khieån. Caùc kieåu ñònh ñòa chæ cho pheùp xaùc
ñònh roõ nguoàn vaø ñích cuûa döõ lieäu theo nhieàu caùch khaùc nhau maø vi
xöû lyù hay vi ñieàu khieån söû duïng trong quaù trình thöïc thi leänh.
Coù 8 kieåu ñònh ñòa chæ ñoái vôùi hoï MCS-51:
- Thanh ghi (register)
- Tröïc tieáp (direct)
- Giaùn tieáp (indirect)
- Töùc thôøi (immediate)
- Töông ñoái (relative)
- Tuyeät ñoái (absolute)
- Daøi (long)
- Chæ soá (index) 23
1. Định địa chỉ thanh ghi
-Trong leänh truy xuaát ñeán caùc thanh ghi R0 R7 cuûa bank thanh ghi
tích cöïc. Caùc leänh naøy ñöôïc maõ hoùa daøi 1 byte, trong ñoù duøng 3 bit
thaáp nhaát ñeå chæ thanh ghi ñöôïc truy xuaát.
- Ngoaøi ra, trong leänh cuõng coù theå truy xuaát ñeán caùc thanh ghi ñaëc
bieät nhö: thanh ghi tích luõy (kyù hieäu A), con troû döõ lieäu (kyù hieäu
DPTR), boä ñeám chöông trình (kyù hieäu PC), côø nhôù (kyù hieäu C) vaø caëp
thanh ghi AB (kyù hieäu AB). Caùc leänh naøy khoâng caàn caùc bit ñòa chæ,
baûn thaân opcode cuûa leänh ñaõ chæ ra thanh ghi ñöôïc duøng.
Ví duï: INC R1 ; taêng noäi dung thanh ghi R1 leân 1
INC A ; taêng noäi dung thanh ghi A leân 1
INC DPTR ; taêng noäi dung thanh ghi DPTR leân 1 24
2. Định địa chỉ trực tiếp
- Duøng ñeå truy xuaát caùc oâ nhôù trong RAM noäi (ñòa chæ töø 00H 7FH)
hay caùc thanh ghi chöùc naêng ñaëc bieät (ñòa chæ töø 80H FFH). Moät
byte ñöôïc theâm vaøo tieáp theo opcode ñeå xaùc ñònh ñòa chæ. OpcodeÑòa
chæ tröïc tieáp
- Trình dòch hôïp ngöõ cho pheùp söû duïng teân caùc thanh ghi chöùc naêng
ñaëc bieät (thay cho ñòa chæ).
25
2. Định địa chỉ trực tiếp
Ví duï:
-Trong leänh duøng caùc thanh ghi R0 vaø R1 laøm con troû ñeå
chæ ra ñòa chæ oâ nhôù trong RAM noäi maø leänh taùc ñoäng ñeán.
Bit thaáp nhaát trong maõ leänh seõ xaùc ñònh thanh ghi naøo
ñöôïc duøng.
- Quy öôùc: duøng daáu @ tröôùc R0 vaø R1 cho kieåu ñònh ñòa
chæ naøy.
27
3. Định địa chỉ gián tiếp
28
3. Định địa chỉ gián tiếp
- Caùc döõ lieäu töùc thôøi ñöôïc duøng tröïc tieáp trong leänh coù theå laø moät
haèng soá, moät kyù soá, moät bieåu thöùc toaùn hoïc… Trình dòch hôïp ngöõ seõ
töï ñoäng tính toaùn vaø thay theá döõ lieäu töùc thôøi vaøo maõ leänh.
- Quy öôùc: duøng daáu # tröôùc caùc toaùn haïng töùc thôøi.
Ví duï: MOV A,#7 ; naïp giaù trò 7 vaøo thanh ghi A, (A) = #7H
MOV A,#7+8 ; naïp giaù trò 15 vaøo thanh ghi A, (A) = #0FH
MOV A,#‘B’ ; naïp giaù trò 66 (maõ ASCII cuûa kyù töï B) vaøo
thanh ghi A, (A) = #42H 30
5. Định địa chỉ tương đối
- Moät ñòa chæ töông ñoái (hay coøn goïi laø offset) laø moät giaù
trò 8 bit coù daáu (töø –128 ñeán +127) cho bieát ñoä leäch töø vò
trí leänh theo ngay sau leänh nhaûy ñeán ñích. Giaù trò naøy ñöôïc
coäng theâm vaøo thanh ghi boä ñeám chöông trình (PC) ñeå taïo
ra ñòa chæ cuûa leänh tieáp theo caàn ñöôïc thöïc thi.
31
5. Định địa chỉ tương đối
-Ví duï:
Tính
offset cho
kieåu ñònh
ñòa chæ
töông ñoái
trong hai
tröôøng
hôïp nhaûy
tôùi vaø
nhaûy luøi.
32
5. Định địa chỉ tương đối
-Thoâng thöôøng caùc ñích nhaûy ñöôïc xaùc ñònh baèng caùc nhaõn vaø trình
dòch hôïp ngöõ seõ xaùc ñònh offset töông ñoái töông öùng.
Ví duï: Neáu nhaõn THERE ñöôïc ñaët ôû ñòa chæ 1040H vaø leänh:
SJMP THERE
ôû trong boä nhôù chöông trình taïi ñòa chæ 1000H vaø 1001H ñòa chæ
cuûa leänh keá tieáp seõ laø 1000H + 02H = 1002H, neân offset töông ñoái
seõ laø: offset = 1040H – 1002H = 3EH. Trình dòch hôïp ngöõ seõ gaùn
offset töông ñoái laø 3EH cho byte 2 cuûa leänh SJMP THERE.
- Coù öu ñieåm laø khoâng phuï thuoäc vaøo vò trí nhöng bò giôùi haïn veà taàm
nhaûy. 33
6. Định địa chỉ tuyệt đối
34
6. Định địa chỉ tuyệt đối
Kieåu ñònh ñòa chæ naøy coù taàm nhaûy bò haïn cheá vaø cung caáp maõ phuï
thuoäc vò trí. 35
6. Định địa chỉ tuyệt đối
Ví duï: Neáu nhaõn THERE ñaët taïi ñòa chæ 0F46H vaø leänh:
AJMP THERE
ôû trong boä nhôù taïi ñòa chæ 0900H vaø 0901H leänh theo ngay sau
leänh nhaûy baét ñaàu ôû ñòa chæ 0902H seõ coù 5 bit cao ñòa chæ truøng vôùi
ñòa chæ nhaõn THERE laø 00001.
36
7. Định địa chỉ dài
- Ñaây laø caùc leänh reõ nhaùnh 3 byte, vôùi 2 byte sau (byte 2 vaø
byte 3) laø ñòa chæ ñích cuûa leänh (16 bit).
- Öu ñieåm laø coù theå söû duïng toaøn boä vuøng nhôù chöông
trình 64K, nhöng leänh laïi daøi ñeán 3 byte vaø phuï thuoäc vaøo
vò trí.
37
8. Định địa chỉ chỉ số
-Duøng moät ñòa chæ neàn (chöùa trong thanh ghi PC hay
DPTR) vaø moät offset (chöùa trong thanh ghi A) ñeå taïo ñòa
chæ ñöôïc taùc ñoäng cho caùc leänh JMP hoaëc MOVC.
- Thöôøng duøng khi truy xuaát döõ lieäu trong moät baûng döõ
lieäu ñaõ ñöôïc ñònh nghóa tröôùc. Khi ñoù, thanh ghi PC hay
DPTR seõ giöõ ñòa chæ ñaàu baûng vaø thanh ghi A giöõ ñòa chæ
offset cuûa döõ lieäu caàn truy xuaát trong baûng.
38
8. Định địa chỉ chỉ số
41
1. Các định hướng biên dịch
(Assembler directives)
Assembler Directives
Instructions for the ASSEMBLER
NOT 8051 instructions
Examples:
;cseg stands for “code segment”
cseg at 1000h ;address of next instruction
is 1000h
42
1. Các định hướng biên dịch
(Assembler directives)
DATA
Used to define a name for memory locations
SP DATA 0x81 ;special function registers
MY_VAL DATA 0x44 ;RAM location
EQU
Used to create symbols that can be used to
represent registers, numbers, and addresses
LIMIT EQU 2000
VALUE EQU LIMIT – 200 + 'A'
SERIAL EQU SBUF
COUNT EQU R5
MY_VAL EQU 0x44
43
2. Nhóm lệnh chuyển dữ liệu
(Data transfer instructions)
44
3. Nhóm lệnh logic (Logic instructions)
45
4. Nhóm lệnh số học (Arithmetic instructions)
46
5. Nhóm lệnh rẽ nhánh (chuyển điều khiển)
(Program flow instructions)
47
6. Nhóm lệnh xử lý bit
(Bit processing instructions)
48
IV. Các kỹ thuật lập trình
IV. Các kỹ thuật lập trình
Laäp trình caáu truùc (structured programming) laø moät kyõ thuaät toå
chöùc vaø maõ hoùa caùc chöông trình nhaèm giaûm söï phöùc taïp, deã
daøng gôõ roái vaø hieäu chænh chöông trình.
Laäp trình caáu truùc nhaán maïnh ñeán caùc nhieäm vuï laäp trình.
Ngöôøi laäp trình phaân tích moät nhieäm vuï lôùn thaønh nhieàu coâng
vieäc nhoû hôn, sau ñoù daàn daàn chi tieát, cuï theå hoùa ñeå ñöôïc caùc
vaán ñeà ñôn giaûn.
50
IV. Các kỹ thuật lập trình
Qua ñoù, tìm ra caùch giaûi quyeát vaán ñeà döôùi daïng nhöõng thuaät
giaûi cuï theå roõ raøng, ñeå coù theå minh hoïa baèng ngoân ngöõ giaûi
thuaät.
Trong laäp trình caáu truùc, caùc thuaät giaûi naøy ñöôïc goïi laø caùc
chöông trình con. Caùch thöùc phaân tích vaø thieát keá nhö vaäy ta
goïi laø nguyeân lyù laäp trình töø treân xuoáng (top-down), ñeå theå hieän
quaù trình suy dieãn töø caùi chung nhaát cho ñeán caùi cuï theå nhaát.
51
IV. Các kỹ thuật lập trình
Taát caû caùc vaán ñeà laäp trình ñeàu coù theå ñöôïc giaûi quyeát chæ
döïa treân 3 caáu truùc:
52
1. Các phát biểu
- Caùc phaùt bieåu laø moät caùch thöùc cô baûn ñeå thöïc hieän moät
coâng vieäc naøo ñoù.
- Caùc phaùt bieåu coøn bao goàm caû vieäc gaùn giaù trò cho 1 bieán
hoaëc goïi chöông trình con.
53
2. Các cấu trúc vòng lặp
- Ñöôïc söû duïng ñeå thöïc hieän moät hoaëc moät soá coâng vieäc
laëp ñi laëp laïi nhieàu laàn.
a. While ………… Do
54
2. Các cấu trúc vòng lặp
While ………… Do
+ Cuù phaùp:
+ Löu ñoà:
55
2. Các cấu trúc vòng lặp
Ví duï: Vieát chöông trình con SUM tính toång cuûa moät chuoãi
caùc soá. Caùc thoâng soá truyeàn vaøo chöông trình con laø
chieàu daøi cuûa chuoãi soá (ñöôïc chöùa trong thanh ghi R7)
vaø ñòa chæ baét ñaàu cuûa chuoãi soá ñoù trong RAM noäi (ñöôïc
chöùa trong thanh ghi R0). Keát quaû traû veà ñöôïc chöùa
trong thanh ghi A.
56
2. Các cấu trúc vòng lặp
Pseudo-code:
[sum = 0]
WHILE [length > 0] DO
Begin
[sum = sum + @pointer]
[taêng pointer]
[giaûm length]
End
57
2. Các cấu trúc
vòng lặp
Löu ñoà
(flowchart):
58
2. Các cấu trúc vòng lặp
SUM: CLR A
LOOP: CJNE R7, #0, STATEMENT
JMP EXIT
STATEMENT: ADD A, @R0
INC R0
DEC R7
JMP LOOP
EXIT: RET
59
2. Các cấu trúc vòng lặp
SUM: CLR A
INC R7
MORE: DJNZ R7, SKIP
RET
SKIP: ADD A, @R0
INC R0
SJMP MORE
60
2. Các cấu trúc vòng lặp
Repeat …………Until
+ Cuù phaùp:
+ Löu ñoà:
61
2. Các cấu trúc vòng lặp
Ví duï: Vieát chöông trình con ñeå tìm moät chuoãi ñöôïc keát
thuùc bôûi kyù töï Null ñöôïc troû bôûi thanh ghi R0 vaø xaùc
ñònh xem trong chuoãi coù kyù töï Z hay khoâng. Keát quaû traû
veà ACC = Z neáu coù kyù töï Z ôû trong chuoãi, neáu khoâng thì
ACC = 0.
62
2. Các cấu trúc vòng lặp
Pseudo-code:
REPEAT
[ACC = @pointer]
[taêng pointer]
Until [ACC == ‘Z’ or ACC == 0]
63
2. Các cấu trúc
vòng lặp
Löu ñoà
(flowchart):
64
2. Các cấu trúc vòng lặp
65
2. Các cấu trúc vòng lặp
66
2. Các cấu trúc vòng lặp
ORG 0000H
MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM
; noäi
MOV DPTR,#2000H ; DPTR troû tôùi ñòa chæ ngoaøi 2000H
LOOP: MOV A,@R0 ; ghi noäi dung oâ nhôù ñöôïc troû bôûi
;R0 vaøo A
MOVX @DPTR, A ; ghi noäi dung trong A ra ñòa chæ
;ñöôïc troû bôûi DPTR
INC R0 ; taêng chæ soá ñòa chæ trong R0
INC DPTR ; taêng chæ soá ñòa chæ trong DPTR
CJNE R0,#2AH,LOOP ; ñuû 10 byte chöa?
END 67
2. Các cấu trúc vòng lặp
Destination Destination
Ví duï 3: Vieát chöông trình coäng moät chuoãi soá BCD khoâng
neùn (unpacked – BCD) ñöôïc caát trong RAM noäi baét ñaàu
töø oâ nhôù 31H. Chieàu daøi chuoãi chöùa trong oâ nhôù 30H.
Keát quaû (giaû söû laø 1 byte) caát vaøo oâ nhôù 2FH.
70
2. Các cấu trúc vòng lặp
ORG 0000H
MOV R0,#31H ; R0 troû tôùi ñòa chæ 31H trong RAM noäi
CLR A ; ban ñaàu cho (A) = 0
LOOP: ADD A,@R0 ; coäng noäi dung oâ nhôù ñöôïc troû bôûi R0 vaøo
;A
INC R0 ; taêng chæ soá ñòa chæ trong R0
DJNZ 30H,LOOP ; heát chuoãi chöa?
MOV 2FH,A ; caát keát quaû sau khi coäng vaøo oâ nhôù 2FH
END
71
2. Các cấu trúc vòng lặp
Ví duï 4: Vieát chöông trình ñoåi caùc kyù töï chöõ thöôøng trong caùc oâ nhôù
töø 30H 39H trong RAM noäi sang chöõ hoa. Bieát:
72
2. Các cấu trúc vòng lặp
Nhaän xeùt:
Ñeå ñoåi chöõ hoa sang chöõ thöôøng ta ñaët bit 5 (hay coäng
theâm 32) trong maõ ASCII cuûa chöõ hoa. Ngöôïc laïi, ñeå
ñoåi chöõ thöôøng sang chöõ hoa ta xoùa bit 5 (hay tröø ñi 32)
trong maõ ASCII cuûa chöõ thöôøng.
73
2. Các cấu trúc vòng lặp
ORG 0000H
MOV R0,#30H ; R0 troû tôùi ñòa chæ 30H trong RAM noäi
LOOP: XCH A,@R0 ; hoaùn ñoåi noäi dung A vaø oâ nhôù ñöôïc troû
;bôûi R0
ANL A,#11011111B ; xoùa bit 5 trong maõ ASCII, caùc bit khaùc
;giöõ nguyeân
XCH A,@R0 ; caát keát quaû trôû laïi oâ nhôù ñöôïc troû bôûi R0
INC R0 ; taêng chæ soá ñòa chæ trong R0
CJNE R0,#3AH,LOOP ; xöû lyù xong oâ nhôù 39H chöa?
END
74
3. Các cấu trúc lựa chọn
If ……Then……Else
+ Cuù phaùp:
IF [ñieàu kieän]
THEN [phaùt bieåu 1]
ELSE [phaùt bieåu 2]
+ Löu ñoà:
75
3. Các cấu trúc lựa chọn
Ví duï 1: vieát moät ñoaïn chöông trình nhaäp moät kyù töï töø RAM ngoaøi
coù ñòa chæ laø 2000H vaø kieåm tra kyù töï ñoù. Neáu kyù töï nhaän ñöôïc laø
loaïi maõ ASCII hieån thò ñöôïc (coù giaù trò trong khoaûng 20H 7EH)
thì xuaát laïi noù, neáu khoâng thì xuaát laïi kyù töï ‘.’ ra RAM ngoaøi ôû
ñòa chæ 2001H.
76
3. Các cấu
trúc
lựa chọn
Löu ñoà
(flowcha
rt):
77
3. Các cấu trúc lựa chọn
Pseudo-code:
78
3. Các cấu trúc lựa chọn
ACALL INCH
ACALLISGRPH
JC SKIP
MOV A, #’.’
SKIP: ACALLOUTCH
(tieáp tuïc)
80
3. Các cấu trúc lựa chọn
Ví duï 2: Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM
ngoaøi coù chieàu daøi 100 byte baét ñaàu töø ñòa chæ 1000H xem coù bao
nhieâu giaù trò chaün vaø leû. Soá giaù trò chaün vaø leû ñöôïc löu töông öùng
trong 2 oâ nhôù 30H vaø 31H.
81
3. Các cấu trúc lựa chọn
ORG 0000H
MOV DPTR,#1000H ; DPTR troû tôùi ñòa chæ ngoaøi 1000H
MOV R7,#100 ; R7 chöùa soá laàn laëp laø 100
LOOP: MOVX A,@DPTR ; ñoïc oâ nhôù ñöôïc troû bôûi DPTR vaøo A ñeå
;kieåm tra
JB ACC.0,ODD ; (ACC.0) = 1 soá leû
INC 30H ; (ACC.0) = 0 soá chaún
SJMP CONT ; xeùt byte keá tieáp
ODD: INC 31H
CONT:INC DPTR ; taêng chæ soá ñòa chæ trong DPTR
DJNZ R7,LOOP ; ñuû 100 byte chöa?
END 82
3. Các cấu trúc lựa chọn
83
3. Các cấu trúc lựa chọn
84
3. Các cấu trúc lựa chọn
85
3. Các cấu trúc lựa chọn
Löu ñoà
(flowcha
rt):
86
3. Các cấu trúc lựa chọn
COMPARE_8:
CJNE A,30H,NOT_EQUAL ; (A) # (30H)
CLR P1.1 ; (A) = (30H)
SJMP EXIT
NOT_EQUAL:
JNC GREATER ; (C) = 0 (A) > (30H)
CLR P1.2 ; (C) = 1 (A) < (30H)
SJMP EXIT
GREATER:
CLR P1.0
EXIT:
RET 87
3. Các cấu trúc lựa chọn
Case
+ Cuù phaùp:
89
3. Các cấu trúc lựa chọn
Ví duï: Moät chöông trình yeâu caàu caùc ñaùp öùng 0, 1, 2, hoaëc
3 cuûa moät user ñeå choïn moät trong boán haønh ñoäng. Vieát
ñoaïn chöông trình nhaäp moät kyù töï töø baøn phím vaø nhaûy
ñeán ACT0, ACT1, ACT2 hoaëc ACT3, phuï thuoäc vaøo ñaùp
öùng cuûa user. Boû qua vieäc kieåm tra loãi.
90
3. Các cấu trúc lựa chọn
Pseudo-code:
91
3. Các cấu trúc lựa chọn
Löu ñoà :
92
3. Các cấu trúc lựa chọn
Ví duï 1: Vieát chöông trình con teân DELAY_100 ñeå taïo treã
(trì hoaõn) 100 s. Giaû söû duøng thaïch anh 12 MHz (fOSC
= 12 MHz).
95
4. Kỹ thuật tạo trễ
Höôùng daãn: Duøng thôøi gian thöïc thi leänh ñeå tính thôøi gian taïo treã caàn
thieát.
fOSC = 12 MHz fM = fOSC / 12 = 1 MHz TM = 1 s
Caùch 2: Duøng voøng laëp ñeå chöông trình ngaén goïn hôn.
DELAY_100:
MOV R7,#49 ; 1 s
LOOP: DJNZ R7,LOOP ; 2 s / 1 leänh 2 x 49 = 98 s
RET ; 2 s
Toång quaùt:
DELAY_T:
MOV R7,#N ; 1 TM, N 255
LOOP: DJNZ R7,LOOP ; 2 TM / 1 leänh (2 x N) TM
RET ; 2 TM
toång thôøi gian taïo treã: T = [(1 + 2 x N + 2)TM] [(2 x N) TM] s 97
4. Kỹ thuật tạo trễ
Chuù yù:
Daáu $ laø moät kyù hieäu ñaëc bieät cuûa trình dòch hôïp
ngöõ ASM51 ñeå tham chieáu vò trí cuûa leänh hieän haønh.
98
4. Kỹ thuật tạo trễ
Ví duï 2: Vieát chöông trình con teân DELAY_10ms ñeå taïo treã
10 ms. Giaû söû duøng thaïch anh 12 MHz (fOSC = 12 MHz).
99
4. Kỹ thuật tạo trễ
Chöông trình:
DELAY_10ms:
MOV R7,#20 ; 1 s
LOOP: MOV R6,#250 ; 1 s
DJNZ R6,$ ; 2 s / 1 leänh
DJNZ R7,LOOP ; 2 s / 1 leänh
RET ; 2 s
toång thôøi gian taïo treã: T = 1 + 20(1 + 2 x 250 + 2) + 2 = 10063 s
10000 s
100
4. Kỹ thuật tạo trễ
Toång quaùt:
DELAY_T:
MOV R7,#M ; 1 TM
LOOP: MOV R6,#N ; 1 TM
DJNZ R6,$ ; 2 TM / 1 leänh
DJNZ R7,LOOP ; 2 TM / 1 leänh
RET ; 2 TM
Ví duï 3: Vieát chöông trình taïo soùng vuoâng tuaàn hoaøn ñoái
xöùng taïi chaân P1.0 coù taàn soá laø f= 10 KHz. Giaû söû fOSC
= 12 MHz.
102
4. Kỹ thuật tạo trễ
103
4. Kỹ thuật tạo trễ
ORG 0000H
LOOP: CPL P1.0 ; 1 s
MOV R7,#28 ; 1 s
DJNZ R7,$ ; 2 x 28 = 46 s
SJMP LOOP ; 2 s
END
104
Questions ???
Bài tập chương 3
Bài tập chương 3
3.1 Haõy cho bieát caùch ñònh ñòa chæ cuûa moãi leänh sau:
a. MOV R1,A b. MOV A,#12H
c. MOV A,@R1 d. PUSH B
e. MOV A,12Hf. SJMP LOOP
g. ACALL SUB1 h. LJMP 0567H
3.2 Ñeå naïp vaøo R4 giaù trò 56H thì coù caàn daáu ‘#’ trong leänh:
MOV R4,#56H khoâng?
3.4 Haõy xaùc ñònh offset töông ñoái cho leänh: SJMP AHEAD
Bieát leänh ñaët taïi ñòa chæ 0400H vaø 0401H, nhaõn AHEAD ñaët taïi
ñòa chæ 041FH.
3.5 Haõy xaùc ñònh offset töông ñoái cho leänh: SJMP BACK
Bieát leänh ñaët taïi ñòa chæ A050H vaø A051H, nhaõn BACK ñaët taïi ñòa
chæ 9FE0H.
3.7 Giaû söû thanh ghi A chöùa 5AH. Haõy cho bieát giaù trò trong
thanh ghi A sau khi thöïc hieän leänh sau: XRL A,#0FFH
Haõy tìm moät leänh khaùc töông ñöông vôùi leänh treân?
3.8 Giaû söû thanh ghi A chöùa 50H vaø thanh ghi PSW chöùa 0CH.
Haõy cho bieát giaù trò trong thanh ghi A sau khi thöïc hieän leänh sau:
RLC A
109
Bài tập chương 3
3.9 Haõy xaùc ñònh noäi dung cuûa thanh ghi A sau khi thöïc hieän caùc
chuoãi leänh sau:
a. MOV A,#25
MOV R7,#18H
ADD A,R7
b. MOV A,#7FH
MOV 50H,#29H
MOV R0,#50H
XCHD A,@R0
110
Bài tập chương 3
3.10 Cho bieát giaù trò cuûa côø CY sau khi thöïc hieän caùc ñoaïn maõ
sau:
a. CLR C b. MOV A,#54H c. MOV A,#250
CPL C ADD A,#0C4H ADD A,#05
3.11 Caùc leänh naøo sau ñaây laø khoâng hôïp leä:
1.MOV R7,#500 2.MOV A,50H
3.ADD A,R5 4.ADD R3,A
5.MOV R1,#50 6.MOV A,#F5H
7.ADD A,#50H 8.MOV @R1,R7
9.PUSH A 10.MOV A,@R3
11.MOV R7,#00 12.MOV R6,R7
111
Bài tập chương 3
3.12 Cho noäi dung cuûa caùc oâ nhôù vaø thanh ghi: (30H) = 12H; (B)
= 34H; (A) = 05H. Haõy xaùc ñònh noäi dung cuûa oâ nhôù 30H, thanh
ghi A vaø B sau khi thöïc thi ñoaïn chöông trình sau:
MOV R1,#30H
XCH A,B
XCHD A,@R1
SWAP A
XCHD A,@R1
SWAP A
112
Bài tập chương 3
MOV R0,#20H
MOV R1,#30H
MOV R2,#2 ;*
CLR C
NEXT: MOV A,@R0
ADDC A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,NEXT
113
Bài tập chương 3
a. Sau khi thöïc hieän leänh thöù 3 (coù chuù thích *), noäi dung cuûa
R0, R1 vaø R2 laø bao nhieâu?
b. Leänh coù nhaõn NEXT ñöôïc thöïc thi bao nhieâu laàn?
c. Sau khi hoaøn taát chöông trình treân thì noäi dung cuûa R0, R1 vaø
R2 laø bao nhieâu?
d. Cho noäi dung cuûa caùc oâ nhôù ban ñaàu laø: (20H) = 23H, (21H) =
45H, (30H) = 67H, (31H) = 89H:
Cho bieát noäi dung cuûa caùc oâ nhôù treân sau khi thöïc thi xong
chöông trình treân?
Chöùc naêng cuûa chöông trình treân? 114
Bài tập chương 3
a. Sau khi thöïc hieän leänh coù chuù thích *, noäi dung cuûa R0, R1 vaø R2 laø
bao nhieâu?
b. Leänh coù nhaõn AGAIN ñöôïc thöïc thi bao nhieâu laàn?
c. Sau khi hoaøn taát chöông trình treân thì noäi dung cuûa R0, R1 vaø R2 laø
bao nhieâu?
d. Noäi dung cuûa oâ nhôù 40H sau khi thöïc thi xong chöông trình treân?
f. Neáu keát quaû cuûa chöông trình treân ñöôïc caát vaøo oâ nhôù 50H thì leänh
naøo caàn söûa ñoåi? 116
Bài tập chương 3
3.15 Vieát 1 ñoaïn chöông trình xoùa 20 byte oâ nhôù RAM noäi baét ñaàu töø
ñòa chæ 30H.
3.16 Vieát 1 ñoaïn chöông trình xoùa 100 byte oâ nhôù RAM ngoaøi baét ñaàu
töø ñòa chæ 1000H.
3.17 Vieát 1 ñoaïn chöông trình ñoïc 20 byte oâ nhôù RAM ngoaøi baét ñaàu töø
ñòa chæ 2000H vaø ghi vaøo RAM noäi baét ñaàu töø ñòa chæ 30H.
3.18 Vieát chöông trình con TINHTB_3SO tính giaù trò trung bình cuûa 3
soá nguyeân döông chöùa trong 3 oâ nhôù 30H, 31H vaø 32H. Keát quaû (phaàn
nguyeân) chöùa trong thanh ghi R7. Giaû söû toång cuûa 3 soá ñoù khoâng lôùn
hôn 255. 117
Bài tập chương 3
3.19 Vieát 1 chöông trình con coäng 2 soá 16 bit khoâng daáu, soá haïng 1 caát
trong R7_A (R7: byte cao, A: byte thaáp), soá haïng 2 caát trong oâ nhôù
31H_30H (31H: byte cao, 30H: byte thaáp). Keát quaû traû veà caát trong
R7_A.
3.20 Vieát 1 chöông trình con tröø 2 soá 16 bit khoâng daáu, soá bò tröø caát
trong R7_A (R7: byte cao, A: byte thaáp), soá tröø caát trong oâ nhôù
31H_30H (31H: byte cao, 30H: byte thaáp). Keát quaû traû veà caát trong
R7_A.
3.21 * Vieát 1 chöông trình con nhaân soá 16 bit caát trong R7_A (R7: byte
cao, A: byte thaáp) vôùi soá 8 bit caát trong B. Keát quaû traû veà 24 bit caát
trong R7_B_A. 118
Bài tập chương 3
3.22 * Vieát 1 chöông trình con chia soá 16 bit caát trong R7_A (R7: byte
cao, A: byte thaáp) cho soá 8 bit caát trong B. Keát quaû: thöông soá caát trong
R7_A, dö soá caát trong B.
3.23 Vieát 1 chöông trình con laáy buø 2 cuûa soá 16 bit caát trong R7_A (R7:
byte cao, A: byte thaáp). Keát quaû traû veà caát trong R7_A.
3.24 Vieát chöông trình con BINTOBCD chuyeån soá nhò phaân trong A
sang soá BCD 3 digit (kyù soá) caát trong caùc oâ nhôù 32H, 31H vaø 30H
(32H: traêm, 31H: chuïc, 30H: ñôn vò).
3.25 Vieát chöông trình con BCDTOBIN chuyeån soá BCD khoâng neùn (2 kyù
soá) trong A sang soá nhò phaân caát trong oâ nhôù 30H. 119
Bài tập chương 3
3.26 * Vieát chöông trình con BCDTOBIN16 chuyeån soá nhò phaân 16 bit
trong R7_A (R7: byte cao, A: byte thaáp) sang soá BCD 5 digit caát trong
caùc oâ nhôù theo thöù töï töø chuïc ngaøn ñeán ñôn vò laø:
34H_33H_32H_31H_30H.
3.27 Vieát chöông trình ñoåi caùc kyù töï chöõ hoa trong caùc oâ nhôù 30H
3FH trong RAM noäi sang chöõ thöôøng.
3.28 Vieát chöông trình ñoåi caùc kyù töï chöõ hoa trong caùc oâ nhôù 30H
3FH trong RAM noäi sang chöõ thöôøng vaø ngöôïc laïi.
120
Bài tập chương 3
3.29 Vieát chöông trình con SOSANH16 so saùnh soá 16 bit khoâng
daáu caát trong R7_A (R7: byte cao, A: byte thaáp) vôùi soá 16 bit
khoâng daáu laøm giaù trò chuaån caát trong oâ nhôù 31H_30H (31H:
byte cao, 30H: byte thaáp). Keát quaû traû veà:
- (C) = 1 neáu (R7_A) < (31H_30H)
- (C) = 0 neáu (R7_A) (31H_30H)
Löu yù: phaûi baûo toaøn noäi dung cuûa caùc thanh ghi vaø oâ nhôù ôû treân.
3.30 Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM
ngoaøi coù chieàu daøi 200 byte baét ñaàu töø ñòa chæ 1000H xem coù bao
nhieâu byte coù giaù trò laø 0. Keát quaû (soá byte coù giaù trò laø 0) ñöôïc
löu vaøo oâ nhôù coù ñòa chæ laø 0FFFH trong RAM ngoaøi. 121
Bài tập chương 3
3.31 Vieát chöông trình kieåm tra moät khoái döõ lieäu trong RAM ngoaøi coù chieàu daøi
50 byte baét ñaàu töø ñòa chæ 2000H xem coù bao nhieâu byte coù giaù trò laø 0, döông
vaø aâm. Keát quaû ñöôïc löu vaøo caùc oâ nhôù trong RAM noäi nhö sau:
- OÂ nhôù 30H: chöùa soá byte baèng 0.
- OÂ nhôù 31H: chöùa soá byte döông.
- OÂ nhôù 32H: chöùa soá byte aâm.
3.32 Vieát 1 chöông trình con teân DELAY_500 taïo treã 500s, bieát fOSC = 12
MHz.
3.33 Vieát 1 chöông trình con teân DELAY_20ms taïo treã 20ms, bieát fOSC = 12
MHz.
3.34 Vieát 1 chöông trình con teân DELAY_1s taïo treã 1s, bieát fOSC = 12 MHz. 122
Bài tập chương 3
3.35 Vieát chöông trình xuaát chuoãi xung vuoâng ñoái xöùng coù taàn soá f = 1KHz ra
chaân P1.0.
3.36 Vieát chöông trình xuaát chuoãi xung vuoâng ra chaân P1.0 vôùi taàn soá f =
10KHz, duty cycle = 30% (thôøi gian möùc cao = 30% thôøi gian cuûa chu kì
xung).
3.37 Vieát chöông trình ñieàu khieån ñeøn giao thoâng taïi ngaõ tö ñöôøng (ñeøn xanh
saùng 4s, ñeøn vaøng saùng 1s, ñeøn ñoû saùng 5s). Duøng port 1 ñeå ñieàu khieån caùc ñeøn
vôùi quy ñònh neáu xuaát ra möùc logic 0 laø ñeøn saùng:
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
8051
124
Bài tập chương 3
a. Haõy vieát chöông trình ñeå saùng töøng LED theo chieàu D1 D8
vaø laëp laïi, thôøi gian saùng cuûa moãi LED laø 0,2s.
d. Haõy vieát chöông trình ñeå caùc LED saùng lan toûa theo chieàu D1
D8 roài taét daàn theo chieàu D1 D8 vaø laëp laïi, thôøi gian caùch
nhau giöõa 2 LED laø 0,2s.
3.39 Cho maïch keát noái nhö sau: Haõy vieát chöông trình
+5V
ñeå xuaát
giaù trò BCD trong oâ nhôù 30H ra LED 7 ñoaïn.
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
330x8
8051
126