Giao Tiep May Tinh Voi VXL 8085

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 106

LUAÂÄN VAÊN TOÁT NGHIEÄP 1

Chöông I:

CHÖÔNG DAÃN NHAÄP


LUAÂÄN VAÊN TOÁT NGHIEÄP 2

I. ÑAËT VAÁN ÑEÀ:


Khi nhu caàu hoïc taäp ngaøy caøng cao thì thieát bò, phöông tieän daïy hoïc caøng
ñoùng vai troø quan troïng, noù giuùp ngöôøi thaày dôõ vaát vaû trong vieäc truyeàn thuï kieán
thöùc, giuùp ngöôøi hoïc nhanh choùng tieáp thu, ngoaøi ra coøn ñeå minh hoïa, chöùng
thöïc moât caùch cuï theå nhöõng baøi hoïc mô hoà tröøu töôïng.
Trong baøi naøy, ngöôøi thöïc hieän muoán ñeà caäp ñeán moân hoïc vi xöû lyù, laäp
trình vi xöû lyù, moät moân hoïc mang yù nghóa thieát thöïc trong xaõ hoäi maø quaù trình
coâng nghieäp hoùa, hieän ñaïi hoùa dieãn ra töøng ngaøy. Khi hoïc moân naøy, ngöôøi hoïc
khoâng chæ ñöôïc hoïc veà caáu truùc vi xöû lyù caû phaàn cöùng laãn phaàn meàm, caùch keát
noái vôùi caùc IC ngoaïi vi 8255, 8279, … maø coøn phaûi söû duïng thaønh thaïo Kit vi xöû lyù
8085,…
Khi vieát moät chöông trình treân Kit vxl 8085 vaø ñeå kieåm nghieäm chöông
trình ñoù thì ngöoøi hoïc phaûi qua caùc böôùc :
Böôùc 1: Xaùc ñònh muïc ñích yeâu caàu cuûa chöông trình.
Muïc ñích, yeâu caàu ñöôïc xaùc ñònh töø ñeà baøi, hoaëc moät nhu caàu thöïc teá,
ñaây laø muïc ñích chung cuûa chöông trình. Ñeå thöïc hieän muïc ñích chung
naøy, coù theå seõ phaûi qua nhieàu böôùc, maø moãi böôùc laø moät muïc ñích cuï theå
môùi, ñöôïc giaûi quyeát baèng moät chöông trình nhoû hôn, phaùt sinh trong
giai ñoaïn vieát löu ñoà.
Böôùc 2: Veõ löu ñoà
Löu ñoà duøng ñeå trình baøy caùch giaûi quyeát vaán ñeà, thöôøng thì ngoân ngöõ
duøng trong löu ñoà khoâng phaûi laø moät ngoân ngöõ maùy xaùc ñònh naøo, löu ñoà
thöïc chaát ñeå giuùp ngöôøi thaûo chöông chia nhoû moät chöông trình lôùn. Töø
löu ñoà toång quaùt, coù theå veõ ra löu ñoà chi tieát.
Böôùc 3: Vieát chöông trình baèng ngoân ngöõ gôïi nhôù(ngoân ngöõ Assembler).
Böôùc 4: Chuyeån sang maõ maùy.
Böôùc 5: Nhaäp maõ maùy vaøo Kit baèng phím.
Böôùc 6: Chaïy thöû chöông trình vaø kieåm tra keát quaû.
Moät chöông trình ñöôïc vieát phaûi ñöôïc chaïy thöû vaø kieåm tra keát quaû, keát
quaû phaûi ñuùng trong moïi tröôøng hôïp cho pheùp (ñieàu kieän ñaët ra tröôùc) cuûa
chöông trình, vaø töø keát quaû kieåm tra maø phaùn ñoaùn, nhaän ñònh loãi ñeå söûa chöông
trình töø ñaâu, coù khi phaûi söûa laïi caû löu ñoà.
Trong caùch laøm treân, ta nhaän thaáy coù nhöõng khoù khaên rieâng sau:
− Quaù trình dòch töø ngoân ngöõ gôïi nhôù sang maõ maùy (böôùc 4), ñoøi hoûi
söï quen thuoäc baûng tra maõ, neáu khoâng vieäc naøy chieàm nhieáu thôøi gian, vaø
vieäc kieåm tra laïi cuõng chieám khoâng ít thôøi gian. Taïi nhöõng leänh jump, nhöõng
leänh call, caàn phaûi xaùc ñònh ñòa chæ cuï theå, chính xaùc cuûa oâ nhôù roài môùi xaùc
ñònh ñöôïc leänh jump. Vieäc naøy chæ hoaøn taát khi chöông trình ñöôïc dòch sang
maõ maùy gaàn nhö ñaày ñuû.
− ÔÛ giai ñoaïn nhaäp maõ maùy (böôùc 5), ñeå nhaäp nhanh thì phaûi nhôù vò
trí phím, phaûi nhaäp chính xaùc ñeå traùnh thôøi gian doø ñeå söûa moät chöông trình
nhaäp sai. Ñeå nhaäp moät byte caàn goõ 3 phím vaø phaûi ñoái chieáuqua laïi giöõa baûn
dòch chöông trình, noäi dung hieån thò treân caùc led 7 ñoaïn cuøng vôùi ñòa chæ oâ
nhôù vaø baøn phím.
LUAÂÄN VAÊN TOÁT NGHIEÄP 3

− Ñoái vôùi nhöõng ai trong giai ñoaïn khôûi ñaàu hoïc laäp trình vi xöû lyù, thì
2 vieäc treân luoân xaåy ra nhaàm laãn gaây maát nhieàu thôøi gian voâ ích.
− Khi caàn theâm hoaëc xoùa, hoaëc söûa chöông trình thì maát nhieàu thôøi gian ñeå
doø laïi chöông trình, nhaäp laïi khoù khaên, thaäm chí phaûi nhaäp laïi phaàn lôùn chöông
tình.
− Sau khi bò maát ñieän thì döõ lieäu löu trong RAM khoâng coù nguoàn döï tröõ seõ
bò maát heát, phaûi nhaäp laïi toaøn boä chöông trình. Ñoái vôùi nhöõng chöông trình nhoû
thì thôøi gian nhaäp khoâng ñaùng keå, nhöng ñoái vôùi nhöõng chöông trình lôùn thì ñaây
laø coâng vieäc maát nhieàu thôøi gian, vaø gaây phieàn haø cho ngöôøi hoïc cuõng nhö ngöôøi
laäp trình vi xöû lyù.
Beân caïnh ñoù, thöïc teá ñaõ coù nhöõng thieát bò naïp EPROM raát tieän lôïi, maø coù
theå ñem yù töôûng ñoù vaøo vieäc hoïc laäp trình vi xöû lyù nhaát laø vieäc giao tieáp vôùi thieát
bò khaùc töø vi xöû lyù laø moät ñieàu khaù deã dang.
Ngoaøi ra, chöông trình ñaïi hoïc raát bao quaùt, thôøi gian vaø ñieàu kieän chæ cho
pheùp sinh vieân ñi heát beà noåi cuûa chöông trình maø chöa coù hoaëc ít coù dòp tìm hieåu
veà chieàu saâu. Do ñoù, ñoà aùn toát nghieäp laø moät cô hoäi toát cho sinh vieân ñaøo saâu vaøo
chöông trình hoïc, öùng duïng baøi hoïc vaøo thöïc teá, chöùng minh ñöôïc söï höõu ích cuûa
nhöõng kieán thöùc ñaõ hoïc ñöôïc trong moâi tröôøng sö phaïm.
Töø nhöõng lyù do treân, ngöôøi vieát quyeát ñònh choïn ñeà taøi “GIAO TIEÁP MAÙY
TÍNH VÔÙI VI XÖÛ LYÙ 8085”.
Ñeà taøi ñöa ra moät chöông trình nhö moät coâng cuï hoã trôï vieäc hoïc laäp trình
vi xöû lyù treân Kit8085 vôùi moät thöù töï sau:
1) Xaùc ñònh muïc ñích yeâu caàu cuûa chöông trình caàn vieát.
2) Veõ löu ñoà.
3) Vieát chöông trình baèng ngoân ngöõ Assembly (ngoân ngöõ gôïi nhôù).
4) Nhaäp chöông trình baèng ngoân ngöõ Assembly vaøo maùy (duøng Norton).
5) Goïi chöông trình dòch Assembler ñeå dòch töø ngoân ngöõ Assembly sang
moät file coù phaàn môû roäng “prn” chöùa maõ maùy.
6) Trong chöông trình Giao tieáp, goïi file dòch ñeå naïp vaøo RAM.
7) Chaïy thöû vaø kieåm tra keát quaû.
Caùch laøm naøy coù nhöõng öu ñieåm sau:
− Dòch töø ngoân ngöõ Assembly (ngoân ngöõ gôïi nhôù) toán raát ít thôøi gian vì vieäc naøy
do maùy tính ñaûm traùch, vôùi ñoä chính xaùc tuyeät ñoái.
− Cuõng vaäy, vieäc naïp döõ lieäu vaøo RAM cuõng chæ trong vaøi giaây, vaø ñöôïc kieåm
tra trong khi naïp neân ñoä chính xaùc cuõng tuyeät ñoái.
− Ngoaøi ra, chöông trình ñöôïc löu tröõ, quaûn lyù deå daøng, deå xem laïi, deå kieåm
tra. Khi caàn theâm, hoaëc xoùa hoaëc söûa hoaëc cheùp laïi moät ñoaïn chöông trình,
ngay caû thay ñoåi ñòa chæ baét ñaàu, cuõng raát ñôn giaûn.
− Veà ñoä chính xaùc vaø thôøi gian caàn thieát thì ñoái vôùi chöông trình caùc lôùn caøng
coù lôïi, caøng phaûi naïp chöông trình nhieáu thì caøng coù lôïi.
II. TAÀM QUAN TROÏNG CUÛA VAÁN ÑEÀ.
Trong xaõ hoäi ngaøy caøng phaùt trieån, löôïng kieán thöùc caàn truyeàn taûi trong
nhaø tröôøng ngaøy caøng taêng, maø thôøi gian cho pheùp ngaøy caøng bò giaûm ñi, thì söï
LUAÂÄN VAÊN TOÁT NGHIEÄP 4

noå löïc cuûa caû ngöôøi daïy laãn ngöôøi hoïc ñeàu raát caàn thieát. Beân caïnh ñoù, phöông
tieän ít nhieàu seõ goùp phaàn quan troïng trong quaù trình hoïc taäp.
Tröôùc ñaây, vieäc hoïc laäp trình vi xöû lyù ñaõ dieãn ra moät caùch töï nhieân, coù theå
coi nhö ñaõ ñaày ñuû veà phöông tieän hoïc taäp. Nhöng nay, neáu coù theâm moät chöông
trình moâ phoûng caùc hoï vi ñieàu khieån, hay vi xöû lyù, giao tieáp maùy tính vôùi vi xöû lyù
ñeå truyeàn file… thì taát nhieân seõ coù maët tích cöïc, mang theâm nhieàu lôïi ích cho vieäc
hoïc.
“Giao tieáp maùy tính vôùi vi xöû lyù” coøn laø moät chöùng thöïc veà giao tieáp _
nhöõng gì ñaõ ñöôïc hoïc _ treân chính kit thöïc taäp, ñieàu ñoù seõ kích hoaït söï tìm toøi,
söï ham thích hieåu bieát cuûa sinh vieân.
III. GIÔÙI HAÏN VAÁN ÑEÀ
Ñaây laø moät chuyeân ñeà thuù vò, coù nhieàu vaàn ñeà ñaùng quan taâm, nhöng do
nhöõng giôùi haïn veà thôøi gian vaø kieán thöùc, neân trong ñoà aùn naøy, ngöôøi vieát chæ coù
theå trình baøy nhöõng phaàn sau:
− Khaùi quaùt Kit 8085 söû duïng, caùc linh kieän coù lieân quan tröïc tieáp
ñeán giao tieáp.
− Caùch thöùc söû duïng kit, nhöõng hoaït ñoäng beân trong kit veà leänh, döõ
lieäu … maø sau ñoù seõ ñöôïc thay theá baèng caùch naïp töø maùy tính.
− Giao tieáp maùy tính.
− Moät soá ñieåm caàn löu yù khi vieát moät chöông trình baèng ngoân ngöõ
gôïi nhôù cho chöông trình dòch Assembler ñeå taïo ra moät file coù phaàn môû roäng
.prn.
− Caáu truùc moät file .prn, nhöõng soá lieäu naøo caàn xuaát.
− Ñoâi neùt veà ngoân ngöõ C, chöông trình Download
− Chöông trình nhaän döõ lieäu.
IV. MUÏC ÑÍCH NGHIEÂN CÖÙU
Tröôùc maét: ñaây laø moät vaán ñeà hay, ñaõ thu huùt ngöôøi vieát töø laâu maø nay môùi
coù dòp thöïc hieän, vaø cuõng laø nhu caàu caàn thieát trong thöïc teá.
Laâu daøi: tuy chæ laø moät thieát keá ñôn giaûn, nhöng laø moät cô sôû ban ñaàu coù
theå phaùt trieån theâm ra höôùng toång quaùt.
V. XAÙC ÑÒNH THUAÄT NGÖÕ
Töïa ñeà taøi laø “Giao tieáp maùy tính vôùi kit vi xöû lyù 8085”. Thöïc chaát, vaán ñeà
giao tieáp chæ laø moät cô sôû, phöông tieän chuû yeáu. Coøn saûn phaåm cuûa ñeà taøi laø moät
giao dieän treân maøn hình vi tính maø trong ñoù, ngöôøi duøng cho theå choïn fie caàn
truyeàn, vaø truyeàn xuoáng kit qua moät port naøo ñoù ñeå naïp döõ lieäu vaøo RAM.
Ñeà taøi naøy chæ thöïc hieän vieäc naïp döõ lieäu vaøo RAM maø sau ñoù seõ coù nhöõng
phaùt trieån khaùc. Thöïc teá ñeà ra laø vieäc thöïc haønh laäp trình vi xöû lyù treân kit,
chöông trình chæ laø ñeå thöïc taäp, chuû yeáu chæ naïp vaøo RAM, maø vieäc naïp döõ lieäu
vaøo Kit maát nhieàu thôøi gian, vaø muïc ñích cuûa ñeà taøi tröôùc tieân laø ñeå giaûi quyeát
vaán ñeà ñoù, sau ñoù coù theå phaùt trieån leân ñeå ñoïc caùc vuøng RAM, EPROM.
LUAÂÄN VAÊN TOÁT NGHIEÄP 5

Chöông II:

CÔ SÔÛ LYÙ LUAÄN


LUAÂÄN VAÊN TOÁT NGHIEÄP 6

Töø vaán ñeà ñaët ra nhö ôû chöông 1 ñaõ trình baøy, ngöôøi thöïc hieän ñeà taøi ñaõ
tieán haønh giaûi quyeát theo höôùng sau:
− Xaùc ñònh thieát bò giao tieáp: Kit vi xöû lyù 8085 ñaõ coù saün caùc IC ngoaïi vi 8255
laøm nhieäm vuï giao tieáp, chæ caàn choïn IC, xaùc ñònh ñòa chæ cuûa IC ñoù, ñòa chæ
cuûa caùc port vaøo ra, mode hoaït ñoäng cuûa caùc port, xaùc ñònh caùc ñieåm noái keát
phaàn cöùng vôùi maùy tính vaø vieát chöông trình nhaän, phaùt döõ lieäu.
− Xaùc ñònh coång giao tieáp: ñoái vôùi maùy tính: choïn coång LPT1 (maø sau naøy coù
theå phaùt trieån ñeå coù theå söû duïng caû LPT2, COM1, COM2) vôùi phöôùng phaùp
giao tieáp song song baát ñoàng boä.
− Xaây döïng giao dieän treân maøn hình maùy tính:Yeâu caàu caàn coù …… vaø phuø hôïp
vôùi ngöôøi söû duïng. Sau ñoù tieán haønh vieát giaûi thuaät, vaø baét tay vaøo vieát
chöông trình. ÔÛ ñaây, ngöôøi thöïc hieän ñaõ vieát chöông trình truyeàn döõ lieäu
trong moâi tröôøng Borland C 3.1. Trong quaù trình vieát, phaûi giaûi quyeát nhöõng
khoù khaên phaùt sinh moät caùch cuï theå.
− Vieát chöông trình truyeàn, nhaän döõ lieäu vôùi Kit.
− Gheùp noái caùc phaàn laïi.
− Thöû nghieäm.
− Söûa loãi.
− Phöông phaùp chuû yeáu laø tham khaûo taøi lieäu vaø thöïc nghieäm
LUAÂÄN VAÊN TOÁT NGHIEÄP 7

Chöông III:

KIT THÖÏC TAÄP


VI XÖÛ LYÙ 8085
LUAÂÄN VAÊN TOÁT NGHIEÄP 8

I. KIT THÖÏC TAÄP VI XÖÛ LYÙ 8085:


Kit thöïc taäp vi xöû lyù 8085 laø moät loaïi maùy tính chuû yeáu phuïc vuï cho muïc
ñích hoïc taäp vaø nghieân cöùu thieát keá veà lónh vöïc vi xöû lyù. Kit naøy, xuaát phaùt taïi
tröôøng ÑH Sö phaïm kyõ thuaät – Trung taâm Vieät-Ñöùc, vaø do nhu caàu hoïc taäp vaø
nhu caàu thöïc teá, caùc giaùo vieân trong boä moân Ñieän-Ñieän töû cuûa tröôøng ñaõ caûi tieán
cho phuø hôïp. Maët khaùc, sinh vieân thuoäc khoa, trong caùc ñeà taøi toát nghieäp, ñoà aùn
moân hoïc, cuøng vôùi söï höùng thuù, ñaõ tham khaûo, tìm hieåu veà caáu taïo vaø nguyeân lyù
hoaït ñoäng, vaø môû roäng theâm moät soá chöùc naêng cho kit.
Moät Kit thöïc taäp vi xöû lyù thöôøng coù caùc phaàn chính ñöôïc trình baøy trong sô
ñoà khoái ôû (Hình 1).
Vôùi muïc ñích cuûa ñeà taøi naøy laø giao tieáp song song neân trong Kit 8085, chæ
caàn quan taâm ñeán 8085 vaø boä leänh 8085, 8255, 8279.
I.1. SÔ LÖÔÏC VI XÖÛ LYÙ 8085:
Vi xöû lyù (microprocessor) laø moät thieát bò baùn daãn chöùa caùc maïch logic ñieän
töû coù khaû naêng xöû lyù caùc döõ lieäu, chöông trình töø ngoaøi ñöa vaøo ñeå ñieàu khieån
caùc IC, thieát bò keát noái theo muïc ñích ñònh tröôùc.
I.1.1. Caáu truùc phaàn cöùng:

I.1.1.1. Caáu truùc beân ngoaøi:

8085 laø moät boä vi xöû lyù 8 bit do Intel saûn xuaát, ñaàu tieân vaøo naêm 1977. Noù
coù khaû naêng ñònh ñòa chæ cho boä nhôù tôùi 64 Kbyte, IC naøy coù 40 chaân, daïng DIP,
söû duïng nguoàn ñôn + 5V.

Chöùc naêng, daïng tín hieäu, traïng thaùi caùc chaân cuûa 8085 ñöôïc cho ôû baûng
sau:
Baûng 1:

Chaân Kyù hieäu In/out 3 state YÙ nghóa

1,2 X1, X2 I X1, X2 laø 2 ngoõvaøo cuûa maïch dao


ñoäng. Taàn soá ngoõ vaøo ñöôïc chia cho
2 bôûi maïch chia beân trong. Taàn soá
laøm vieäc cöïc ñaïicuûa:

8085A: 6MHz

8085A-2: 10MHz
LUAÂÄN VAÊN TOÁT NGHIEÄP 9

8085A-1:12MHz

3 Reset Out O Cho bieát CPU ñang reset. Tín hieäu


naøy coù theå duøng ñeå reset caùc thaønh
phaàn khaùc trong maïch.

4 SOD O Serial Output: ngoõ ra döõ lieäu noái tieáp


ñöôïc xaùc ñònh bôûi leänh SIM.

5 SID I Serial Input: ngoõ vaøo döõ lieäu noái


tieáp, döõ lieäu naøy ñöôïc naïpaøobit thöù 7
cuûa thanh ghi Accumulator khi thöïc
hieän leänh RIM.

6 TRAP I Trap: tín hieäu khoâng ngaên ñöôïc. Ngoõ


vaøo trap ñöôïc kích bôûi caïnh leân.

7,8,9 RST 7.5, 6.5, 5.5 I Restart Intrerupt Repuest: laø caùc tín
hieäu ngaét coù theå ngaên ñöôïc. RST 7.5
coù theå ñöôïc kích baèng caïnh, RST 6.5
vaø 5.5 coù theå ñöôïc kích baèng möùc.

10 INTR I Interrupt: laø tín hieäu ngaét


thoângduïng coù theå che ñöôïc leänh kích
baèng möùc.

11 INTA\ O Interrupt Acknowledge: tín hiweäu


duøng ñeå baùo cho thieát bò yeâu caàu
ngaét INTR bieát raèng microprocessor
ñaõ chaáp nhaän yeâu caàu ngaét vaø thieát
bò yeâu caàu ngaét haõy ñaët leänh leân bus
döõ lieäu.

19-12 AD7-AD0 I/O-3 Address/Data bus: caùc ñöôøng döõ lieäu


vaø caùc ñöôøng ñòa chæ ñöôïc tích hôïp
chung vôùi nhau. Ôû traïng thaùi T1 cuûa
chu kyø maùy, caù ngoõ naøy ñoùng vai troø
laø caùc ngoõ ra ñòa chæ. Caùc traïng thaùi
coøn laïi cuûa chu kyø maùy, noù ñoùng vai
troø laø caùc ñöôøng döõ lieäu.

20 Vss Ground.

28-22 A15-A8 O-3 Address bus:caùc ngoõ naøy ñöôïc duøng


LUAÂÄN VAÊN TOÁT NGHIEÄP 10

ñeå xuaát 8 bit ñòa chæ cao.

30 ALE O Address Latch Ennable: ngoõ naøy taï


ra moät xungôû traïng thaùi T1 cuûa chu
kyø maùy ñeå xaùc ñònh A15-A8 vaø AD7-
AD0 laø caùc ñöôøng ñòa chæ.

31 WR\ O-3 Write: duøng ñeå xaùc ñònh


icroprocessor ñang thöïc hieän leänh
ghi döõ lieäu leân boä nhôù hay IO.

32 RD\ O-3 Read: duøng ñeå xaùc ñònh


microprocessor ñang thöïc hieän leänh
ñoïc döõ lieäu töø boä nhôù hay IO.

29,33,34 S0,S1, IO/M\ O,O-3 Machine Cycle Status: 3 bit naøy cho
bieát traïng thaùi chu kyø maùy.

IO/M\ S1 S0 Traïng thaùi

0 0 1 Memory Write

0 1 0 Memory Read

0 1 1 Op-code fetch.

1 0 1 IO write.

1 1 0 IO read.

1 1 1 Interrupt
Ackowledge.

Ôû traïng thaùi döøng (halt), S1=S2=0 vaø


IO/M\ ôû traïng thaùi toång trôû cao.
Trong khoaûng thôøi gian Hold vaø
reset thì traïng thaùi cuûa S0 vaø S1
khoâng xaùc ñònh,IO/M\ ôû traïng thaùi
toång trôû cao. Thöôøng thì caùc bit
WR\, RD\ vaø IO/M\ duøng ñeå xaùc
ñònh traïng thaùi laøm vieäc cuûa bus
nhö: memory read, memory write,
IO read, IO write.
LUAÂÄN VAÊN TOÁT NGHIEÄP 11

35 READY I Ready laø tín hieäu traû lôøi töø boä nhôù
hoaëc thieát bò ngoaïi vi IO cho
microprocesser bieát ñeå
microprocessor coù theå hoaøn thaønh
chu kyø maùy ñang thöïc hieän.

36 RESET IN I Reset: ngoõ vaøo reset 8085 ñeå trôû veà


traïng thaùi ban ñaàu cuûa noù. Tín hieäu
naøy phaûi ôû möùc 0 khoaûng 3 chu kyø
xung clock.

37 CLK O Clock out: ngoõ ra tín hieäu clock ñeå


cung caáp cho caùc thieát bò khaùc. Taàn
soá cuûa noù baèngtaàn soá ngoõ vaøo chia 2.

38 HLDA O Hold Ackowledge: tín hieäu ngoõ ra


cho bieát tín hieäu hold ñaõ ñöôïc chaáp
nhaän vaø CPU seõ ôû traïng thaùi Hold ôû
chu kyø xung clock tieáp theo.

39 HOLD I Hold request: nhaän tín hieäu yeâu caàu


ngöng töø boä ñieàu khieån DMA.

40 Vcc Power: nguoàn cung caáp +5V.

Caùc chaân cuûa IC ñöôïïc boá trí nhö hình veõ sau (hình 2):

X1 1 40 Vcc
X2 2 39 HOLD
RESET(OUT) 3 38 HLDA
SOD 4 37 CLK(OUT)
SID 5 36 RESET IN
TRAP 6 35 READY
RST7.5 7 34 IO/M
RST6.5 8 33 S1
RST5.5 9 32 RD
INTR 10
8085 31 WR
INTA 11 30 ALE
AD0 12 29 S0
AD1 13 28 A15
AD2 14 27 A14
AD3 15 26 A13
LUAÂÄN VAÊN TOÁT NGHIEÄP 12

Toaøn boä caùc tín hieäu cuûa 8085 coù theå ñuôïc phaân thaønh 6 nhoùm:

(1) Tuyeán ñòa chæ

(2) Tuyeán döõ lieäu

(3) Caùc tín hieäu traïng thaùi vaø ñieàu khieån

(4) Nguoàn cung caáp vaø caùc tín hieäu taàn soá

(5) Caùc ngaét vaø caùc tín hieäu taàn soá

(6) Caùc coång I/O noái tieáp

+5V GND

1 2 40 20
X1 X2 Vcc Vss
Serial SID 5 A15 28
I/O SOD 4 High Outer
Ports Address Bus
TRAP 6 A8 21
RST 7.5 7
RST 6.5 8
RST 5.5 9
10
8085
Interrupts INTR 19
and AD7
Externally Multiplexed
Initiated Address/Data Bus
Signals
READY 35 AD0 12
HOLD 39
RESET IN 36 30 ALE
29 S0
33 S1 Control
34 IO/M and
32 RD
31 WR Status Signals
11 INTA
18 HLDA

21 21

RESET CLK
OUT OUT
LUAÂÄN VAÊN TOÁT NGHIEÄP 13

Hình 3: caùc nhoùm hoaït ñoäng cuûa 8085

I.1.1.2. Caáu truùc beân trong 8085:


8085ù bao goàm ñôn vò logic vaø soá hoïc ALU (Arithmetic and Logic Unit),
ñôn vò ñònh thôøi vaø ñieàu khieån (Timing and Control Unit) , boä giaûi maõ vaø
thanh ghi leänh (Instruction Register and Decoder), daõy thanh ghi ( Register
Array), ñieàu khieån ngaét (Interrupt Control) vaø ñieàu khieån I/O noái tieáp
(Serial I/O Control) (xem hình 4).

INTA RST 6.5 TRAP


INTR RST 5.5 RST 7.5 SID SOD

Interrupt Control Serial I/O Control

8 Bit Internal Data Bus

Instruction
Accumulater Temp. Reg. Register Multiplexer
(8) (8) (8)
(8) (8)
W Z
Temp. Reg. Temp. Reg.
(8) (8)
B C
Reg. Reg.
Flag (8) (8) Register
Flip Flops D E Array
Re Reg. Reg.
g. (8) (8)
Instruction H L
Decoder Sel Reg. Reg.
Arithmatic and ect
Logic Machine Stack Pointer
Unit Cycle (16)
Encoding Program Counter
(ALU)
(16)
(8)
Incrementer / Decrementer
Address Lactch (16)
Power Supply
+5V
GND

X1 CLK Timing and Control


(8) (8)
X2 GEN Control Status DMA Reset Address Buffer Data Address Buffer

CLK OUT RD WR ALE S0 S1 IO/M HLDA RESET OUT AD15 - AD8 AD7 - AD0
READY HOLD RESET IN Address Bus Address Data Bus

Hình 4: Sô ñoà khoái chöùc naêng cuûa 8085

I.1.2. Caáu truùc phaàn meàm:


Taäp leänh cuûa 8085
LUAÂÄN VAÊN TOÁT NGHIEÄP 14

Moät leänh (Instruction) laø moät maãu nhò phaân (binary pattern) ñöôïc thieát keá
beân trong vi xöû lyù ñeå thöïc hieän moät chöùc naêng cuï theå (Instruction set), xaùc ñònh
caùc chöùc naêng maø vi xöû lyù coù theå thöïc hieän. Taäp leänh cuûa 8085 coù 74 leänh (hôn
8080 hai leänh), caùc leänh naøy coù theå ñöôïc phaân thaønh 5 nhoùm chöùc naêng :
− Caùc hoaït ñoäng (sao cheùp) truyeàn döõ lieäu
− Caùc hoaït ñoäng toaùn hoïc
− Caùc hoaït ñoäng logic
− Caùc hoaït ñoäng reõ nhaùnh
− Vaø, caùc hoaït ñoäng ñieàu khieån
Taäp leänh vi xöû lyù 8085 ñöôïc phaân thaønh 3 nhoùm tuyø theo kích côõ töø :
1. Caùc leänh moät töø hoaëc 1 byte
2. Caùc leänh hai töø hoaëc 2 byte
3. Caùc leänh ba töø hoaëc 3 byte
Leänh moät byte chöùa maõ hoaït ñoäng (Opcode) vaø toaùn töû (Operand) trong
cuøng moät byte.
Trong leänh hai byte, byte thöù nhaát neâu leân maõ hoaït ñoäng vaø theo sau laø
toaùn töû.
Ñoái vôùi leänh ba byte, byte ñaàu tieân cho bieát maõ hoaït ñoäng, 2 byte theo sau
laø döõ lieäu (noäi dung hoaëc ñòa chæ) 16 bit.
I.2. IC NGOAÏI VI 8255:
I.2.1. Caáu truùc:
I.2.1.1. Phaàn cöùng:
8255 laø moät thieát bò I/O giao tieáp song song, noù coù theå ñöôïc laäp trình ñeå
truyeàn döõ lieäu döôùi caùc ñieàu kieän khaùc nhau, töø I/O ñôn giaûn ñeán I/O coù ngaét. Noù
khaù linh hoaït, ña naêng vaø tinh teá (khi coù nhieàu coång I/O ñöôïc ñoøi hoûi), nhöng
cuõng phöùc taïp. Noù laø moät thieát bò I/O phoå duïng coù theå ñöôïc söû duïng vôùi haàu heát
baát kyø boä vi xöû lyù naøo.
8255 coù 40 chaân daïng DIP nhö hình 5.

8255
Group
PA3 40 PA4 A
1 Group Port I/O
A PA7-PA0
PA2 2 39 PA5 Control A
(8)
PA1 3 38 PA6
PA0 4 37 PA7
RD 5 36 WR
CS 6 35 RESET Group
GND 34 D0 A
7 Bidirectional Port C I/O
A1 8 33 D1 Data Bus Upper PA7-PA0
(4)
A0 9 32 D2
Data
PC7 10 31 D3 Bus
PC6 11 30 D4 Buffer Group
PC5 12 29 D5 A
D7-D0 Port C I/O
PC4 13 28 D6 Lower PA7-PA0
LUAÂÄN VAÊN TOÁT NGHIEÄP 15

Hình 5 : sô ñoà chaân vaø Sô ñoà khoái cuûa 8255


Baûng 2: Baûng lieät keâ chöùc naêng caùc chaân IC 8255
Teân caùc chaân Chöùc naêng
D7 – D0 Data bus (Bi – Direction)
RESET Rest Input
CS\ Chip Select
RD\ Read Input
WR\ Write Input
A0, A1 Port Address
PA7 – PA0 Port A
PB7 – PB0 Port B
PC7 – BC0 Port C

Sô ñoà khoái treân hình 5. trình baøy hai coång 8 bit (A vaø B) vaø hai coång 4 bit
(CU vaø CL) boä ñieän tuyeán döõ lieäu, vaø logic ñieàu khieån. Hình 5.9 (b) trình baøy moät
sô ñoà ñôn giaûn hoùa nhöng môû roäng cuûa caáu truùc beân trong, chöùa moät thanh ghi
ñieåu khieån. Sô ñoà khoái naøy chöùa taát caû caùc phaàn töû cuûa moät thieát bò laäp trình;
coång C thöïc hieän chöùc naêng töông töï chöùc naêng cuûa thanh ghi traïng thaùi, ngoaøi
ra coøn cung caáp caùc tín hieäu baét tay.
I.2.1.2. Phaàn meàm:
Töø ñieàu khieån
Hình 6 trình baøy moät thanh ghi ñöôïc goïi laø thanh ghi ñieàu khieån (control
register). Noäi dung cuûa thanh ghi naøy, goïi laø töø ñieàu khieån (control word), neâu
roõ moät chöùc naêng I/O cho moãi coång. Thanh ghi coù theå ñöôïc xaâm nhaäp ñeå ghi töø
LUAÂÄN VAÊN TOÁT NGHIEÄP 16

ñieàu khieån. Khi A0 vaø A1 ôû möùc logic 1, nhö ñaõ ñeà caäp ôû treân. Thanh ghi naøy
khoâng theå bò xaâm nhaäp ñoái vôùi hoaït ñoäng Ñoïc.
Bit D7 cuûa thanh ghi ñieàu khieån neâu roõ hoaëc chöùc naêng I/O hoaëc chöùc naêng
Ñaët/Ñaët laïi bit nhö phaân loaïi trong Hình 5.8 (b). Neáu D7 = 1caùc bit D6 ÷ D5 quyeát
ñònh caùc chöùc naêng I/O ôû caùc moát khaùc nhau. Neáu bit D7 = 0, coång C hoaït ñoäng ôû
moát Ñaët/Ñaët laïi bit (BSR). Töø ñieàu khieån BSR khoâng aûnh höôûng ñeán caùc chöùc
naêng cuûa caùc coång A vaø B.
LUAÂÄN VAÊN TOÁT NGHIEÄP 17

D7 D6 D5 D4 D3 D2 D1 D0 GROUP B
PORT C (LOWER)
1=INPUT
0=OUTPUT
PORT B
1=INPUT
0=OUTPUT
MODE SELECTION
0=MODE 0
1=MODE 1

GROUP A
PORT C (UPPER)
1=INPUT
0=OUTPUT
PORT A
1=INPUT
0=OUTPUT
MODE SELECTION
00=MODE 0
01=MODE 1
1X=MODE 2

MODE SET FLAG


1=ACTIVE

Hình 6: Caáu truùc töø ñieàu khieån cuûa IC ngoaïi vi 8255.


Caên cöù vaøo töø ñieàu khieån cuûa 8255, coù theå klhôûi taïo 8255 ôû caùc mode 0
hoaëc mode 1 hoaëc mode 2, vaø coù theå xaùc ñònh höôùng vaøo ra döõ lieäu cho moãi
port.
Ñeå trao ñoåi thoâng tin vôùi caùc ngoaïi vi (ôû ñaây laø caùc moâ - ñun vaøo ra) thoâng
qua 8255, ba böôùc sau ñaây laø caàn thieát :
(1) Xaùc ñònh ñöôïc ñòa chæ caùc coång A, B vaø C vaø cuûa thanh ghi ñieàu khieån theo
logic choïn chip (CS) vaø caùc ñöôøng ñòa chæ A0, A1.
(2) Ghi töø ñieàu khieån vaøo thanh ghi ñieàu khieån.
(3) Ghi caùc leänh I/O ñeå thoâng tin vôùi caùc ngoaïi vi thoâng qua coång A,B vaø C.
Heä thoáng Kit ñaõ ñöôïc ñaët cho 8255 laøm vieäc vôùi caùc ngoõ vaøo / ra ôû moát 0
nhö sau :
1. Caùc ngoõ ra ñöôïc choát
2. Caùc ngoõ vaøo khoâng ñöôïc choát
3. Caùc coång khoâng coù khaû naêng baét tay vaø ngaét.
Ví duï:
LUAÂÄN VAÊN TOÁT NGHIEÄP 18

Ñeå A, C laø coång nhaäp (8 bít), B laø coång xuaát(8bít), vaø choïn ngoaïi vi coù ñòa
chæ töø 00 – 03 thì phaûi laøm nhö sau:
Gôûi töø ñieàu khieån 99hex vaøo thanh ghi ñieàu khieån.
Xuaát töø ñieàu khieån ra thanh ghi ñieàu khieån coù ñòa chæ 03hex.
I.3. IC GIAÛI MAÕ HIEÅN THÒ 8279:
I.3.1. Caáu truùc 8279
I.3.1.1. Phaàn cöùng:
8279 laø moät phöông phaùp phaàn cöùng ñeå giao tieáp vôùi baøn phím ma traän vaø
hieån thò ña hôïp. Baát lôïi cuûa phöông phaùp duøng phaàn meàm laø vi xöû lí bò baän trong
luùc kieåm tra vaø laøm töôi hieån thò. 8279 seõ thay theá vi xöû lí ñaûm traùch hai nhieäm
vuï naøy.
8279 (Hình ) laø moät thieát bò daïng DIP _ 40, coù hai phaàn chính : baøn phím
vaø hieån thò. Phaàn baøn phím coù theå ñöôïc noái vôùi moät ma traän toái ña 64 phím, söï
goõ phím ñöôïc giaûi naåy vaø maõphím ñöôïc löu tröõ vaøo boä nhôù FIFO beân trong (First
_ In _ First _ Out : Vaøo tröôùc, ra tröôùc) , vaø moät tín hieäu ngaét ñöôïc phaùt ra moãi
laàn goõ phím. Phaàn hieån thò coù theå cung caáp moät hieån thò coù queùt toái ña 16 Led.
Phaàn naøy coù boä nhôù RAM 16 x 8, coù theå ñöôïc söû duïng ñoïc / ghi thoâng tin cho caùc
muïc ñích hieån thò. Phaàn hieån thò coù theå ñöôïc khôûi taïo ôû daïng ghi phaûi (right
entry) hoaëc ghi traùi (left entry).
Taàn soá xung ñoàng hoà caáp cho 8279 toái ña laø 3,125MHz

Hình 7: Sô ñoà chaân logic cuûa 8279


LUAÂÄN VAÊN TOÁT NGHIEÄP 19

Baûng 3: Chöùc naêng caùc chaân IC 8279


Teân chaân Soá chaân Moâ taû vaø chöùc naêng
DB0 – DB7 8 Bi-directional
databus:Ñöôøng döõ lieäu 2
chieàu.
Taát caû caùc leänh vaø döõ
lieäu giöõaCPU vaø 8279
ñöôïc truyeàn treân nhöõng
ñöôøng döõ lieäu naøy.
CLK 1 Clock input: ngoõ vaøo
xung clock. Xung clock
coù taàn oá toái ña laø
3,125MHz.
RESET 1 Reset in: duøng ñeå ñaët laïi
traïng thaùi laøm vieäc cuûa
8279 khi ngoõ vaøo naøy ôû
möùc cao.
Sau khi ñöôïc reset, 8279
coù theå laøm vieäc ôû cheá ñoä:
− Hieån thò 16 kyù töï loái
vaøo traùi.
− Laäp maõ queùt phím
khoùa ngoaøi 2 phím.
CS\ 1 Chip select: taùc ñoäng
möùc thaáp cho pheùp 8279
thöïc hieän caùc chöùc naêng
keát noái vôùi CPU ñeå
truyeàn vaø nhaän döõ lieäu.
A0 1 Buffer address: ñöôøng
ñòa chæ naøy thöông ñöôïc
keát noái vôùi ñ5a chæ A0
cuûa vi xöû lyù duøng ñeå
phaân bieät leänh hay döõ
lieäu.
− A0=[1]: tín hieäu vaøo
ra laø leänh.
LUAÂÄN VAÊN TOÁT NGHIEÄP 20

− A0=[0]:tín hieäu vaøo


ra laø döõ lieäu.
RD\, WR\ 2 Read, Write:ch pheùp ñoïc
hay ghi döõ lieäu leân bus döõ
lieäu, thanh ghi ñieàu khieån
hay boä nhôù RAM hieån
thò.
IRQ 1 Interrupt Request:
ñöôøng tín hieäu yeâu caàu
ngaét (output). Ngoõ ra naøy
seõ ôû möùc cao neá coù döõ
lieäu ôû trong boä nhôù FIFO
hay SensorRAM, ngoõ ra
naøy seõ ôû möùc thaáp moãi
khicoù söï ñoïc boä nhôù
FIFO/SensorRAM vaø
trôûlaïi möùc cao khi d4coù
döõ lieäu chöùa trong RAM.
Vss, Vcc 2 Caáp nguoàn 0Vvaø +5V cho
8279.
SL0 – SL3 4 Scan lines: 4 ñöôøng scan
line naøycoù theå giaûi maõ ra
16 ñöôøng hay maõ hoùa
thaønh 1 ñöôøng, ñöôïc
duøng ñeå queùt phím hay
ma traän caûm bieán vaø
hieån thò.
RL0 – RL7 8 Return line: ñöôïc noái vôùi
ñöôøng scan line thoâng
qua caùc phím hay coâng
taéc caûm bieán. ÔÛ cheá ñoä
queùt phím, seõ keát hôïp vôùi
caùc ñöôøng scan lines taïo
thaønh maõ cuûa phím ñöôïc
nhaán.
SHIFT 1 Shift, Control / Strobe
LUAÂÄN VAÊN TOÁT NGHIEÄP 21

CTRL/STB 1 input Mode: trong cheá


ñoä queùt phím, möùc logic
cuûa töøng ngoõ vaøo naøy seõ
ñöôïc löu tröõ vôùi vò trí
cuûa phím ñeå taïo ra 1 giaù
trò cuûa phím ñöôïc nhaán.
OUT A0 – A3 4 Ñeây laø 2 portngoõ ra cuûa
OUT B0 – B3 4 thanh ghi hieån thò 16 x 4
bit. Döõ lieäu töø nhöõng
thanh ghi naøy seõ ñöôïc
ñöa ra ñoàng boä keát hôïp
vôùi caùc ñöôøng queùt scan
lines ñeå ña hôïp thaønh soá
hieån thò.
Hai ngoõ ra 4 bit naøy coù
theå xoùa ñoäc laäp vaø coù theå
keát hôïp vôùi nhau ñeå taïo
thaønh moät ngoõ ra 8 bit.
BD\ 1 Blanking display: duøng
ñeå xoùa hieån thò trong quaù
trình chuyeån ñoåi giöõa caùc
soá hay khi gaëp leänh xoùa
hieån thò.
Sô ñoà khoái logic (Hình 8) trình baøy boán phaàn chính cuûa 8279 : baøn phím,
queùt, hieån thò vaø giao tieáp vi xöû lí. Caùc chöùc naêng cuûa caùc phaàn naøy ñöôïc mieâu taû
nhö döôùi ñaây :
LUAÂÄN VAÊN TOÁT NGHIEÄP 22

CL RESE DB0- RD WR CS A0 IR

FIFO/Sensor
Data I/O Control RAM
Buffer Status

Internal Data Bus (8)

Display 16 x 8 8x8 Keyboard


Control and Debounce
Address Display Timing FIFO/Sensor and
Registers RAM Registers RAM Control

Timing
and
Display Control
Registers Scan Counter Return

OUT A0-A3 OUT BD SL0- SHIF


RL0-RL7

Hình 8: Sô ñoà khoái cuûa 8279


Ñeå giao tieáp vôùi vi xöû lyù, 8279 caàn taùm ñöôøng döõ lieäu hai chieàu (BD0 _ BD7),
moät ñöôøng yeâu caàu ngaét (IRQ), vaø saùu ñöôøng giao tieáp, keå caû ñöôøng ñòa chæ cuûa
boä ñeäm (A0)
Khi A0 ôû möùc cao, caùc tín hieäu ñöôïc hieåu nhö laø caùc töø ñieàu khieån vaø
traïng thaùi. Khi A0 ôû möùc thaáp, caùc tín hieäu ñöôïc hieåu laø döõ lieäu.
Ñöôøng IRQ leân möùc cao baát kì luùc naøo vieäc ghi nhaän döõ lieäu vaøo FIFO. Tín
hieäu naøy ñöôïc söû duïng ñeå ngaét vi xöû lí nhaèm chæ thò tính khaû duïng cuûa döõ lieäu.

I.3.1.2. Laäp trình cho 8279


Ñeå coù söû duïng 8279, caàn bieát caùc töø ñieàu khieån cuûa 8279.
8279 coù taát caû taùm töø ñieàu khieån, tuøy theo muïc ñích söû duïng maø seõ choïn töø
ñieàu khieån thích hôïp.
b Ñaët moát hieån thò / baøn phím

MSB LSB
Maõ 0 0 0 D D K K K

Trong ñoù, D D laø moát hieån thò vaø K K K laø moát baøn phím
DD
LUAÂÄN VAÊN TOÁT NGHIEÄP 23

0 0 Hieån thò 8 kí töï 8 bit _ ghi traùi


0 1 Hieån thò 16 kí töï 8 bit _ ghi traùi
1 0 Hieån thò 8 kí töï 8 bit _ ghi phaûi
1 1 Hieån thò 16 kí töï 8 bit _ ghi phaûi

KKK
0 0 0 Baøn phím queùt coù laäp maõ _ Khoùa ngoaøi 2 phím
0 0 1 Baøn phím queùt coù giaûi maõ _ Khoùa ngoaøi 2 phím
0 1 0 Baøn phím queùt coù laäp maõ _ Xoay voøng N phím
0 1 1 Baøn phím queùt coù giaûi maõ _ Xoay voøng N phím
1 0 0 Ma traän caûm bieán, queùt coù laäp maõ
1 0 1 Ma traän caûm bieán, queùt coù giaûi maõ
1 1 0 Ngoõ vaøo Strob, queùt hieån thò coù laäp maõ
1 1 0 Ngoõ vaøo Strob, queùt hieån thò coù giaûi maõ
Trong suoát thôøi gian RAM hieån thò ñang bò xoaù (∼ 160 μS), noù khoâng theå
ñöôïc ghi vaøo. Bit coù troïng soá cao nhaát (MSB) cuûa töø traïng thaùi ñöôïc ñaët trong
suoát thôøi gian naøy. Khi RAM hieån thò trôû neân khaû duïng trôû laïi, bit naøy töï ñoäng
ñöôïc ñaët laïi.
LUAÂÄN VAÊN TOÁT NGHIEÄP 24

Γ Khôûi taïo 8279


Maëc duø 8279 coù tôùi taùm töø ñieàu khieån, nhöng khoâng phaûi luùc naøo cuõng söû
duïng heát taát caû taùm töø naøy.
Khi khôûi taïo moät 8279, thöù töï caùc töø ñieàu khieån sau ñaây laø caàn thieát :
+ Ñaët moát hieån thò / baøn phím
+ Laäp trình xung ñoàng hoà
+ Xoaù RAM hieån thò, hoaëc FIFO hoaëc caû hai
Caùc töø ñieàu khieån coøn laïi coù theå ñöôïc gôûi ra thanh ghi ñieàu khieån trong luùc
naøy hoaëc khi caàn.
II. CAÙC THAM SOÁ CAÀN THIEÁT CUÛA KIT:
Treân ñaây, ñaõ giôùi thieäu caùc IC quaïn troïng ñeå coù theå keát noái Kit vôùi maùy
tính. Ngoaøi ra, caùc thoâng soá veà ñòa chæ cuõng khoâng keùm phaàn quan troïng.
Baûng : Baûng ñoà ñòa chæ boä nhôù cuûa kit

Vuøng ñòa chæ


Boä nhôù A15 A14 A13 A12 ⎯⎯⎯→ A0
boä nhôù
0 0 0 0 ⎯⎯⎯→ 0 0000H
ROM1
0 0 0 1 ⎯⎯⎯→ 1 1FFFH
0 0 1 0 ⎯⎯⎯→ 0 2000H
ROM2
0 0 1 1 ⎯⎯⎯→ 1 3FFFH
0 1 0 0 ⎯⎯⎯→ 0 4000H
RAM1
0 1 0 1 ⎯⎯⎯→ 1 5FFFH
0 1 1 0 ⎯⎯⎯→ 0 6000H
RAM2
0 1 1 1 ⎯⎯⎯→ 1 7FFFH
1 0 0 0 ⎯⎯⎯→ 0 8000H
RAM3
1 0 0 1 ⎯⎯⎯→ 1 9FFFH
1 0 1 0 ⎯⎯⎯→ 0 A000H
8279
1 0 1 1 ⎯⎯⎯→ 1 BFFFH
144424443
3 bit öùng vôùi 6
traïng thaùi cuûa 6
vuøng nhôù
LUAÂÄN VAÊN TOÁT NGHIEÄP 25

Döïa vaøo 3 bit A13, A14, A15 ñeå xaùc ñònh caùc vuøng ROM, RAM nhö sau:
74138
O0 CS\ROM1
A13 A O1 CS\ROM2
A14 B O2 CS\RAM1
A15 C O3 CS\RAM2
O4 CS\RAM3
O5 CS\8279
O6 No use
O7 No use

Hình 9 : choïn boä

Baûng 4 : Baûng ñoà ñòa chæ I/O cuûa kit

Vuøng ñòa chæ


Boä nhôù A7 A6 A5 A4 A3 A2 A1 A0
boä nhôù
0 0 0 0 0 0 0 0 00
8255A
0 0 0 0 0 1 1 1 07
0 0 0 0 1 0 0 0 08
8255B
0 0 0 0 1 1 1 1 0F
0 0 0 1 0 0 0 0 10
8253A
0 0 0 1 0 1 1 1 17
0 0 0 0 1 0 0 0 18
8253B
0 0 0 1 1 1 1 1 1F
0 0 1 0 0 0 0 0 20
8259
0 0 1 0 1 1 1 1 27
0 0 1 0 1 0 0 0 28
8251
0 0 1 0 1 1 1 1 2F
0 0 1 1 0 0 0 0 30
ADC0809
0 0 1 1 0 1 1 1 37
0 0 1 1 1 0 0 0 38
DAC0808
0 0 1 1 1 1 1 1 3F
144424443
3 bit öùng vôùi 6
traïng thaùi cuûa 6
vuøng nhôù
LUAÂÄN VAÊN TOÁT NGHIEÄP 26

Döïa vaøo 3 bit A3, A4, A5 coù theå xaùc ñònh ngoaïi vi söû duïng nhö sau:
74138
O0 CS\8255A
A3 A O1 CS\8255B
A4 B
A5
O2 CS\8253A
C
O3 CS\8253B
O4 CS\8259
O5 CS\8251
O6 CS\ADC0805
O7 CS\DAC0808

Hình 10: Choïn I/O

III. SÖÛ DUÏNG KIT:


Chöùc naêng caùc phím:
− Phím RESET hoaëc Q: khôûi ñoäng laïi toaøn boä heä thoáng Kit, caùc thanh ghi,
caùc ñieåm döøng, caùc khôûi taïo, ñeàu ñöôïc reset.
− Phím A hoaëc Address hoaëc S: ñaët laïi ñòa chæ oâ nhôù ñeå taùc ñoäng vaøo: xem
döõ lieäu, thay ñoåi noäi dung.
− Phím UP hoaëc ↑ : löu tröõ döõ lieäu ôû 2 led traùi vaøo ñòa chæ ghi ôû 4 led phaûi.
− Phím Down hoaëc ↓ : ñeå xem laïi döõ lieäu ñaõ naïp.
− Phím P hoaëc PC: ñaët ñòa chæ chaïy chöông trình.
− Phím G hoaëc GO: chaïy chöông trình taïi ñòa chæ ñaõ choïn saún.
− Phím I hoaëc INTR: ngaét chöông trình, khôûi ñoäng noùng heä thoáng, caùc
khôûi taïo, ñieåm döøng ñeàu vaãn coøn.
Caùc thao taùc nhaäp lieäu treân laø ñeå ñöa caùc döõ lieäu, caùc leänh vi xöû lyù ñaõ ñöôïc
maõ hoùa ra daïng maõ maùy, vaøo nhöõng ñòa chæ yeâu caàu cuûa ngöôøi thaûo chöông.
Vaøsau ñoù, keát quaû kieåm tra, chaïy thöû chöông trình seõ cho bieát chöông trình
ñuùng hay sai.
Muïc ñích chuû yeáu cuûa ñeà taøi laø ruùt ngaén thôøi gian dòch sang maõ maùy vaø
thôøi gian nhaäp lieäu, nghóa laø phaûi naïp ñöôïc döõ lieäu vaøo boä nhôù RAM maø khoâng
toán thôøi gian nhaäp lieäu.
LUAÂÄN VAÊN TOÁT NGHIEÄP 27

Chöông IV:

GIAO TIEÁP
MAÙY TÍNH VÔÙI
KIT THÖÏC TAÄP
VI XÖÛ LYÙ 8085
LUAÂÄN VAÊN TOÁT NGHIEÄP 28

Giao tieáp giöõa maùy tính vaø thieát bò ngoaïi vi coù theå baèng moät trong caùc caùch
sau:
I. GIAO TIEÁP BAÈNG SLOT-CARD:
Trong maùy tính, treân main board hoaëc IO-card, thöôøng cheá taïo saün caùc
raõnh caém (slot) cho pheùp môû roäng boä nhôù, caøi ñaët theâm phaàn cöùng, môû roäng
phaïm vi öùng duïng cho maùy tính.
Ñeå söû duïng ñöôïc caùc raõnh caém naøy, caàn phaûi coù taøi lieäu chính xaùc veà caùc
thoâng soá caàn thieát, ví duï ñòa chæ cuûa coång laø bao nhieâu, thuoäc loaïi raõnh bao nhieâu
bit, theo chuaån naøo, kich thöôùc phaàn maïch in caém vaøo , ñoä daøy maïch in, raõnh
nguoàn, raõnh döõ lieäu, raõnh döï tröõ, …
II. GIAO TIEÁP BAÈNG COÅNG MAÙY IN:
Moïi maùy tính ñeàu coù coång maùy in ñaët phía sau maùy. Coång maùy in khoâng chæ
ñeå keát noái vôùi maùy in maø coøn coù theå keát noái vôùi nhieáu loaïi thieát bò ngoaïi vi khaùc
cho muïc ñích ño löôøng vaø ñieàu khieån,…
Coång maùy in laø loaïi coång 25 chaân, döõ lieäu truyeàn song song, deã keát noái, caùc
ñòa chæ cuûa coång cuûa caùc maùy tính haàu nhö gioáng nhau.
Giao tieáp baèng coång maùy in goïi laø giao tieáp song song baát ñoàng boä. Trong
kieåu giao tieáp naøy, nôùi phaùt tín hieäu vaø nôùi nhaän tín hieäu ñeàu coù xung baùo phaùt
vaø xung baùo nhaän, taàn soá xung clock taïi nôi phaùt vaø taàn soá xung clock taïi nôi thu
khoâng caàn quan taâm.
III. GIAO TIEÁP BAÈNG COÅNG COM:
Coång COM ñöôïc söû duïng khaù phoå bieán. Döõ lieäu truyeàn ôû coång naøy thuoäc
daïng döõ lieäu noái tieáp. Tín hieäu truyeàn ôû coång naøy coù theå truyeàn ñi xa nhôø coù caáu
taïo ñöôøng daây caùp ít sôïi hôn coång song song, möùc aùp tín hieäu cao.
Coång COM coù loaïi 9 chaân vaø loaïi 25 chaân nhö coång song song, coù toång coäng
8 ñöôøng daãn tín hieäu khoâng keå ñöôøng noái ñaát, töø maùy tính ñi ra laø loaïi phích caém
nhieàu chaân khaùc vôùi coång song song.
Coång COM, coøn goïi laø coång noái tieáp theo chuaån RS-232. Chuaån RS-232 töø
naêm 1969 ñöôïc chaáp nhaän chuyeân duøng cho truyeàn soá lieäu vaø caùc ñöôøng noái
kieåm tra giöõa terminal vaø moderm, toác ñoä cöïc ñaïi laø 20Kbps, vôùi khoaûng caùc toái
ña khoâng quaù 15m. Ñaây laø laïi giao tieáp khoâng caân baèng coù driver.
Möùc aùp tín hieäu treân ñöôøng daây laø +15V/-15V. Treân ñöôøng daây, möùc logic 1
coù ñieän aùp töø 5V ñeán 15V vaø möùc logic 0 töø –5V ñeán –15V. möùc aùp naøy khoâng
töông thích TTL do ñoù thöôøng phaûi söû duïng theâm caùc IC chuyeân duïng MC1488,
MC1489 ñeå thay ñoåi möùc logic cho töông thích TTL.
Giao tieáp noái tieáp coøn chia ra noái tieáp baát ñoàng boä vaø noái tieáp ñoàng boä (söû
duïng caùc chuaån UART duøng CMOS 6402, USART duøng ngoaïi vi 8251, chuaån
ACIA duøng NMOS 6850 …).
IV. CHOÏN PHÖÔNG PHAÙP GIAO TIEÁP VAØ COÅNG KEÁT NOÁI:
Trong ñeà taøi naøy, vì lyù do thôøi gian coù haïn, neân ngöôøi thöïc hieän ñeà taøi chæ
coù theå söû duïng moät phöông phaùp truyeàn döõ lieäu, ñoù laø truyeàn döõ lieäu song song
baát ñoàng boä qua coång maùy in LPT1.
Coång LPT1 laø moät coång song song, döõ lieäu ñöôïc truyeàn vôùi toác ñoä khaù cao
töø maùy tính, do ñoù toác ñoä truyeàn döõ lieäu chung chæ coøn phuï thuoäc vaøo Kit.
LUAÂÄN VAÊN TOÁT NGHIEÄP 29

Hình daïng moät coång LPT1 ñöôïc cho trong hình sau:
13 1

25 14

Hình 11: Coång LPT (DB25).


Baûng 5: Boá trí chaân ôû coång LPT ôû maùy tính:

Chaân Kyù hieäu Vaøo/Ra Moâ taû


1 STROBE Output Byte ñöôïc in
2 D0 Output Ñöôøng döõ lieäu ñöôïc in D0
3 D1 Output Ñöôøng döõ lieäu ñöôïc in
4 D2 Output Ñöôøng döõ lieäu ñöôïc in
5 D3 Output Ñöôøng döõ lieäu ñöôïc in
6 D4 Output Ñöôøng döõ lieäu ñöôïc in
7 D5 Output Ñöôøng döõ lieäu ñöôïc in
8 D6 Output Ñöôøng döõ lieäu ñöôïc in
9 D7 Output Ñöôøng döõ lieäu ñöôïc in
10 Ack Input Acknowledge
11 Busy Input 1:maùy in baän
12 PE Input Heát giaáy
13 SCLT Input Select
14 AF Output Autofeet
15 ERROR Input Error
16 INIT Output 0: ñaët laïi maùy in
17 SLCTIN Output Select in
18 GND Noái ñaât
19 GND
20 GND
21 GND
22 GND
23 GND
24 GND
25 GND

Coång maùy in LPT1 coù ñòa chæ cô baûn laø 378Hex vaø coång LPT2 coù ñòa chæ cô
baûn laø 78Hex.
Caùc thanh ghi trong maùy tính keát noái vôùi coång maùy in:
Thanh ghi döõ lieäu (Data register, ñòa chæ = ñòa chæ cô baûn )
LUAÂÄN VAÊN TOÁT NGHIEÄP 30

D7 D6 D5 D4 D3 D2 D1 D0

D0 (Pin 2)
D1 (Pin 3)
D2 (Pin 4)
D3(Pin 5)
D4 (Pin 6)
D5 (Pin 7)
D6 (Pin 8)
D7 (Pin 9)

Thanh ghi traïng thaùi(status register, ñòa chæ = ñòa chæ cô baûn +1)
D7 D6 D5 D4 D3 0 0 0

ERROR(Pin 15)
SLCT(Pin 13)
PE(Pin 12)
ACK(Pin 15)
BUSY(Pin 11)
|

Thanh ghi ñieàu khieån(control register, ñòa chæ = ñòa chæ cô baûn + 2)
D7 D6 D5 D4 D3 D2 D1 D0

| D0 (Pin 1)
| D1 (Pin 14)
D2 (Pin 16)
D3(Pin 17)
|
IRQ-
Enable

Hình 12: Keát noái caùc thanh ghi ôû coång maùy in cuûa maùy tính PC.
Coång LPT laø coång gheùp noái song song, taát caû nhöõng ñöôøng daãn cuûa coång
naøy ñeàu töông thích TTL, nghóa laø chuùng ñeàu cung caáp moät möùc aùp naèm giöõa 0
vaø 5V. Do ñoù, raát thích hôïp cho keát noái vôùi Kit.
Nhìn vaøo baûng coâng duïng caùc chaân cuûa coång LPT vaø 3 thanh ghi cuûa maùy
tính, ta thaáy coù theå söû duïng thanh ghi data laø thanh ghi phaùt, coù nhieäm vuï
truyeàn döõ lieäu ra ngoaøi, vaø thanh ghi ñieàu khieån seõ gôûi tín hieäu ñieàu khieån cho
Kit, coøn thanh ghi traïng thaùi seõ nhaän tín hieäu baùo traïng thaùi hieän taïi cuûa Kit veà
maùy tính.
Ñeå keát noái giöõa Kit vaø maùy tính trong tröôøng hôïp naøy, phaûi söû duïng IC
giao tieáp ngoaïi vi 8255 ñeå xuaát vaø nhaän döõ lieäu. Coøn veà phía maùy tính, coù theå
duøng ngoân ngöõ laäp trình C ñeå ñoïc vaø xuaát caùc thanh ghi döõ lieäu. Ñeå keát noái ñôn
giaûn, coù theå khôûi taïo 8255 ôû mode 0 vôùi port A ñoïc thanh ghi data, port B xuaát
traïng thaùi traû veà cho thanh ghi trang thaùi, vaø port C duøng ñeå nhaän tín hieäu ñieàu
khieån töø thanh ghi ñieàu khieån cuûa maùy tính.
LUAÂÄN VAÊN TOÁT NGHIEÄP 31

Chöông V:

VIEÁT CHÖÔNG TRÌNH


VAØ DÒCH SSEMBLER
CHO CAÙC CHÖÔNG
TRÌNH VI XÖÛ LYÙ.
LUAÂÄN VAÊN TOÁT NGHIEÄP 32

I. TAÏI SAO PHAÛI SÖÛ DUÏNG CHÖÔNG TRÌNH DÒCH ASSEMBLER?


Khi hoïc vi xöû lyù, thì moïi sinh vieân ñeàu phaûi hoïc veà soá Hex, ñoåi soá giöõa caùc
heä, caùc soá buø,…, caùc pheùp toaùn soá hoïc vaø logic treân caùc bieán. Ngoaøi ra, coøn phaûi
hoïc moât loaïi ngoân ngöõ maùy khoù nhôù, chæ ñöôïc vieát baèng caùc kyù töï Hex, ñeå naïp
vaøo Kit. Moät caùch khaùc ñeå taïo ra caùc kyù töï khoù nhôù naøy laø söû duïng moät chöông
trình dòch Assembler ñeå dòch töø moät file coù phaàn môû roäng laø “asm” sang moät
file coù phaàn môû roäng “prn” chöùa ngoân ngöõ maùy. Ñaây laø lyù do phaûi söû duïng moät
chöông trình dòch Assembler. Vôùi muïc ñích naøy, ngöôøi söû duïng khoâng caàn thieát
phaûi bieát nhieàu veà ngoân ngöõa Assembly maø chæ caàn moät soá kieán thöùc nhoû ñeå goïi
chöông trình dòch. Ñaây chính laø caùch chính ñeå giaûm thieåu thôøi gian trong vieäc
dòch vaø nhaäp döõ lieäu vaøo Kit.
II. Moät soá ñieàu caàn löu yù khi söû duïng chöông trình dòch Assebler:
Ñeå vieát moät chöông trình vaø nhaäp vaøo Kit, thì ñaàu tieân phaûi bieát yeâu caàu
cuûa chöông trình, vieát löu ñoà toång quaùt, löu ñoà chi tieát vaø tieán haønh vieát chöông
trình. taát caû caùc böôùc treân ñeàu phaûi söû duïng laïi vôùi caùch laøm maø ñeà taøi naøy neâu
leân. Tuy nhieân, töø böôùc dòch töø ngoân ngöõ gôïi nhôù sang maõ maùy thì coù nhieàu ñieåm
khaùc nhau:
1) Khi vieát chöông trình ôû ngoân ngöõ gôïi nhôù (ngoân ngöõ Assembly), caàn phaûi
tuaân thuû moät soá qui ñònh rieâng ñeå coù theå duøng moät chöông trình dòch
Assembler.
a) Phaûi duøng töø khoùa “Org” ôû ñaàu vaø “End” ôû cuoái chöông trình, nhôù chöõ
end khoâng coù chaám cuoái caâu.
b) Taát caû caùc leänh ôû daïng gôïi nhôù phaûi ghi chính xaùc.
c) ÔÛ cuoáimoät soá Hex phaûi ghi kyù töï ‘h’ khoâng keå in hay thöôøng.
d) Neáu moät soá Hex baét ñaàu baèng moät kyù töï Alphabet, thì phaûi theâm lieàn
ngay tröôùc soá hex ñoù moät con soâ ‘0’.
e) Moät nhaõn khai baùo khoâng ñöôïc vöôït quaù 6 kyù töï.
f) Vaø moät soá qui ñònh khaùc.
2) Nhaäp chöông trình vaøo maùy tính: ñeå nhaäp deå daøng vaø thuaän tieän, coù theå söû
duïng Norton ôû cheá ñoä Edit, vaø löu thaønh moät file coù phaàn môû roäng laø “asm”.
3) Duøng chöông trình dòch Assembler ñeå dòch file treân thaønh moät file môùi coù
phaàn môû roäng la “prn”, file cuõ khoâng thay ñoåi.
4) Sau ñoù duøng chöông trình download ñeå naïp file vaøo Kit.
Taát caû caùc yeâu caàu treân ñeàu raát deã nhôù nhôø ñi theo moät trình töï nhaát ñònh
moät caùc töï nhieân. Norton laø moät chöông trình tieän ích raát phoå bieán. Chöông
trình Download coù giao dieän ñaõ ñöôïc toái giaûn nhaát.
III. FILE *.PRN, NOÄI DUNG, ÑAËC ÑIEÅM, VAØ DÖÕ LIEÄU CHÍNH:
Chöông trình dòch seõ dòch töø moät file x.asm sang moât file x.prn.
Xem noäi dung moät file coù phaàn ôû roäng prn trong ví duï sau:
LUAÂÄN VAÊN TOÁT NGHIEÄP 33

Giaû söû dòch file x.asm sau:


Org 0000h
MVI A,00h
STA 0A001h
MVI A,80h
STA 0A001h
MVI A,06h
STA 0A000h
HLT
Thì seõ ñöôïc file x.prn sau: END

MACRO-80 3.4 01-Dec-80 PAGE 1


Org 0000h
0000' 3E 00 MVI A,00h
0002' 32 A001 STA 0A001h
0005' 3E 80 MVI A,80h
0007' 32 A001 STA 0A001h
000A' 3E 06 MVI A,06h
000C' 32 A000 STA 0A000h
000F' 76 HLT
MACRO-80 3.4 01-Dec-80 PAGE S
Macros:

Symbols:

No Fatal error(s)

Trong ñoù, noäi dung caàn naïp vaøo Kit laø:


3E 00
32 A001
3E 80
32 A001
3E 06
32 A000
76

Nhöng vôùi thöù töï laø:


3E 00
32 01 A0
3E 80
32 01 A0
3E 06
32 00 A0
76
LUAÂÄN VAÊN TOÁT NGHIEÄP 34

Vaán ñeà ñaët ra laø laøm theá naøo ñeå loïc ra ñöôïc noäi dung chæ treân theo thöù töï
ñuùng nhö noäi dung naïp vaøo Kit. Vaán ñeà naøy seõ ñöôïc giaûi quyeát ôû chöông keá:
Chöông trình DownLoad.
LUAÂÄN VAÊN TOÁT NGHIEÄP 35

Chöông VI:

CHÖÔNG TRÌNH
DOWNLOAD
LUAÂÄN VAÊN TOÁT NGHIEÄP 36

I. ÑOÂI NEÙT VEÀ NGOÂN NGÖÕ C:


I.1. Nguoàn goác:
C ñöôïc phaùt minh vaø caøi ñaët ñaàu tieân bôûi Dennis Ritchie chaïy treân heä ñieàu
haønh Unix, ñöôïc Martin Richards phaùt trieån trong thaäp nieân 70. C söû duïng
chuaån ANSI ñöôïc ñeà nghò laàn cuoái cuøng vaøo naêm 1989.
I.2. C laø ngoân ngöõ baäc trung:
Ñöôïc xem laø ngoân ngöõ baäc trung vì C toå hôïp nhöõng thaønh phaàn toát nhaát
cuûa caùc ngoân ngöõ baäc cao vôùi söï ñieàu khieån vaø tính linh hoaït cuûa ngoân ngöõ
Assembly. C cho pheùp thao taùc treân caùc bit, caùc byte vaø caùc ñòa chæ – nhöõng
phaàn töû cô baûn vôùi caùc chöùc naêng cuûa maùy tính, maõ cuûa chöông trình C cuõng
mang tính khaû chuyeån.
I.3. C laø ngoân ngöõ cuûa laäp trình vieân:
C ñöôïc caùc laäp trình vieân laøm vieäc thaät söï taïo ra, thuùc ñaåy vaø kieåm tra, ñeå
roài C laïi mang veà cho hoï nhöõng gì hoï mong muoán: ít haïn cheá, ít lôøi phaøn naøn,
caùc caáu truùc khoái, caùc haøm ñôn leû, vaø moât taäp ñoùng kín nhöõng töø khoùa.
II. CAÙC PHÖÔNG PHAÙP LAÄP TRÌNH:
II.1. Phöông phaùp laäp trình leänh:
− Chöông trình laø moät daõy caùc leänh.
− Laäp trình laø xaùc ñònh caùc leänh cuøng vôùi thöù töï caùc leänh ñoù.
− Phöông phaùp naøy chæ coù giaù trò vôùi chöông trình leänh ( < 100
leänh).
II.2. Phöông phaùp laäp trình thuû tuïc:
− Chöông trình laø moät heä thoáng caùc thuû tuïc vaø haøm, moãi thuû
tuïc hay haøm laø moät daõy caùc leänh.
− Laäp trình laø ñi xaùc ñònh nhöõng thuû vaø haøm, vaø xaùc ñònh caùc
leänh beân tring thuû tuïc vaø haøm ñoù.
− Phöông phaùp naøy tieán boä hôn phöông phaùp treân.
II.3. Phöông phaùp laäp trình ñôn theå:
− Chöông trình laø moät heä thoâng caùc ñôn theå (module).
− Moãi ñôn theå laø moät heä thoáng thuû tuïc, haøm coù cuøng yù nghóa
naøo ñoù. Moãi thuû tuïc vaø haøm laø moät daõy caùc leänh.
− Caùc ñôn theå coù ñöôïc löu tröõ vaø bieân dòch phaân caùch, neân deã
daøng laép gheùp. Tuy nhieân phöông phaùp naøy coøn thieáu töï
nhieân, ngaøi ra neáu chöông trình quaù roäng vaø quaù saâu thì
khoâng theå quaûn lyù ñöôïc.
II.4. Phöông phaùp laäp trình höôùng ñoái töôïng:
− Chöông trình laø moät heä thoáng caùc ñoái töôïng, caùc ñoái töôïng
trong thöïc teá ñöôïc dieãn taû baèng ngoân ngöõ tin hoïc.
− Laäp trình laø ñi xaùc ñònh nhöõng ñoái töôïng cuøng nhöõng quan
heä cuûa chuùng.
− Tính töï nhieân cuûa phöông phaùp naøy laøm noù trôû neân sinh
ñoäng, moãi ñoái töôïng coù thuoäc tính vaø haønh ñoäng rieâng nhö
trong thöïc teá do ñoù deã hình dung, deã quaûn lyù. Ngoaøi ra,
LUAÂÄN VAÊN TOÁT NGHIEÄP 37

nhôø döïa treân caùc ñoái töôïng neân tính tieán hoùa vaø môû roäng
raát cao.
Trong phaàn vieát chöông trình giao dieän vi tính, ngöôøi vieát ñaõ choïn phöông
phaùp laäp trình höôùng ñoái töông. Nhôø nhöõng öu ñieåm treân, phöông phaùp naøy cho
pheùp boå sung moät caùch deã daøng, taïo ñieàu kieän thuaän lôïi cho vieäc boå sung sau naøy
neáu caàn.
III. PHÖÔNG PHAÙP LAÄP TRÌNH HÖÔÙNG ÑOÁI TÖÔÏNG TRONG C
III.1. Caùc khaùi nieäm:
Theá giôùi thöïc Phöông phaùp laäp trình Ngoân ngöõ laäp trình
Ñoái töôïng baát kyø trong Ñoái töôïng Bieán coù kieåu lôùp
theá giôùi thöïc (töông töï kieåu caáu truùc)
Khaùi nieän chung cuûa moät Lôùp ñoái töôïng Kieåu lôùp(Class-töông töï
ñoái töông kieåu caáu truùc)
Thuoäc tính ñöôïc quan Thuoäc tính Thaønh phaàn döõ lieäu cuûa
taâm cuûa ñoái töôïng kieåu lôùp
Khaû naêng coù theå thöïc Haønh ñoäng Thuû tuïc, haøm cuûa kieåu
hieän cuûa moät ñoái töông lôùp
III.2. Phöông phaùp:
III.2.1. Xaùc ñònh caùc lôùp ñoái töôïng, quan heä qua caùc lôùp naøy (xaây
döïng sô ñoà lôùp)
III.2.2. Thieát keá caùc lôùp (bieåu dieãn treân maùy tính)
− Thaønh phaàn döõ lieäu (thuoäc tính).
− Thaønh phaàn xöû lyù (haønh ñoäng).
III.2.3. Caøi ñaët caùc lôùp: Vieát haøm main()
III.2.4. Thöû nghieäm.
IV. Thöïc hieän vieát chöông trình DownLoad:
IV.1. Yeâu caàu cuûa giao dieän:
− Cho pheùp choïn file seõ truyeàn.
+ Baèng caùch goõ vaøo teân file
+ Baèng caùch click chuoät ñeå choïn
− Xem tröôùc vuøng nhôù caàn thieát seõ söû duïng ôû RAM ôû Kit 8085
− Choïn coång truyeàn.
− Truyeàn file coù kieåm tra.
IV.2. Choïn ngoân ngöõ laäp trình:
− Choïn ngoân ngöõ C vieát ôû moâi tröôøng Dos
− Lyù do: yeâu caàu thieát bò (maùy tính) khoâng cao, phuø hôïp kieán thöùc
ngöôøi vieát.
− Öu ñieåm: C laø moät coâng cuï laäp tình goïn nheï, chaïy nhanh, hieäu
quaû vaø kheùp kín. Vì söû duïng C ôû moâi tröôøng Dos neân khoâng caàn
phaûi kieåm soaùt caùc driver nhö neáu vieát ôû moâi tröôøng Windows.
Ngoân ngöõ C cho pheùp truy caäp tröïc tieáp caùc port, deå daøng kieåm
soaùt töøng bit döõ lieäu.
− Khuyeát ñieåm: Vuøng nhôù troáng ôû moâi tröôøng Dos chæ coù
640Kbyte, vaø sau khi khôûi ñoäng xong (ôû maøn hình dos) thì chæ
LUAÂÄN VAÊN TOÁT NGHIEÄP 38

coøn laïi treân döôùi 400Kbyte, khoâng cho pheùp taïo moät giao dieän
phöùc taïp. Ñoä phaân giaûi ôû cheá ñoä graph trong Dos khoâng theå so
saùnh vôùi moâi tröôøng Windows.

IV.3. Chöông trình Download:


Danh saùch caùc lôùp:
Teân lôùp Coâng duïng
Button.hpp Taïo caùc nuùt nhaán, vaø chöùa caùc haønh ñoäng lieân quan
Disklist.hpp Lieät keâ caùc oå ñóa trong maùy, vaø chöùa caùc haønh ñoäng lieân quan
List.hpp Ñeå veõ baûng lieät keâ caùc thö muïc vaø file, vaø chöùa caùc haønh ñoäng
lieân quan
Mouse.h Chöùa caùc thao taùc veà chuoät
Screen.h Chöùa caùc tham soá veà giao dieän maøn hình, vaø chöùa caùc haønh ñoäng
lieân quan
Textbox.hpp Veõ khung nhaäp lieäu (teân file, loaïi file,..) , vaø chöùa caùc haønh ñoäng
lieân quan
Xuat.hpp Chöùa caùc thao taùc, haønh ñoäng lieân quan ñeán truyeàn file
LUAÂÄN VAÊN TOÁT NGHIEÄP 39

Löu ñoà cuûa haøm main(): Begin

InitGraphics()

InitValues(…)

InitScreen()

InitMouse(…)

Khôûi S
CT baùo loãi
taïo
ø
Ñ

Mainpro() Ñoùng cheá ñoä


ñoà hoïa
Hình 13: löu
ñoà haøm
Main() cuûa closegraph() Thoa
chöông trình
DownLoad.

Giaûi thích löu ñoà: End


− Chöông trình baét ñaàu ôû begin.
− InitGraphisc():Khôûi taïo cheá ñoä ñoà hoïa, vì chöông trình naøy coù söû duïng maøn
hình ôû cheá ñoä ñoà hoïa trong moâi tröôøng Dos. Neáu khôûi taïo khoâng thaønh coâng
thì thoâng baùo loåi khôûi taïo vaø thoaùt khoûi chöông trình.
− InitValues(…): haøm naøy coøn khôûi taïo caùc giaù trò ban ñaàu cho maøn hình: kích
thöôùc cöûa soå, kích thöôùc kyù töï.
− InitScreen(): Veõ maøn hình vôùi caùc giaù trò ñaõ khôûi taïo
− InitMouse(): Khôûi taïo chuoät.
− Khôûi taïo thaønh coâng: kieåm tra, neáu khôûi ñoäng chuoät thaønh coâng thì tieáp tuïc
coâng vieäc, neáu khoâng thaønh coâng thì xuaát ra thoâng baùo loãi vaø thoaùt khoûi
chöông trình.
− MainPro laø chöông trình quaûn lyù moïi thao taùc cuûa toaøn boä chöông trình, töø
caùc thao taùc nhaäp xuaát ñeán caùc thao taùc löïa choïn caùc tuøy choïn.
LUAÂÄN VAÊN TOÁT NGHIEÄP 40

− Closegraph(): Ñoùng cheá ñoä ñoà hoïatröôùc khi thoaùt khoûi chöông trình.
− End: keát thuùc chöông trình.
Haøm Main() naøy ñöôïc vieát baèng ngoân ngöõ C :
void main(void)
{
InitGraphics();
InitValues("Chuong trinh truyen du lieu ra RAM");
InitScreen();

if (!InitMouse(&MainWindow.rViewPort))
{
OutMessage("Mouse driver not found. Init mouse and return");
getch();
closegraph();
exit(1);
}

ShowMouse();
MainProgram();
closegraph();
}
void main(void): void cho bieát raèng haøm main() khoâng traû veà moât giaù trò naøo,
nghóa laø trong haøm main naøy khoâng coù leänh return() hoaëc leänh laø moät leänh
return khoâng coù tham soâ. (void) cho bieát haøm main khoâng caàn ñoái soá ñöa vaøo.
Löu ñoà haøm Mainpro():
Begin

Khôûi taïo caùc giaù


trò cho caùc oâ nhaäp
text

Khôûi taïo caùc giaù


trò cho caùc nuùt
choïn

A
LUAÂÄN VAÊN TOÁT NGHIEÄP 41
A

Xuaát caùc oâ nhaäp


text ra maøn hình

Xuaát caùc nuùt


choïn
ra maøn hình

GetEvent()

Click vaøo Goïi chöông trình


oâ Open File nhaäp vaøo ñöôøng
daãn

Click Nuùt Goïi chöông trình


pull down xuaát cöûa soå choïn

Click nuùt Xaùc ñònh


Send file choïn

Click nuùt Xaùc nhaän


Exit thoaùt

Truyeàn
Nhaán Esc Return file

Hình 14: Löu ñoà cuûa haøm MainPro().


Giaûi thích löu ñoàhaøm MainPro():
LUAÂÄN VAÊN TOÁT NGHIEÄP 42

− Khôûi taïo caùc giaù trò cho caùc oâ nhaäp text: treân maøn hình seõ coù khung cho
pheùp goõ vaøo teân file, chöông trình con naøy seõ khôûi taïo caùc toïa ñoä, maøu chöõ
cho text.
− Khôûi taïo caùc giaù trò cho caùc nuùt choïn: cuõng gioáng nhö treân, nhöng ñoái vôùi caùc
nuùt Send, Exit vaø nuùt Pulldown.
− Xuaát caùc oâ nhaäp text ra maøn hình.
− Xuaát caùc nuùt choïn ra maøn hình.
− GetEvent: chöông trình con laán bieán coá chuoät. Bieán coá naøy chöùa caùc thoâng
tin veà toïa ñoä chuoät, phím naøo cuûa chuoät ñöôïc click, thôøi gian click laàn cuoái, …
ñeå xaùx ñònh caùc leänh keá tieáp caàn thöïc hieän.
− Click vaøo oâ Open File: neáu bieán coá click chuoät xaåy ra taïi toïa ñoä cuûa cuûa oâ
Open file thì keát quaû click vaøo oâ naøy laø TRUE, thöïc hieän chöông trình con
nhaäp vaøo file caàn xuaát. Ngöôïc laïi thì boû qua.
− Click vaøo nuùt Pulldown: neáu bieán coá click chuoät xaåy ra taïi toïa ñoä cuûa cuûa nuùt
Pulldown thì keát quaû click vaøo oâ naøy laø TRUE, goïi chöông trình xuaát ra cöûa
soå choïn File, ngöôïc laïi thì boû qua.
− Click nuùt Send: neáu bieán coá click chuoät xaåy ra taïi toïa ñoä cuûa cuûa nuùt Send
thì keát quaû click vaøo oâ naøy laø TRUE, thöïc hieän xaùc nhaän file xuaát ñaõ nhaäp
vaøo chöa, neáu file xuaát chöa nhaäp vaøo thì baùo loãi vaø boû qua leänh Send, neáu
file xuaát ñaõ coù teân roài thì xuaát file.
− Click nuùt Exit: neáu bieán coá click chuoät xaåy ra taïi toïa ñoä cuûa cuûa nuùt Exit thì
keát quaû click vaøo oâ naøy laø TRUE, thöïc hieän xaùc nhaän muoán thoaùt khoûi
chöông trình, neáu xaùc nhaän ñuùng thì thoaùt, ngöôïc laïi thì boû qua leänh Exit.
− Nhaán Esc: neáu ngöôøi duøng nhaán vaøo nuùt Esc treân baøn phím thì bieán coá Nhaán
Esc seõ laø TRUE, thöïc hieän xaùc nhaän muoán thoaùt khoûi chöông trình, neáu xaùc
nhaän ñuùng thì thoaùt, ngöôïc laïi thì boû qua leänh thoaùt baèng nuùt Esc.
Sau ñoù, chöông trình laïi thöïc hieän voøng laëp taïi haøm laáy bieán coá chuoät cho
tôùi khi coù thao taùc môùi.
Giaû söû click chuoät vaøo oâ Open File, oâ naøy seõ ñoåi traïng thaùi, caùc kyùtöï trong
oâ seõ ñoåi maøu baùo traïng thaùi chôø nhaäp, nhaäp vaøo moät teân fie coù phaàn môû roäng laø
“prn” vôùi ñaày ñuû ñöôøng daãn, sau ñoù goõ phímEnter thì teân file seõ ñöôïc löu vaøo
moät bieán toaøn cuïc, vaø caùc ñòa chæ ñaàu vaø ñòa chæ cuoái cuûa chöông trình ngoân ngöõ
maùy seõ ñöôïc hieän leân ôû khung “Free memory request”, vaø moät doøng thoâng baøo
beân döôùi baùo cho bieát click Send ñeå truyeàn file.
Giaû söû tieáp tuïc click Send thì moät thoâng baùo xaùc nhaän seõ xuaát hieän, muoán
xaùc nhaän coù chaéc laø ngöôøi duøng muoán truyeàn file khoâng. Neáu traû lôøi Ok thì
chöông trình truyeàn file seõ ñöôïc goïi thi haønh.
Sau ñaây laø löu ñoà cuûa chöông trình con thöïc hieän vieäc truyeàn File.
Giaûi thích löu ñoà:
− Goïi chöông trình caét file: chöông trình caét file thöïc chaát laø moät chöông trình
con coù nhieäm vuï loïc ra nhöõng thoâng tin quan troïng trong file “x.prn” seõ
ñöôïc truyeàn ñi, vaø löu chuùng trong moät file “x.tmp” chæ xuaát hieän trong
khoaûng thôøi gian chöông trình ñang caét file. Sau ñoù file “x.tmp” naøy seõ bò
xoaù ñi khi quaù trình truyeàn file hoaøn taát. Quaù trình truyeàn file phaûi söû duïng
LUAÂÄN VAÊN TOÁT NGHIEÄP 43

böôùc naøy ñeå caùc quaù trình baét tay giöõa maùy tính vaø Kit ñöôïc oån ñònh (thöïc
nghieäm), vaø vieäc vieát chöông trình ñöôïc roõ raøng hôn.
− Goïi chöông trình xuaát file: chöông trình naøy seõ ñoïc file coù teân laø “x.tmp”
ñöôïc taïo töø chöông trình caét file. Chöông trình naøy seõ tuaàn töï ñoïc file, nhaän
tín hieäu baét tay vaø gôûi döõ lieäu cho ñeán khi heát file.
− Trong quaù trình truyeàn file, neáu coù söï coá, giaû söû khoâng baét tay ñöôïc vì lyù do
naøo ñoù, thì chöôn trình seõ ñôïi, thôøi gian keùo daøi seõ coi nhö vieäc truyeàn file bi
loãi, vaø thoâng baùo loãi seõ xuaát hieän.
− Neáu truyeàn thaønh coâng thì thoâng baùo hoaøn taát coâng vieäc.
− Return: Quay trôû veà chöông trình MainPro.
Trong haøm MainPro(), caàn quan taâm chöông trình con truyeàn file.

Begin

Goïi chöông trình


Caét file

Goïi chöông trình


xuaát file

Sai
Thaønh
â
Ñuùn

Thoâng baùo Thoâng baùo


hoaøn loãi coâng vieäc

Return

Hình 15: Löu ñoà chöông trình con coù nhieäm vuï truyeàn file.
Trong phaàn naøy, ta quay laïi coâng vieäc caét file ñaõ giôùi thieäu ôû muïc III cuûa chöông
V.
Chöông trình con caét file laø ñeå taïo ra moät file taïm thôøi coù phaàn môû roäng .tmp.
file naøy seõ laø moät file coù caáu truùc ñôn giaûn hôn file .prn raát nhieàu nhaèm ñeå giuùp
cho vieäc truyeàn file theâm ñôn giaûn.
Tröôùc heát haõy khaûo saùt moät file *.prn, file naøy ñöôïc dòch ra bôûi 1 chöông trình
dòch Assembler.
LUAÂÄN VAÊN TOÁT NGHIEÄP 44

Trong chöông trình, byte leänh ñeàu tieân baét ñaàu ôû ñòa chæ 0000hex. Nhaän xeùt raèng
moãi doøng leänh baét ñaàu bôû moät ñòa chæ boä nhôù, vaø lieàn sau ñòa chæ naøy laø moät daáu
nhaùy ñôn, maø daáu nhaùy ñôn ñaàu tieân chæ xuaát hieän taïi ñòa chæ cuûa doøng leänh ñaàu
tieân.
⇒ ñeå tìm ñòa chæ ñaàu tieân thì coù theå tìm daáu nhaùy ñôn ñaàu tieân.
Coøn ñòa chæ cuoái cuøng laø ñòa chæ cuûa byte cuoái cuøng cuûa doøng leänh cuoái cuøng.
Doøng leänh cuoái cuøng laø doøng leänh naèm gaàn töø “Macros” nhaát. Töø macros naøy
cuõng laø töø macros duy nhaát.
⇒ caùch tìm ñòa chæ cuoái cuøng nhö sau:
− Tìm töø Macros
− Doø ngöôïc trôû veà phíc treân cho ñeán khi gaëp daáu nhaùy ñôn ñaàu tieân
− Tieáp tuïc doø ngöôïc veà tröôùc, neáu trong voøng 10 kyù töï maø gaëp moât kyù töï
xuoáng doøng thì thì daáu nhaùy ñôn vöøa roài naèm ngay sau doøng leänh cuoái cuøng.
− Trong doøng leänh cuoái cuøng, tìm byte cuoái cuøng seõ tính ñöôïc ñòa chæ cuoái cuøng.
Caùch tìm moät doøng leänh:
− Khi gaëp moät daáu nhaùy ñôn, thì tìm moät kyù töï khaùc daáu nhaùy ñôn hoaëc
khoaûng traéng.
− Khi gaëp kyù töï ñaàu tieân, ñoù chính laø kyù töï ñaàu tieân cuûa byte leänh.
− Neáu sau 2 kyù töï cuûa leänh laø moät khoaûng traéng thì 2 kyù töï vöøa roài chính laø
moät maõ leänh.
− Neáu sau 2 lyù töï cuûa moât byte leänh khoâng coù khoaûng traéng naøo, thì 2 kyù töï
vöøa roài chính laø 2 cuûa 4 kyù töï baùo moät ñòa chæ.
− Neáu sau 2 kyù töï tính töø luùc baét ñaàu moät leänh laø 2 khoaûng traéng trôû leân thì 2
byte vöøa roài laø 2 byte cuoái cuøng cuûa moät doøng leänh.
− Baét ñaàu moät chu kyø môùi tìm doøng maõ leänh.
Löu maõ leänh vaøo file *.tmp:
− Ñaàu tieàn löu ñòa chæ ñaàu, ñòa chæ cuoái vaøo file.
− Neáu gaëp maõ leänh (2 kyù töï) thì ghi tieáp vaøo file.
− Neáu gaëp maõ ñòa chæ thì ñoåi choå 2 kyù töï sau vôùi 2 kyù töï tröôùc cuûa ñòa chæ.
− Ñeán khi gaëp ñòa chæ cuoái cuøng thì ghi vaøo 2 kyù töï cuoái cuøng vaø ñoùng file.

MACRO-80 3.4 01-Dec-80 PAGE 1


Org 0000h
0000' 3E 00 MVI A,00h
0002' 32 A001 STA 0A001h
0005' 3E 80 MVI A,80h
0007' 32 A001 STA 0A001h
000A' 3E 06 MVI A,06h
000C' 32 A000 STA 0A000h
000F' 76 HLT
MACRO-80 3.4 01-Dec-80 PAGE S
Macros:

Symbols:

No Fatal error(s)
LUAÂÄN VAÊN TOÁT NGHIEÄP 45

Coâng vieäc treân ñöôïc moâ taû baèng löu ñoà sau:
Begin

Nhaän ñòa chæ


ñ à

Nhaän ñòa chæ


ái

Môû file
nguoàn

Môû file ñích

Tìm daáu “ ‘”

Ñoïc 2 kyù töï


leänh

Xeùt kyù töï tieáp


theo

Ñ
Khoâng laø Ñoïc 2 kyù töï tieáp
khoaûng theo
S Löu 2 kyù töï
sau
Laø moät Ñ
khoaûng
Löu 2 kyù
t é töï

S
≥2
khoaûng
traéng

Ñ
S
> ñòa chæ
cuoái
Ñ

En
LUAÂÄN VAÊN TOÁT NGHIEÄP 46

Begin

Hình 16: Löu ñoà chöông trình con Caét file


Sai
Busy=1

Ñuùn

Xuaát dlieäu ra
b

Strobe=1

Sai
ACK=1 & Error=0

Ñuùn

AF=1

sai
Ñoïc Error=0

Ñuùn

Thu nible cao

AF=0

sai
Error=1

Ñuùn

Thu nible
th á

Xuaát 00 ra sai
data bus Ktra döõ
li

AF=0 Strobe=0 Xuaát FF ra data


b

AF=0 Strobe=0

Chuaån bò döõ
lieäu keá tieáp Heát döõ
sai
Ñuùng
Return
LUAÂÄN VAÊN TOÁT NGHIEÄP 47

Hình 17: Löu ñoà chöông trình con xuaát döõ lieäu.
Sau khi caét file, moät file môùi ñaõ ñöôïc taïo ra. Chöông trình truyeàn file ñeán
böôùc xuaát file. Dó nhieân tröôùc khi xuaát file cuõng caàn coù nhöõng thuû tuïc môû file,
ñaët caùc möùc logic caàn thieát ñeå khôûi ñoäng coång: môû file hôïp leä, cho bit AF=0,
strobe=0.
Giaûi thích löu ñoà chöông trình xuaát file:
− Tröôùc tieân, maùy tính xuaát strobe=0, AF=0 baèng chaùch xuaát ra port
37Ahex soá 03hex (xem laïi thanh ghi ñieàu khieån ôû muïc IV chöông IV);
− Chöông trình xuaát baét ñaàu taïi begin.
− Ñoïc Busy\ cho tôùi khi baèng [1]: ñôïi kit phaùt ra Busy=[0] baùo hieäu ñaõ
saún saøng nhaän döõ lieäu.
− Neáu nhaän ñöôïc Busy\=[1] thì böôùc xuaát döõ lieäu ñöôïc thöïc hieän, töùc laø
luùc ñoù maùy tính ñoïc 2 kyù töï ñaàu tieân cuûa file .tmp vaø xuaát ra port 378
cuûa maùy tính.
− Strobe=[1]: ñeå baùo cho kit bieát döõ lieäu ñaõ ñöôïc göûi ra port ñeå kit bieát
maø ñoïc döõ lieäu vaøo.
− ACK=[1] vaø Error=[0]: khi nhaändl xong kit seõ baùo ACK=[1], Error=0
ñeå baùo cho maùy tính bieát Kit seõ göûi döõ lieäu ñeå kieåm tra ñuùng hay sai.
− AF=[1]: baùo cho Kit bieát maùy tính saún saøng nhaän döõ lieäu.
− Maùy tính ñoïc bit Error cho tôùi khi Error = [0] ñeå bieát Kit ñaõ göûi veà döõ
lieäu ñeå kieåm tra.
− Thu Nible cao: Nhaän döõ lieäu ñeå kieåm tra.
− Cho AF=[0]: ñaõ nhaän xong döõ lieäu.
− Ñoïc Error cho tôùi khi Error=[1] ñeå bieát ñaõ coù döõ lieäu môùi.
− Thu nible thaáp.
− Kieåm tra döõ lieäu: maùy tính seõ phaûi gheùp noái nible cao vôùi nible thaáp laïi
roài so saùnh vôùi döõ lieäu vöøa xuaát ra, neáu 2 döõ lieäu gioáng nhau thì keát quaû
xuaát döõ lieäu seõ laø ñuùng. Maùy tính seõ xuaát ra soá FFhex ôû thanh ghi data
ñeå baùo ñuùng, vaø xuaát AF=0 & strobe=0 ñeå baùo xuaát xong 1 byte döõ lieäu.
Ngöôïc laïi thì xuaát 00hex ra thanh ghi data vaø xuaát AF=0, strobe =0 ñeå
baùo keát quaû sai.
− Neáu keát quaû sai thì quay laïi xuaát laï byte vöøa roài ñaõ xuaát.
− Quay laïi töø ñaàu chöông trình xuaát döõ lieäu cho ñeán khi heát döõ lieäu.
IV.4. Chöông trình nhaän döõ lieäu ôû Kit:
Giaûi thích löu ñoà chöông trình nhaän döõ lieäu:
+ Chöông trình baét ñaàu taïi begin.
+ Tröôùc tieân phaûi khôûi taïo 8255 vôùi caùc cheá ñoä qui ñònh nhö sau:
− Port A: nhaän döõ lieäu töø thanh ghi data theo ket noái phaàn cöùng.
− Port B: xuaát traïng thaùi Kít traû veà maùy tính.
− Port C: nhaän tín hieäu ñieàu khieån töø thanh ghi ñieàu khieån cuûa maùy
tính.
LUAÂÄN VAÊN TOÁT NGHIEÄP 48

+ Sau ñoù baùo cho maùy tính bieát traïng thaùi baän. Muïc ñích cuûa coâng vieäc
naøy laø ñeå ñoàng boä thôøi ñieåm baét ñaàu chöông trình nhaän döõ lieäu vôùi
chöông trình xuaát döõ lieäu töø maùy tính.
+ Reset bieán ñeám ñòa chæ ñaàu vaø cuoái, nôi ñaët vuøng döõ lieäu nhaän ñöôïc töø
maùy tính.
+ Xuaát chöû Ready baùo cho ngöôøi söû duïng bieát traïng thaùi saún saøng nhaän
döõ lieäu cuûa kit. Chôø ngöôøi söû duïng goõ phím Go.
LUAÂÄN VAÊN TOÁT NGHIEÄP 49

Hình 18: Löu ñoà chöông trình nhaän döõ lieäu töø maùy tính gôûi xuoáng thieát bò thöïc
taäp vi xöû lyù 8085 (trang 1):

Begin

Khôûi taïo ngoaïi vi 8255:


+ Port A: nhaän döõ lieäu.
+ Port B: Xuaát traïng thaùi
+ Port C: nhaän tín hieäu ñieàu

Baùo thieát bò
baän

Reset bieán ñeám ñòa chæ ñaàu


vaø cuoái, nôi ñaët vuøng döõ
lieäu nhaän ñöôïc töø maùy
tính gôûi xuoáng

“READY”

Chôø goõ
phím “Go”

Goõ phím
“Go”

“SENDING”

Busy=0
Saún saøng nhaän
döõ li

1
LUAÂÄN VAÊN TOÁT NGHIEÄP 50

S
Strobe=1
Ñ
Busy=1, ACK=0

Ñoïc döõ lieäu,


ACK=1

S
AF=1
Ñ
Xuaát Nible cao
+Error=0

S AF=0

Ñ
Xuaát Nible thaáp
+Error=1

S Strobe=
0
Ñ
Ñoïc döõ lieäu
port A

S
(A)=FF

Ñ
Xöû lyù döõ lieäu

Busy=0
LUAÂÄN VAÊN TOÁT NGHIEÄP 51

Hình 18: Löu ñoà chöông trình nhaän döõ lieäu töø maùy tính gôûi xuoáng thieát bò thöïc
taäp vi xöû lyù 8085 (trang 2).
+ Khi phím Go ñöôïc goõ thì quaù trình nhaän döõ lieäu cuûa kit thöïc söï baét
ñaàu.
+ Kit baùo saún saøng chôø maùy tính göûi döõ lieäu xuoáng.
+ Ñoïc strobe cho tôùi khi baèng 1, ñeå bieát döõ lieäu ñaõ ñöôïc gôûi ra bus döõ
lieäu.
+ Xuaát Busy=1, ACK=0.
+ Ñoïc döõ lieäu vaø cho ACK=1. Luùc naøy kit ñaõ nhaän ñöôïc döõ lieäu nhöng
chöa bieát döõ lieäu coù chaéc chaén ñuùng khoâng. Sau ñoù baét ñaàu kieåm tra.
+ Ñoïc AF cho tôùi khi baèng 1, bieát maùy tính saún saøng nhaän döõ lieäu kieåm
tra.
+ Xuaát nible cao cuûa döõ lieäu kieåm tra (baèng 4 bit cao cuûa port B) vaø bit
Error=0 (bit PB3).
+ Ñoïc AF cho tôùi khi baèng 0, ñeå bieát maùy tính saún saøng nhaän4 bit thaáp
cuûa döõ lieäu kieåm tra.
+ Xuaát 4 bit thaáp vaø Error baèng 1.
+ Luùc naøy, maùy tính ñang nhaän vaø so saùnh döõ lieäu ñaõ gôûi ñi. Vaø keát quaû
so saùnh ñöôïc baùo cho kit ôû thanh ghi döõ lieäu, töùc portA cuûa 8255. Kit
ñoïc strobe cho tôùi khi strobe baèng [0] bieát keát quaû kieåm tra ñaõ saún
saøng.
+ Ñoïc port A laáy keát quaû kieåm tra.
+ Neáu keát quaû kieåm tra laø ñeùng thì thöïc hieän khaâu xöû lyù döõ lieäu (löu döõ
lieäu vaøo nôi caàn thieát) vaø quay laïi nhaän döõ lieäu keá tieáp. Neáu keát quaû laø
sai thì boû qua khaâu xöû lyù döõ lieäu maø quay trôû laïi nhaäp laïi döõ lieäu cuõ.
Quaù trình xaåy ra cho ñeán khi khaâu xöû lyù döõ lieäu nhaän ra ñaõ nhaäp ñeán döõ
lieäu cuoái cuøng thì keát thuùc khaâu xöû lyù seõ thoaùt nhö löu ñoà sau ñaây:

Start

Laáy döõ lieäu vöøa nhaän


Ñ
(c) = 00h ñöôïc laøm byte cao cuûa ñòa
chæ baét ñaàu vuøng nhôù
ñaët döõ lieäu.
S H (B)

Laáy döõ lieäu vöøa nhaän


Ñ ñöôïc laøm byte thaáp cuûa
(c) = 01h
ñòa chæ baét ñaàu vuøng
nhôù ñaët döõ lieäu.
S L (B)

Laáy döõ lieäu vöøa nhaän


(c) = 02h Ñ ñöôïc laøm byte cao cuûa ñòa
chæ chaám döùt vuøng nhôù
ñaët döõ lieäu.
S D (B)

A
1
LUAÂÄN VAÊN TOÁT NGHIEÄP 52

Hình 19: Löu ñoà chöông trình xöû lyù döõ lieäu (trang1).

A
1

Laáy döõ lieäu vöøa nhaän


Ñ ñöôïc laøm byte thaáp cuûa
(c) = 03h
ñòa chæ baét ñaàu vuøng
nhôù ñaët döõ lieäu.
S E (B)
Caát byte döõ lieäu vöøa
nhaän ñöôïc vaøo oâ nhôù
coù ñòa chæ naèm trong con
troû ñòa chæ (HL)
Taêng bieán ñeám leân
M (B)
moät ñôn vò.

Taêng giaù trò con troû ñòa


chæ leân moät ñôn vò
Return
HL←(HL) + 1

Ñaõ troû ñeán S


ñòa Reutrn
chæ cuoái

End.

Busy = 0

End.

Hình 19: Löu ñoà chöông trình xöû lyù döõ lieäu (trang 2).
Yù töôûng: Nhaäp 2 ñòa chæ ñaàu vaø cuoái vaøo 2 caëp thanh ghi HL vaø DE. Caëp
thanh ghi HL coøn ñöôïc coi laø con troû ñòa chæ troû ñeán oâ seõ chöùa döõ lieäu.
LUAÂÄN VAÊN TOÁT NGHIEÄP 53

Chöông trình seõ so saùnh ñòa chæ maø con troû troû ñeán vôùi ñòa chæ keát thuùc. Neá
chöa baèng thì löu döõ lieäu. neáu baèng thì thoaùt chöông trình.
Giaûi thích löu ñoà:
+ Chöông trình con baét ñaàu ôû start.
+ Boán böôùc so saùnh ñaàu tieân ñeå nhaäp ñòa chæ ñaàu, cuoái vaøo 2 caëp thanh
ghi.
+ Neáu noäi dung thanh ghi C lôùn hôn 3 thì 2 caëp thanh ghi ñaõ nhaän ñaày ñuû
caùc ñòa chæ ñaàu cuoái. Neân chöông trình seõ caát noäi dung vuûa nhaän ñöôïc
vaøo oâ nhôù coù ñòa chæ ghi trong caëp thanh ghi HL.
+ Quay laïi nhaän döõ lieäu keá tieáp.
+ Neáu con troû ñaõ troû ñeán ñòa chæ cuoái, thì chöông trình ñaõ ñöôïc nhaän ñaày
ñuû, luùc naøy seõ xuaát ra töø “End,” ñeå baùo hoaøn taát chöông trình.
+ Chaám döùt chöông trình.
LUAÂÄN VAÊN TOÁT NGHIEÄP 54

Chöông VII:

CHÖÔNG KEÁT LUAÄN


LUAÂÄN VAÊN TOÁT NGHIEÄP 55

KEÁT LUAÄN

Qua 7 tuaàn ngaén nguûi, ngöôøi thöïc hieän ñeà taøi ñaõ hoaøn taát coâng trình.
Muïc ñích cuûa ñeà taøi laø hoaøn thaønh moät chöông trình, nhö moät coâng
cuï hoïc taäp, coù khaû naêng ñoïc moät file döõ lieäu ñaõ ñöôïc löu treân maùy tính vaø
sau ñoù, loïc nhöõng noäi dung caàn thieát cho baøi thöïc taäp vi xöû lyù, roài truyeàn
taûi noäi dung ñoù vaøo boä nhôù RAM ôû kit thöïc taäp 8085.
Ñeà taøi ñaõ nhaèm vaøo nhöõng noäi dung chính sau:
Thöù nhaát: giôùi thieäu veà kit thöïc taäp söû duïng. Trong phaàn naøy, caùc linh
kieän quan troïng cuûa kit ñöôïc ñeà caäp ñeàn nhö CPU 8085, ngoaïi vi 8255, IC
hieån thò 8279.
Thöù hai: giôùi thieäu veà keát noái Kit vaø maùy tính: coång keát noái, caùc
thanh ghi. Beân caïnh ñoù laø nhöõng yeâu caàu ñeå vaän duïng phöông phaùp truyeàn
döõ lieäu trong ñeà taøi.
Sau cuøng laø noäi dung chuû yeáu cuûa ñeà taøi: nhöõng daãn luaän ñeå xaây döïng
löu ñ62 chöông trình truyeàn vaø nhaän döõ lieäu, phöông phaùp vaø thöïc hieän
vieát chöông trình.
Toùm laïi, thaønh quaû cuûa coâng trình laø chöông trình truyeàn döõ lieäu coù
nhöõng öu ñieåm veà maët yeâu caàu caáu hình maùy tính söû duïng, caùch söû duïng
ñôn giaûn, vaø quan troïng nhaát laø coù khaû naêng phaùt trieån veà sau. Coù theå ñeå
laøm taøi lieäu tham khaûo cho sinh vieân ñieän töû - tin hoïc vaø nhöõng ai quan taâm
ñeán daïng ñeà taøi naøy.
Tuy nhieân, ñeà taøi coøn coù moät soá haïn cheá: caàn phaûi coù maùy tính ñeå coù
theå söû duïng chöông trình; phaûi nhaäp chöông trình vaøo maùy tính tröôùc tieân
ôû daïng ngoân ngöõ Assembly.
Veà phía ngöôøi thöïc hieän ñeà taøi, trong thôøi gian ngaén nguûi vôùi söï noå
löïc cuûa baûn thaân vaø vôùi bao taâm huyeát ñaõ ñoå ra cuûa ngöôøi giaùo vieân trong
söï giuùp ñôõ taän tình, ñaõ hoaøn thaønh coâng trình nghieân cöùu vôùi keát quaû khaû
quan. Ñaây thaät söï laø moät vinh döï, moät nieàm töï vui lôùn cho sinh vieân ñoái vôùi
moâi tröôøng sö phaïm, ñoái vôùi thaày coâ vaø caû ñoái vôùi baûn thaân.
LUAÂÄN VAÊN TOÁT NGHIEÄP 56

PHAÀN PHUÏ ÑÍNH


LUAÂÄN VAÊN TOÁT NGHIEÄP 57

A.Chöông trình nhaän döõ lieäu ôû Kit thöïc taäp vi xöû lyù 8085.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;Chuo
ng trinh nhan du lieu tu may tinh goi xuong Thiet bi thuc tap
;vi xu li 8085.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Org
2500h
MVI A,99h ;khoi tao 8255, Mode 0: PortA nhap du lieu, PortB xuat
OUT RegCNT ;trang thai, PortC nhan lenh dieu khien.
MVI A,80h ;bao cho may tinh biet thiet bi dang ban.
OUT PortB
MVI C,00h ;reset bien dem dia chi.
CALL READY ;xuat chu "READY" ra hien thi tren 5 LED 7 doan.
WaitGO: CALL KEYBRD ;doi nhan phim.
CPI KeyGO ;chuong trinh chi thuc hien tiep khi nhan dung
JNZ WaitGO ;phim "GO".
CALL SENDING ;nhan dung phim "GO" se xuat hien "SENDING" tren 8 LED.
MVI A,00h ;bao cho may tinh biet thiet bi da san sang tiep ;nhan
OUT PortB ;du lieu.
CkSTB1:IN PortC ;doc lenh dieu khien STROBE tai PortC.
ANI 01h
CPI 01h
JNZ CkSTB1 ;neu STROBE # 1 thi doi tiep.
MVI A,80h ;bao BUSY\ = 0, ACK = 0.
OUT PortB
IN PortA ;doc du lieu vao.
MOV B,A ;tam cat du lieu vao thanh ghi B.
MVI A,0C0h ;bao ACK = 1.
OUT PortB
ChkAF1: IN PortC ;doc lenh dieu khien AF.
ANI 02h
CPI 02h
JNZ ChkAF1 ;neu AF # 1 thi doi tiep.
MOV A,B ;hoan tra B lai cho A.
ANI 0F0h ;che nibble thap va reset bit ERROR = 0.
OUT PortB ;xuat nibble cao va bao ERROR = 0.
ChkAF0: IN PortC ;doc lenh dieu khien AF.
ANI 02h
CPI 00h
JNZ ChkAF0 ;neu AF # 0 thi doi tiep.
MOV A,B ;hoan tra B lai cho A.
RLC ;dich 4 bit thap thanh 4 bit cao tuong ung.
RLC
RLC
RLC
ANI 0F0h ;che nua byte thap thap.
ORI 08h ;set bit ERROR = 1.
OUT PortB ;xuat nibble thap va bao ERROR = 1.
ChkSTB0:IN PortC ;doc lenh dieu khien STROBE.
ANI 01h
CPI 00h
LUAÂÄN VAÊN TOÁT NGHIEÄP 58

JNZ ChkSTB0 ;neu STROBE # 0 thi doi tiep.


IN PortA ;doc du lieu.
CPI 0FFh ;FFh la ma bao du lieu dung.
JZ NoChk
CALL PROCESS
NoChk: MVI A,40h ;bao BUSY\ = 1.
OUT PortB
JMP ChkSTB1 ;chuan bi nhan byte ke tiep.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
;Chuong trinh con hien thi "READY" tren nam LED 7 doan.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
READY: PUSH PSW
MVI A,10h ;khoi tao 8279: hien thi 8 ki tu,loi vao phai,
STA CntI79 ;quet ban phim co lap ma, khoa ngoai 2 phim.
MVI A,3Eh ;lap trinh xung Clock = 100 KHz.
STA CntI79
MVI A,0C3h ;xoa hien thi va xoa FIFO.
STA CntI79
MVI A,01h ;tri hoan 0.1 ms > 160 us.
CALL DELAY
MVI A,90h ;bat dau ghi vao tai LED dau tien ben phai, co
STA CntI79 ;tang dia chi tu dong.
MVI A,31h ;cho hien thi "R".
STA DataI79
MVI A,79h ;cho hien thi "E".
STA DataI79
MVI A,77h ;cho hien thi "A".
STA DataI79
MVI A,5Eh ;cho hien thi "D".
STA DataI79
MVI A,6Eh ;cho hien thi "Y".
STA DataI79
POP PSW
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;Chuo
ng trinh con hien thi "SENDING" tren bay LED 7 doan.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
SENDING:POP PSW
MVI A,10h ;khoi tao 8279: hien thi 8 ki tu,loi vao phai,
STA CntI79 ;quet ban phim co lap ma, khoa ngoai 2 phim.
MVI A,3Eh ;lap trinh xung Clock = 100 KHz.
STA CntI79
MVI A,0C3h ;xoa hien thi va xoa FIFO.
STA CntI79
MVI A,01h ;tri hoan 0.1 ms > 160 us.
CALL DELAY
MVI A,90h ;bat dau ghi vao tai LED dau tien ben phai, co
STA CntI79 ;tang dia chi tu dong.
MVI A,6Dh ;cho hien thi "S".
STA DataI79
MVI A,79h ;cho hien thi "E".
STA DataI79
MVI A,37h ;cho hien thi "N".
LUAÂÄN VAÊN TOÁT NGHIEÄP 59

STA DataI79
MVI A,5Eh ;cho hien thi "D".
STA DataI79
MVI A,06h ;cho hien thi "I".
STA DataI79
MVI A,37h ;cho hien thi "N".
STA DataI79
MVI A,6Fh ;cho hien thi "G".
STA DataI79
POP PSW
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;Chuo
ng trinh con xu li du lieu: Chuong trinh nay se nhan dia chi bat
;dau va dia chi cham dut cua vung du lieu, cac ma may cua chuong trinh
;tren may tinh do xuong se duoc dat trong pham vi vung nay.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
PROCESS:MOV A,C ;kiem tra xem co phai day la byte thu nhat
;khong ?
CPI 00h
JNZ A1
MOV H,B ;neu dung thi cat byte thu nhat vao thanh ghi H.
INR C ;tang bien dem byte dia chi len 1 don vi.
RET
A1: MOV A,C ;kiem tra xem co phai day la byte thu hai khong ?
CPI 01h
JNZ A2
MOV L,B ;neu dung thi cat byte thu hai vao thanh ghi L.
INR C ;tang bien dem byte dia chi len 1 don vi.
RET
A2: MOV A,C ;kiem tra xem co phai day la byte thu ba khong ?
CPI 02h
JNZ A3
MOV D,B ;neu dung thi cat byte thu ba vao thanh ghi D.
INR C ;tang bien dem byte dia chi len 1 don vi.
RET
A3: MOV A,C ;kiem tra xem day co phai la byte thu tu khong ?
CPI 03h
JNZ A4
MOV E,B ;neu dung thi cat byte thu tu vao thanh ghi E.
INR C ;tang bien dem byte dia chi len 1 don vi.
RET
A4: MOV M,B ;ke tu byte thu nam tro di se duoc cat vao o nho co
INX H ;dia chi do cap thanh ghi HL quan li.
MOV A,D
CPI H
RNZ
MOV A,E
CMP L
RNZ ;thoat neu HL tro den dia chi cham dut nam trong DE.
CALL END ;cho hien thi "END." tren ba LED 7 doan.
MVI A,40h ;bao BUSY\ = 1.
OUT PortB
HLT
LUAÂÄN VAÊN TOÁT NGHIEÄP 60

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;Chuo
ng trinh con hien thi "END." tren ba LED 7 doan.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
END: PUSH PSW
MVI A,10h ;khoi tao 8279: hien thi 8 ki tu,loi vao phai,
STA CntI79 ;quet ban phim co lap ma, khoa ngoai 2 phim.
MVI A,3Eh ;lap trinh xung Clock = 100 KHz.
STA CntI79
MVI A,0C3h ;xoa hien thi va xoa FIFO.
STA CntI79
MVI A,01h ;tri hoan 0.1 ms > 160 us.
CALL DELAY
MVI A,90h ;bat dau ghi vao tai LED dau tien ben phai, co
STA CntI79 ;tang dia chi tu dong.
MVI A,79h ;cho hien thi "E".
STA DataI79
MVI A,54h ;cho hien thi "N".
STA DataI79
MVI A,0DEh ;cho hien thi "D.".
STA DataI79
POP PSW
RET
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++;Hai
chuong trinh con sau day da co san trong thiet bi thuc tap Vi xu ;li 8085
;nen nguoi thuc hien de tai nay thay khong can thiet phai viet lai va ;trinh bay
;ra. Do la 2 chuong trinh:
;KeyKRB : Chuong trinh con quet ban phim. Ma cua phim an duoc cat ;trong thanh
; ghi A.
;DELAY : Chuong trinh con tri hoan theo thoi hang 0.1 ms. He so tri ;hoan duoc
; nap vao thanh ghi A.
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+++++
;#####################################################################;Khai bao cac
nhan duoc su dung.
;##################################################################### RegCNT
equ 03h
PortA equ 00h
PortB equ 01h
PortC equ 02h
CntI79 equ 0A001h
DataI79 equ 0A000h
KEYBRD equ 0216h
DELAYequ 0310h
KeyGO equ 17h
;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ End
LUAÂÄN VAÊN TOÁT NGHIEÄP 61

B.Module Demo.cpp
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <graphics.h>
#include <string.h>
#include <dos.h>
#include <math.h>
#include <complex.h>
#include <time.h>
#include <dir.h>
#include <ctype.h>

#include "screen.h"
#include "mouse.h"
#include "button.hpp"
#include "textbox.hpp"
#include "list.hpp"
#include "disklist.hpp"
#include "send.hpp"

#define NumBox 2
#define NumBut 2

LPEVENT lpEvent; //bien chua cac bien co chuot


char szMessage[128];

BUTTON But[NumBut],NutKiem;
TEXTBOX Box[NumBox],Port;
char DiskName[27],DName;
char ftype[15]="*.prn";
char inter_Path[100]="";
char RequF[100];
unsigned int St_address,End_address=0;
char Sta_hex[5],End_hex[5];
//---------------------------------------------------------
int TestPressedButton(int x,LPEVENT lpEvent);
int TestPressTexbox(int x,LPEVENT lpEvent,char layra[],unsigned *attribp);
void MainProgram();
int TestPressList(LIST L,LPEVENT lpEvent,char s[],unsigned *attrib,char *typ);//nhap bang
liet ke
int SendFile();
//---------------------------------------------------------
void main(void)
{
InitGraphics();
InitValues("Download Program.");
InitScreen();

if (!InitMouse(&MainWindow.rViewPort))
{
OutMessage("Mouse driver not found. Init mouse and return");
getch();
LUAÂÄN VAÊN TOÁT NGHIEÄP 62

closegraph();
exit(1);
}

ShowMouse();
MainProgram();
closegraph();
}
//---------------------------------------------------------
void MainProgram()
{
char Name[20],buffer[MAXPATH];
unsigned attrib,Attribp;
SEND Send;
LIST L;
But[0].InitButton(200,380,250,400,LIGHTGRAY,"Send");
But[1].InitButton(400,380,450,400,LIGHTGRAY,"Exit");
Box[0].InitTextBox(50,70,477,90,GREEN,LIGHTGREEN,"Open File");
Port.InitTextBox(50,270,250,290,GREEN,LIGHTGREEN,"Out port");
Port.GetS_in("LPT1");
L.InitList(480,70,500,90,LIGHTGRAY);

But[0].OutButton();//xuat nut lenh


But[1].OutButton();//xuat nut lenh
Box[0].OutTextBox();//xuat hop nhap text
Port.OutTextBox();
L.Show();
setcolor(BLACK);
line(50,150,250,150);
line(50,150,50,215);
setcolor(WHITE);
line(50,215,250,215);
line(250,150,250,215);
outtextxy(50,130,"Free memory request");
outtextxy(55,158,"Start ad :");
outtextxy(55,178,"End ad :");
outtextxy(55,198,"Total :");

OutMessage("Click mouse to chose action");


int kkkk;

char RequestFile[15]="";

do//kiem tra nhap chuot chon cong viec


{
ShowMouse();
lpEvent = GetEvent();//lay bien co chuot
if(TestPressedButton(2,lpEvent)==0)//kiem tra xem da click vao nut nao
//0:nhan OK
{
char InName[100],OutName[100];
Box[0].GetS(InName);
if(InName[strlen(InName)-1]=='\\')
LUAÂÄN VAÊN TOÁT NGHIEÄP 63

InName[strlen(InName)-1]='\0';
_dos_getfileattr(InName,&attrib);
if(attrib==16)
{
OutMessage("");
OutError("Please enter a file name");
OutMessage("Click mouse to chose action");
}
else//la file
{
if(End_address!=0)
{
if(OutError("Are you sure ?"))
{
OutMessage("Sending... Press Esc to stop if time is over.");
Send.CatFile(Sta_hex,End_hex,inter_Path);
Send.Out();
HideMouse();
if(Send.Out()!=-1)
{
HideMouse();
OutMessage("");
OutError("Task is complete.");
OutMessage("Click mouse to choose action");
}
else
{
HideMouse();
OutMessage("Click mouse to choose action");
}
}
}
}
}//if(TestPressedButton
if(TestPressList(L,lpEvent,Name,&attrib,ftype)==1)
//chon OK
{
switch (attrib)
{
case 16:chdir(Name);
getcwd(buffer, MAXPATH);//lay duong dan hien thoi vao buffer
strcpy(inter_Path,buffer);
Box[0].GetS_in(inter_Path);
Box[0].OutTextBox();
break;
default:
getcwd(buffer, MAXPATH);//lay duong dan hien thoi vao buffer
strcpy(inter_Path,buffer);
if(inter_Path[strlen(inter_Path)-1]!='\\')
strcat(inter_Path,"\\");
strcat(inter_Path,Name);
Box[0].GetS_in(inter_Path);
Box[0].DuongDan(inter_Path);
LUAÂÄN VAÊN TOÁT NGHIEÄP 64

Box[0].OutTextBox();
break;
}//end switch
}//if(TestPressList(
//chon Cancel
TestPressTexbox(NumBox,lpEvent,inter_Path,&Attribp);//Path lay ra duong dan cho file
nhap vao
//ShowMouse();
if(kbhit())
{
kkkk=getch();
if(kkkk==0)kkkk=getch();
}
Box[0].GetS(RequF);
{
int n=strlen(RequF);
if(n>5)//?.???
if(RequF[n-1]!='\\')
{
while(n>0&&RequF[n-1]!='\\')
{
n--;
}
char *strtemp=RequF;
for(int m=0;m<n;m++)
strtemp++;
if(strcmp(RequestFile,strtemp))//neu file chon co thay doi
{
setfillstyle(SOLID_FILL,CYAN);
bar(155,155,245,210);
strcpy(RequestFile,strtemp);
strtemp+=strlen(strtemp)-4;
if(!strcmp(strtemp,".prn"))//neu dung file prn
{
FILE *f;
if ((f = fopen(RequF,"rb")) == NULL)
{
fprintf(stderr, "Cannot open input file.\n");
return ;
}
else//neu mo duoc file
{
clock_t start, end;
int period=0;

char c,address[7],buf[8];
int thoat;
int dem;

char
KyTu_Hex[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','a','b','c','d','e','f'};
int Gtri_Dec[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15};
double Value1=0,Value2=0;
LUAÂÄN VAÊN TOÁT NGHIEÄP 65

char Total[10];
int FindPos,FindValue;

start = clock();
do
{
fread(&c,1,1,f);
end = clock();
}while(c!='\''&&(period=(end - start) / CLK_TCK)<10);
if(period>=2) goto Error;

fseek(f,-5,SEEK_CUR);
fread(address,10,1,f);
address[4]='\0';
strcpy(Sta_hex,address);
HideMouse();
strcat(address," Hex");
outtextxy(170,158,address);

for (FindPos=3;FindPos>=0;FindPos--)
for(FindValue=0;FindValue<22;FindValue++)
if(address[FindPos]==KyTu_Hex[FindValue])
Value1+=pow(16,(3-FindPos))*Gtri_Dec[FindValue];
St_address=(unsigned int)Value1;

ShowMouse();
thoat=1;
start = clock();
do
{
do
{
fread(&c,1,1,f);
end = clock();
}while(c!='m'&&c!='M'&&(period=(end - start) / CLK_TCK)<10);
if(period>=10) goto Error;
fseek(f,-1,SEEK_CUR);
fread(buf,7,1,f);
buf[7]='\0';
end = clock();

if(!strcmp(buf,"Macros:")||!strcmp(buf,"MACROS:")||!strcmp(buf,"macros:"))
thoat=0;
}while(thoat&&(period=(end - start) / CLK_TCK)<15);
if(period>=15) goto Error;
fseek(f,-1,SEEK_CUR);
start = clock();
do
{
dem=0;
do
{
LUAÂÄN VAÊN TOÁT NGHIEÄP 66

fread(&c,1,1,f);
if(c=='\n')
fseek(f,-3,SEEK_CUR);
else
fseek(f,-2,SEEK_CUR);
end = clock();
}while(c!='\''&&(period=(end - start) / CLK_TCK)<10);
if(period>=10) goto Error;
do
{
dem++;
fread(&c,1,1,f);
if(c=='\n')
dem=20;
fseek(f,-2,SEEK_CUR);
end = clock();
}while(dem<10&&(period=(end - start) / CLK_TCK)<15);
if(period>=15) goto Error;
end = clock();
}while(dem!=20&&(period=(end - start) / CLK_TCK)<15);
if(period>=15) goto Error;
fseek(f,2,SEEK_CUR);
start = clock();
do
{
fread(&c,1,1,f);
end = clock();
}while(c!='\''&&(period=(end - start) / CLK_TCK)<10);
if(period>=10) goto Error;
fseek(f,-5,SEEK_CUR);
fread(buf,4,1,f);
buf[4]='\0';
HideMouse();
strcpy(End_hex,buf);
strcat(buf," Hex");
outtextxy(170,178,buf);

for (FindPos=3;FindPos>=0;FindPos--)
for(FindValue=0;FindValue<22;FindValue++)
if(buf[FindPos]==KyTu_Hex[FindValue])
Value2+=pow(16,(3-FindPos))*Gtri_Dec[FindValue];
End_address=(unsigned int)Value2;
Value1=Value2-Value1+1;
sprintf(Total,"%0.0f bytes",Value1);
outtextxy(160,198,Total);

outtextxy(260,250,buf);
ShowMouse();
while(0)
{
Error:
strcpy(buf,"error");
setfillstyle(SOLID_FILL,CYAN);
LUAÂÄN VAÊN TOÁT NGHIEÄP 67

HideMouse();
bar(155,155,245,210);
outtextxy(200,158,buf);
outtextxy(200,178,buf);
outtextxy(200,198,buf);
ShowMouse();
}
fcloseall();
}
}
else
{
OutMessage("");
}
}
}
}
if(kkkk==27)
{
HideMouse();
if(!OutError("Do you want to quit ?"))
kkkk=0;
ShowMouse();
}
}while(kkkk!=27);
}
//---------------------------------------------------------
int TestPressedButton(int x,LPEVENT lpEvent)//kiem tra cac nut
{
if(lpEvent->Msg==1)
{
for(int i=0;i<x;i++)
if(But[i].Left()<= lpEvent->Posx&&But[i].Top()<=lpEvent-
>Posy&&But[i].Right()>=lpEvent->Posx&&But[i].Bottom()>=lpEvent->Posy)
{
HideMouse();
But[i].PressButton();
delay(100);
But[i].OutButton();
if(i==1)
{
if(OutError("Do you want to quit ?")==0)
return -1;
closegraph();
exit(1);
}
ShowMouse();
return i;
}
}
return -1;
}
//---------------------------------------------------------
LUAÂÄN VAÊN TOÁT NGHIEÄP 68

int TestPressTexbox(int x,LPEVENT lpEvent,char layra[],unsigned *attribp)


{
*attribp=0;
if(lpEvent->Msg==1)
{
for(int i=0;i<x;i++)
if(Box[i].Left()<= lpEvent->Posx&&Box[i].Top()<=lpEvent-
>Posy&&Box[i].Right()>=lpEvent->Posx&&Box[i].Bottom()>=lpEvent->Posy)
{
HideMouse();//giau chuot de khong bi vet lem mau o vi tri chuot
char LastName[100];
Box[i].GetS(LastName);
OutMessage("Enter a file name. Press Enter to finish, Esc to ignore.");
Box[i].Path();//lay Path vao bien S cua TEXTBOX
Box[i].OutTextBox();
Box[i].GetS(layra);//lay ra text da nhap vao

//tao chuan cho chuoi Path


if(layra[strlen(layra)-1]=='>')//gat bo dau \> sau thu muc nhung van giu lai doi voi o
dia
if(layra[strlen(layra)-2]=='\\')
if(layra[strlen(layra)-3]==':')//dang a:\>
layra[strlen(layra)-1]='\0';//ra a:\
else //dang a:\fname\>
layra[strlen(layra)-2]='\0';//ra dang a:\fname
else
layra[strlen(layra)-1]='\0';//bo dau >
if(layra[strlen(layra)-1]=='\\')//gat bo dau \ sau thu muc nhung van giu lai doi voi o dia
if(layra[strlen(layra)-2]!=':')//dang a:\fname\
layra[strlen(layra)-1]='\0';
if(layra[strlen(layra)-1]==':')
if(strlen(layra)==2)//dang a:
strcat(layra,"\\");//ra a:\

int NotExist=_dos_getfileattr(layra, attribp);

int m=strlen(layra)-1;
while(layra[m]!='\\')//dem so ky tu thuoc ve phan Path
m--;
for(int n=0;n<m;n++)//doi thanh chu hoa duong dan
if(layra[n]>='a'&&layra[n]<='z')
layra[n]=toupper(layra[n]);
Box[i].GetS_in(layra);

if(i==0)//chon Open file


{
if(*attribp==16)
{
m=strlen(layra);
while(layra[--m]!='\\')//doi sang chu hoa ten cua thu muc
layra[m]=toupper(layra[m]);

if(layra[1]==':'&&layra[0]!=LastName[0])
LUAÂÄN VAÊN TOÁT NGHIEÄP 69

setdisk(toupper(layra[0])-'A');
chdir(layra);//vao them mot cap thu muc
if(layra[strlen(layra)-1]!='\\')
strcat(layra,"\\");
Box[0].GetS_in(layra);
Box[0].OutTextBox();
OutMessage("Click mouse to chose action");
return 0;
}
if (NotExist == 0)
{
return 0;
}
else
{
OutMessage("File does not exist.");
Box[0].GetS_in(LastName);
Box[0].OutTextBox();
return 1;
}
}//end if Open
}
}
return -1;
}
//---------------------------------------------------------
int TestPressList(LIST L,LPEVENT lpEvent,char s[],unsigned *attrib,char *typ)
{
int k=0;
if(lpEvent->Msg==1)

if(L.Left()<= lpEvent->Posx&&L.Top()<=lpEvent->Posy&&L.Right()>=lpEvent-
>Posx&&L.Bottom()>=lpEvent->Posy)
{
OutMessage("Open File Name");
delay(100);//neu khong thi khong the putimage, khong thoat khoi bang list duoc
k=L.Press(s,&Box[0],attrib,DiskName,&DName,typ);
}
return k;
}
//---------------------------------------------------------
II.CLASS BUTTON.HPP
#if !defined __BUTTON__
#define __BUTTON__
class BUTTON
{
private:
int l,t,r,b;//toa do box
int Color;
char S[100];
public:
void InitButton(int x1,int y1,int x2,int y2,int color,char s[]);
void OutButton();
LUAÂÄN VAÊN TOÁT NGHIEÄP 70

void PressButton();
int Left() {return l;}
int Right() {return r;}
int Top() {return t;}
int Bottom() {return b;}
};
#endif
III.MODULE BUTTON.CPP
#include <graphics.h>
#include <string.h>

#include "button.hpp"
//---------------------------------------------------------
void BUTTON::InitButton(int x1,int y1,int x2,int y2,int color,char s[])
{
l=x1;
t=y1;
r=x2;
b=y2;
Color=color;
strcpy(S,s);
}
//---------------------------------------------------------
void BUTTON::OutButton()
{
setfillstyle(SOLID_FILL,Color);
bar(l,t,r,b);
setcolor(WHITE);
line(l,t,r,t);
line(l,t,l,b);
setcolor(BLACK);
line(r,t,r,b);
line(l,b,r,b);
setcolor(BLUE);
int x=l+(r-l-textwidth(S))/2,y=t+(b-t-textheight(S))/2;
outtextxy(x,y,S);
}
//---------------------------------------------------------
void BUTTON::PressButton()
{
setcolor(BLACK);
line(l,t,r,t);
line(l,t,l,b);
setcolor(WHITE);
line(r,t,r,b);
line(l,b,r,b);
}
//---------------------------------------------------------
IV. CLASS DISKLIST.HPP
#include "textbox.hpp"
#include "mouse.h"
#if !defined __DISKLIST__
#define __DISLIST__
LUAÂÄN VAÊN TOÁT NGHIEÄP 71

extern char Disk(char *s);


extern int ChosenDisk(char *s,/*TEXTBOX *Box,*/char PreDisk,char CurDisk);
extern LPEVENT CheckChooseDisk(char *DiskName,char *DName,LPEVENT lpEvent,int
x,int y);
extern char *FileType(TEXTBOX *b);

#endif
V.MODULE DISKLIST.CPP
#include <dir.h>
#include <alloc.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <graphics.h>
#include <bios.h>
#include <PROCESS.H>
// <PROCESS.H, STDLIB.H>

#include "disklist.hpp"

char Disk(char *s)//kiem tra co bao nhieu o dia trong may, luu ten cac o dia vao chuoi s, tra ve
ten o dia hien hanh
{
int save,disk, disks;
int equip_check;
char c[4];
s[0]='\0';
save = getdisk();
equip_check = biosequip();
equip_check >>= 6;
equip_check = (equip_check & 3) + 1;//dem so o dia mem
for (disk = 0;disk < 26;++disk)
{
setdisk(disk);
if (disk == getdisk())
{
sprintf(c,"%c",disk +'A');
strcat(s,c);
}
}
setdisk(save);
if(equip_check==1&&s[1]=='B')//neu chi co ot o dia mem
for(int i=1;i<strlen(s);i++)//thi khong co ten o dia B
s[i]=s[i+1];//loai ky tu B ra khoi chuoi luu ten o dia
}
//---------------------------------------------------------
int ChosenDisk(char *s,/*TEXTBOX *Box,*/char PreDisk,char CurDisk)
//tra ve ten o dia
{
int i;
if(PreDisk!=CurDisk)
{
LUAÂÄN VAÊN TOÁT NGHIEÄP 72

for(i=0;i<strlen(s);i++)
if((CurDisk)==s[i])//hien thi cho dia moi
{

setdisk(s[i]-'A');
char buffer[MAXPATH],*iem;
if((iem=getcwd(buffer, MAXPATH))==NULL)
{
OutMessage("Driver is not ready.");
i=0;
ShowMouse();
return s[i];
}
}
return s[i];
}
//---------------------------------------------------------
LPEVENT CheckChooseDisk(char *DiskName,char *DName,LPEVENT lpEvent,int x,int y)
{
int NumDisk=strlen(DiskName);
int x1=x-30,y1=y+NumDisk*14+12;

void far *buf;//con tro chi vung luu tru man hinh
unsigned int size = imagesize(x1,y,x,y1);
if ((buf = farmalloc(size)) == NULL)
{
OutMessage("Error: not enough heap space in save_screen().");
getch();
closegraph();
exit(1);
}
else
{
getimage(x1,y,x,y1,buf);
OutMessage("Click a drive name in the list");
}

setfillstyle(SOLID_FILL,WHITE);
bar(x1,y,x,y1);
setcolor(BLACK);
rectangle(x,y,x1,y1);
setcolor(LIGHTGRAY);
line(x-1,y+1,x-1,y1-1);
line(x1+1,y1-1,x-1,y1-1);
setcolor(BLACK);

char Temp[3];
for(int i=0;i<NumDisk;i++)
{
sprintf(Temp,"%c:",DiskName[i]);
outtextxy(x1+10,y+10+i*14,Temp);
}
for(i=0;i<NumDisk;i++)
LUAÂÄN VAÊN TOÁT NGHIEÄP 73

if(*DName==DiskName[i])
break;
setfillstyle(SOLID_FILL,BLUE);
bar(x1+1,y+7+14*i,x-1,y+7+14+14*i);
setcolor(YELLOW);
sprintf(Temp,"%c:",DiskName[i]);
outtextxy(x1+10,y+10+i*14,Temp);

LPEVENT LpEvent;

do
{
ShowMouse();
delay(50);
LpEvent=GetEvent();
HideMouse();
if(LpEvent->Msg==1)
for(i=0;i<NumDisk;i++)
if(LpEvent->Posx>=x1+1&&LpEvent->Posx<=x-1&&LpEvent-
>Posy>=y+7+i*14&&LpEvent->Posy<=y+7+14+i*14)
{
bar(x1+1,y+7+14*i,x-1,y+7+14+14*i);
*DName=DiskName[i];
setdisk((int)*DName-65);
}
}while(LpEvent->Msg!=1);
putimage(x1,y,buf,COPY_PUT);
farfree(buf);
return LpEvent;
}
//---------------------------------------------------------
char *FileType(TEXTBOX *b)
{
char s[15];
b->Path();
b->OutTextBox();
b->GetS(s);
return s;
}

VI.CLASS LIST.HPP
#include "textbox.hpp"
#include "disklist.hpp"
#if !defined __LIST__
#define __LIST__
class LIST
{
private:
int l,t,r,b;
int Color;
public:
void InitList(int x1,int y1,int x2,int y2,int Color);
void Show();
LUAÂÄN VAÊN TOÁT NGHIEÄP 74

int Press(char s[],TEXTBOX *Box,unsigned *attrib,char *DiskName,char *DName,char


*ftype);
int GetList(char s[],TEXTBOX *Box,unsigned *attrib,char *DiskName,char
*DName,TEXTBOX *Box2,char *ftype);
int Left(){return l;};
int Right(){return r;};
int Top(){return t;};
int Bottom(){return b;};
};
#endif

VII.MODULE LIST.CPP

#include <graphics.h>
#include <dir.h>
#include <dos.h>
#include <stdlib.h>
#include <string.h>
#include <alloc.h>
#include <stdio.h>
#include <conio.h>
#include <ctype.h>
#include "mouse.h"
#include "list.hpp"
//---------------------------------------------------------
void LIST::InitList(int x1,int y1,int x2,int y2,int col)
{
Color=col;
l=x1;t=y1;r=x2;b=y2;
}
//---------------------------------------------------------
void LIST::Show()
{
setfillstyle(SOLID_FILL,Color);
bar(l,t,r,b);
int hor=(r-l)/3,ver=(b-t)/3;
int x1=l+hor,x2=r-hor,x3=l+(r-l)/2,y1=t+ver,y2=t+ver,y3=b-ver;
setcolor(WHITE);
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x1,y1,x3,y3);

setfillstyle(SOLID_FILL,WHITE);
floodfill(x1+(x2-x1)/2,y1+(y3-y2)/2,WHITE);
setfillstyle(SOLID_FILL,Color);

setcolor(BLACK);
line(l,b,r,b);
line(r,t,r,b);
setcolor(WHITE);
line(l,t,r,t);
line(l,t,l,b);
}
LUAÂÄN VAÊN TOÁT NGHIEÄP 75

//---------------------------------------------------------
int LIST::Press(char s[],TEXTBOX *Box,unsigned *attrib,char *DiskName,char *DName,char
*ftype)
//tra ve 0:nhan Cancel
//tra ve 1:nhan OK
{
TEXTBOX Box2;

HideMouse();

int hor=(r-l)/3,ver=(b-t)/3;
int x1=l+hor,x2=r-hor,x3=l+(r-l)/2,y1=t+ver,y2=t+ver,y3=b-ver;

setcolor(BLACK);
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
line(x1,y1,x3,y3);

setfillstyle(SOLID_FILL,BLACK);
floodfill(x1+(x2-x1)/2,y1+(y3-y2)/2,BLACK);
setfillstyle(SOLID_FILL,Color);

setcolor(WHITE);//vien cho nut bi nhan


line(l,b,r,b);
line(r,t,r,b);
setcolor(BLACK);//vien cho nut bi nhan
line(l,t,r,t);
line(l,t,l,b);

int k=0;
*DName=Disk(DiskName);
do
{
char buffer[MAXPATH];
k=GetList(s,Box,attrib,DiskName,DName,&Box2,ftype);
getcwd(buffer, MAXPATH);
Box->GetS_in(buffer);
Box->OutTextBox();
}while(k==2);
ShowMouse();
return k;//k=0: nhan Cancel, k=1:nhan OK
}
//---------------------------------------------------------
int LIST::GetList(char s[],TEXTBOX *Box,unsigned *attrib,char *DiskName,char
*DName,TEXTBOX *Box2,char *ftype)
{
int x11=l-300,y11=b,x12=r+100,y12=b+300;//toa do bang ngoai
//600 x 300 la kich thuoc bang ngoai

int Kiemtra=0;//bien de kiem tra truong hop chon OK truoc khi chon file
LPEVENT lpEvent;//kiem tra bang thu muc

void far *buf;//con tro chi vung luu tru man hinh
LUAÂÄN VAÊN TOÁT NGHIEÄP 76

unsigned int size = imagesize(x11,y11,x12,y12);


if ((buf = farmalloc(size)) == NULL)
{
OutMessage("Error: not enough heap space in save_screen().");
getch();
closegraph();
exit(1);
}
else
{
getimage(x11,y11,x12,y12, buf);
OutMessage("Choose a file name then click OK to accept or click Cancel to ignore");
}

setfillstyle(SOLID_FILL,LIGHTGRAY);//GREEN);
bar(x11,y11,x12,y12);//ve bang ngoai

int x21=x11+5,y21=y11+5,x22=x12-120,y22=y12-77;//75;//toa do bang liet ke


setfillstyle(SOLID_FILL,WHITE);//MAGENTA);
bar(x21,y21,x22,y22);//ve bang liet ke

int x31=x22+30,y31=y21+50,x32=x31+60,y32=y31+20;//toa do nut OK

int x41=x31,y41=y31+100,x42=x32,y42=y32+100;

setcolor(WHITE);

line(x11,y11,x12,y11);
line(x11,y11,x11,y12);

line(x22+2,y21-2,x22+2,y22+2);//vien cho bang liet ke


line(x21-1,y22+2,x22+2,y22+2);//vien cho bang liet ke

line(x31,y31,x32,y31);//vien cho nut OK


line(x31,y31,x31,y32);//vien cho nut OK

line(x41,y41,x42,y41);//vien nut Cancel


line(x41,y41,x41,y42);//vien nut Cancel

setcolor(BLACK);

line(x12,y11,x12,y12);
line(x11,y12,x12,y12);

line(x21,y21,x22,y21);//vien cho bang liet ke


line(x21,y21,x21,y22);//vien cho bang liet ke

line(x32,y31,x32,y32);//vien cho nut OK


line(x31,y32,x32,y32);//vien cho nut OK

line(x42,y41,x42,y42);//vien nut Cancel


line(x41,y42,x42,y42);//vien nut Cancel
LUAÂÄN VAÊN TOÁT NGHIEÄP 77

setcolor(DARKGRAY);
line(x21-1,y21-1,x22+1,y21-1);//vien cho bang liet ke
line(x21-1,y21-1,x21-1,y22+1);//vien cho bang liet ke

setcolor(BLUE);

char S3[]="OK",S4[]="Cancel";

int x33=x31+(x32-x31-textwidth(S3))/2;
int y33=y31+(y32-y31-textheight(S3))/2;
outtextxy(x33,y33,S3);

int x44=x41+(x42-x41-textwidth(S4))/2;
int y44=y41+(y42-y41-textheight(S4))/2;
outtextxy(x44,y44,S4);

struct ffblk FF;


struct ffblk Lis[200];

char path[100];
getcurdir(0, path);
int done;

int x51=x21,x52=x51+130,y51=y22+28,y52=y51+20;
int x61=x21,x62=x12-5,y61=y12-25,y62=y12-5;
Box2->InitTextBox(x51,y51,x52,y52,WHITE,LIGHTBLUE,"Type of file");
Box2->GetS_in(ftype);
Box2->OutTextBox();
setcolor(BLACK);
line(x51+1,y51+1,x52-1,y51+1);
line(x51+1,y51+1,x51+1,y52-1);
setcolor(LIGHTGRAY);
line(x51+1,y52-1,x52-1,y52-1);
line(x52-1,y51+1,x52-1,y52-1);

setfillstyle(SOLID_FILL,WHITE);
bar(x61,y61,x62,y62);
setcolor(BLACK);
line(x61,y61,x62,y61);
line(x61,y61,x61,y62);
line(x61+1,y61+1,x62-1,y61+1);
line(x61+1,y61+1,x61+1,y62-1);
setcolor(LIGHTGRAY);
line(x62-1,y61+1,x62-1,y62-1);
line(x61+1,y62-1,x62-1,y62-1);

//DiskBox
int x71=x52+30,x72=x22,y71=y51,y72=y52;//toa do DiskBox
char DNameTemp[4];

sprintf(DNameTemp,"%c:",*DName);
TEXTBOX DiskBox;
LUAÂÄN VAÊN TOÁT NGHIEÄP 78

DiskBox.InitTextBox(x71,y71,x72,y72,WHITE,LIGHTBLUE,"Driver name");
DiskBox.GetS_in(DNameTemp);
DiskBox.OutTextBox();
setcolor(BLACK);
line(x71+1,y71+1,x72-1,y71+1);
line(x71+1,y71+1,x71+1,y72-1);
setcolor(LIGHTGRAY);
line(x71+1,y72-1,x72-1,y72-1);
line(x72-1,y71+1,x72-1,y72-1);

LIST DriList;//nut nhan chon o dia


int x81=x72-19,y81=y71+2,x82=x72-2,y82=y72-2;
DriList.InitList(x81,y81,x82,y82,LIGHTGRAY);
DriList.Show();

done=findfirst("*",&FF,FA_DIREC);
Lis[0]=FF;
int dem=0;//cho vong while tim file, la so files + thu muc tim duoc
if((int)Lis[0].ff_attrib!=16) dem-=1;
while (!done)//nhap ten file vao mang cau truc FF
{
dem++;
done = findnext(&FF);
if(!done)
Lis[dem]=FF;
if((int)Lis[dem].ff_attrib!=16) dem-=1;
}
dem+=1;
int NumDir=dem;
done=findfirst(ftype,&FF,FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCH);
for(int j=0;j<strlen(FF.ff_name)+1;j++)
Lis[dem].ff_name[j]=tolower(FF.ff_name[j]);

while (!done)//nhap ten file vao mang cau truc FF


{
dem++;
done = findnext(&FF);
for(int j=0;j<strlen(FF.ff_name)+1;j++)
Lis[dem].ff_name[j]=tolower(FF.ff_name[j]);

int NumFile=dem-NumDir;
char Note[50];//[30];
setcolor(BLACK);
sprintf(Note,"%d files and %d directories found",NumFile,NumDir);
outtextxy(x61+5,y61+(y62-y61-textheight(Note))/2,Note);

int temp=y11,Dem=0,i;
if(dem==0)//truong hop dia hoan toan trong, neu la mot thu muc rong thi khong thuoc truong
hop nay
strcpy(Lis[0].ff_name,"");
LUAÂÄN VAÊN TOÁT NGHIEÄP 79

int tempx1=x21+1,tempx2=x22,tempy1=y11+14-3,tempy2=y11+14+8+3;

setcolor(BLACK);//LIGHTGREEN);
for(i=0;i<15&&i<dem;i++)//hien thi ten file
outtextxy(x21+8,temp+=14,Lis[i].ff_name);

setfillstyle(SOLID_FILL,BLUE);
bar(tempx1,tempy1,tempx2,tempy2);
setcolor(YELLOW);
outtextxy(x21+8,y11+14,Lis[0].ff_name);//vach sang tai vi tri dau tien

int oldx1=tempx1,oldy1=tempy1,oldx2=tempx2,oldy2=tempy2;
int over=0;
int ppp=0;
do//while(1);
{
ShowMouse();
lpEvent = GetEvent();//lay bien co chuot
int j,nhanphim;
if(kbhit())//kiem tra co nhan phim
{ nhanphim=getch();
if(nhanphim==0)
nhanphim=getch();
}
{
switch(nhanphim)
{
case 81://page down
if(ppp++ >12)//17)
ppp=0;
else goto MouseDown;
case 80: // mui ten xuong
nhanphim=1;
MouseDown:
HideMouse();
if(Dem<14/*9*/&&Dem<dem-1)j=Dem+1;//&&Dem<dem-1
else
{
over++;
if((over)>=(dem-14))//9))
{
over--;
goto End;
}
j=Dem;
setcolor(WHITE);//MAGENTA);
temp=y11;
for(i=over-1;(i<15+over-1)&&i<dem;i++)//xoa ten file
outtextxy(x21+8,temp+=14,Lis[i].ff_name);
setcolor(BLACK);//LIGHTGREEN);
temp=y11;
for(i=over;(i<14+over)&&i<dem;i++)
outtextxy(x21+8,temp+=14,Lis[i].ff_name);
LUAÂÄN VAÊN TOÁT NGHIEÄP 80

}
goto Arrowkey;//break;
case 73://page up
if(ppp++ >12)
ppp=0;
else goto MouseUp;
case 72: // len
nhanphim=1;
MouseUp:
HideMouse();
if(Dem>0)
j=Dem-1;
else
{
over--;
if((over)<=-1)
{
over++;
goto End;
}
j=Dem;
setcolor(WHITE);//MAGENTA);
temp=y11;
for(i=over+1;i<15+over+1;i++)//xoa ten file
outtextxy(x21+8,temp+=14,Lis[i].ff_name);
setcolor(BLACK);//LIGHTGREEN);
temp=y11;
for(i=over;i<15+over;i++)
outtextxy(x21+8,temp+=14,Lis[i].ff_name);
}
goto Arrowkey;//break;
case 13://Enter
nhanphim=1;
goto nutOK;
case 27://Esc
nhanphim=1;
goto nutCancel;
}

}//if(kbhit())
/////////////////////////////////// xet mouse
if(lpEvent->Msg==1)//neu nhan phim trai chuot
{
if(lpEvent->Posx>=x51&&lpEvent->Posx<=x52&&lpEvent->Posy>=y51&&lpEvent-
>Posy<=y52)
{//get type of file
HideMouse();
OutMessage("Enter type of file then press Enter to accept or Esc to ignore.");
Box2->Path();//lay Path vao bien S cua TEXTBOX
Box2->GetS(ftype);
putimage(x11,y11,buf,COPY_PUT);
farfree(buf);
ShowMouse();
LUAÂÄN VAÊN TOÁT NGHIEÄP 81

return 2;
}

if(lpEvent->Posx>=x71&&lpEvent->Posx<=x72-20&&lpEvent->Posy>=y71&&lpEvent-
>Posy<=y72)
{//change disk trong diskbox

int ExistDisk;
char OldDisk=toupper(*DName);
OutMessage("Enter name of drive");
do
{
HideMouse();
DiskBox.Path();//lay Path vao bien S cua TEXTBOX
DiskBox.GetS(DNameTemp);
DNameTemp[0]=toupper(DNameTemp[0]);
*DName=DNameTemp[0];
ExistDisk=0;
for(int k=0;k<strlen(DiskName);k++)
if(*DName==DiskName[k])
ExistDisk=1;
if(ExistDisk!=1)
{
OutMessage("Press Enter to do the action again or Esc to ignore");
if(OutError("Disk not exist")==0)
{
*DName=OldDisk;
break;
}
}
ShowMouse();
}while(!ExistDisk);
if(OldDisk!=*DName) //truong hop chon dia bang nut pulldown nhung lai chon kieu
go ky tu vao textbox
setdisk(*DName-'A');
HideMouse();
putimage(x11,y11,buf,COPY_PUT);
farfree(buf);
ShowMouse();
return 2;
}

if(lpEvent->Posx>=x81&&lpEvent->Posx<=x82&&lpEvent->Posy>=y81&&lpEvent-
>Posy<=y82)
{//choose disk
HideMouse();
setcolor(BLACK);
line(x81,y81,x82,y81);
line(x81,y81,x81,y82);
line(x81+1,y81-1,x81+1,y82-1);
char OldDName=*DName;
CheckChooseDisk(DiskName,DName,lpEvent,x82,y82);
if(OldDName!=*DName)
LUAÂÄN VAÊN TOÁT NGHIEÄP 82

{
putimage(x11,y11,buf,COPY_PUT);
farfree(buf);
return 2;
}
setcolor(WHITE);
line(x81,y81,x82,y81);
line(x81,y81,x81,y82);
line(x81+1,y81-1,x81+1,y82-1);
ShowMouse();
}

for(j=0;j<15&&j<dem&&lpEvent->Msg==1;j++)//kiem tra file chon neu co chon


if(tempx1<= lpEvent->Posx&&tempx2>=lpEvent->Posx)
if((tempy1+j*14)<=lpEvent->Posy&&(tempy2+j*14)>=lpEvent->Posy)
{
Arrowkey:
HideMouse();
setfillstyle(SOLID_FILL,WHITE);//MAGENTA);
bar(oldx1,oldy1,oldx2,oldy2);
setcolor(BLACK);//LIGHTGREEN);
outtextxy(x21+8,oldy1+3,Lis[Dem+over].ff_name);
setfillstyle(SOLID_FILL,BLUE);
oldx1=tempx1, oldy1=tempy1+j*14,oldx2=tempx2,oldy2=tempy2+j*14;
bar(oldx1,oldy1,oldx2,oldy2);
setcolor(YELLOW);
outtextxy(x21+8,oldy1+3,Lis[j+over].ff_name);

_dos_getfileattr(Lis[j+over].ff_name,attrib);

strcpy(s,Lis[j+over].ff_name);
if(strcmp(s,".")==0) strcpy(s,"\\");
Dem=j;
End:
Kiemtra=1;//bao hieu co nhan vao list
}
if(lpEvent->Msg==1&&(j==15)&&tempx1<= lpEvent->Posx&&tempx2>=lpEvent-
>Posx&&(tempy1+j*14)<=lpEvent->Posy&&(tempy2+j*14)>=lpEvent->Posy)
//truong hop vet tro file o cuoi bang list va nhap chuot ngay ben duoi vet tro
{
lpEvent->Posx=x11;
lpEvent->Posy=y11;
delay(50);
goto MouseDown;
}
if(lpEvent->Msg==1&&(j==15)&&tempx1<= lpEvent->Posx&&tempx2>=lpEvent-
>Posx&&(tempy1-14)<=lpEvent->Posy&&(tempy2-14)>=lpEvent->Posy)
//truong hop vet tro file o dau bang list va nhap chuot ngay ben tren vet tro
{
lpEvent->Posx=x11;
lpEvent->Posy=y11;
delay(50);
goto MouseUp;
LUAÂÄN VAÊN TOÁT NGHIEÄP 83

}
if(lpEvent->Msg==1&&x31<= lpEvent->Posx&&y31<=lpEvent-
>Posy&&x32>=lpEvent->Posx&&y32>=lpEvent->Posy)
nutOK:
{
HideMouse();
putimage(x11,y11,buf,COPY_PUT);
farfree(buf);

if(Kiemtra!=1)
strcpy(s,Lis[0].ff_name);
if(strcmp(s,".")==0)
{
strcpy(s,"\\");
*attrib=16;
}
if(*attrib==16)
{
chdir(s);
return 2;
}
Show();
ShowMouse();
OutMessage("Click OK to send file.");
return 1 ;//bao da co chon file
}
if(lpEvent->Msg==1&&x41<= lpEvent->Posx&&y41<=lpEvent-
>Posy&&x42>=lpEvent->Posx&&y42>=lpEvent->Posy)
nutCancel:
{
HideMouse();
putimage(x11,y11,buf,COPY_PUT);
farfree(buf);

Cancel:
Show();
ShowMouse();
OutMessage("Click mouse to chose action");
return 0;
}
}
if(lpEvent->Msg==2)
{
delay(100);
goto nutOK;
}
}while(1);
}
//---------------------------------------------------------

VIII. CLASS MOUSE.H

#if !defined(__MOUSE_H__)
LUAÂÄN VAÊN TOÁT NGHIEÄP 84

#define __MOUSE_H__

#include <dos.h>
#include "screen.h"

#define INT_MOUSE 0x33

#define M_LEFT 0x01 /* set if LEFT press */


#define M_RIGHT 0x02 /* set if RIGHT press */
#define M_CENTER 0x04 /* set if CENTER press */
#define M_CHANGE 0x08 /* set if mouse status is changed */

/* -- Keyboard coding bits -- */


#define KEY_NULL 0x0
#define ESC 0x1B
#define ENTER 0x0D
#define TAB '\t'
#define INS 0xD2
#define DEL 0xD3
#define BACKSPACE 0x8
#define HOME 0xC7
#define END 0xCF
#define PAGE_UP 0xC9
#define PAGE_DOWN 0xD1

/* -- Function's keys -- */
#define F1 0xBB
#define F2 0xBC
#define F3 0xBD
#define F4 0xBE
#define F5 0xBF
#define F6 0xC0
#define F7 0xC1
#define F8 0xC2
#define F9 0xC3
#define F10 0xC4

#define PLUS 0x2B


#define MINUS 0x2D
#define SPACEBAR 0x20

#define SHIFT_TAB 0x8F

#define CTRL_C 0x3

//struct time;
typedef struct tagEVENT{
int Msg;
int Posx, Posy; // toa do xay ra bien co chuot
struct time *t;
} EVENT;
typedef EVENT far *LPEVENT;
// Khai bao cac ham toan cuc
LUAÂÄN VAÊN TOÁT NGHIEÄP 85

extern void SetMouseRange(LPRECT);//LPRECT: xem SCREEN.H


extern int InitMouse(LPRECT);
extern void ShowMouse(void);
extern void HideMouse(void);
extern void MouseRead(LPEVENT);
extern LPEVENT GetEvent(void);
extern void DeviceRelease(int);
//extern void ButtonPressed(int, LPEVENT);
extern void ResetEvent(LPEVENT);
//extern void MoveMouse(int x,int y);//tri
extern void MouseText(int x,int y,int color1, int color2);//,char s[]);
//extern int GetKey(void);
extern int GetMtx();
extern int GetMty();
//extern EVENT OldEvent();
extern int Double(LPEVENT);
#endif
// End of MOUSE.H

IX.MODULE MOUSE.CPP
#include <conio.h>
#include <graphics.h>
//#include <STDLIB.H>
#include <COMPLEX.H>

#include "mouse.h"

void SetMouseRange(LPRECT lpRect)


// Dat vung di chuyen cho chuot
{
_AX = 0x07;//ham 07 cua ngat 33 de dinh gioi han di chuyen ngang
_CX = lpRect->left;
_DX = lpRect->right;
geninterrupt(INT_MOUSE);//INT_MOUSE=0x33:ngat 33
_AX = 0x08;//ham 08 cua ngat 33 dinh gioi han di chuyen doc cho con tro
_CX = lpRect->top;
_DX = lpRect->bottom;
geninterrupt(INT_MOUSE);
}
//---------------------------------------------------------
int InitMouse(LPRECT lpRect)
// Khoi dong chuot
{
int ax;

_AX = 0;
geninterrupt(INT_MOUSE);
ax = _AX;
if (ax == 0)
return FALSE;
SetMouseRange(lpRect);
return TRUE;
LUAÂÄN VAÊN TOÁT NGHIEÄP 86

}
//---------------------------------------------------------
void ShowMouse(void)
// Hien thi chuot
{
_AX = 1;
geninterrupt(INT_MOUSE);
}
//---------------------------------------------------------
void HideMouse(void)
// Dau chuot
{
_AX = 2;
geninterrupt(INT_MOUSE);
}
//---------------------------------------------------------
#include <CONIO.H>
#include <STDIO.H>
void MouseRead(LPEVENT lpEvent)
// Tra ve bien co nhan duoc tu chuot : Nut trai hay phai duoc an
{
int bx;
_AX = 3;
geninterrupt(INT_MOUSE);
bx = _BX;
//cx = _CX;
//dx = _DX;
lpEvent->Msg = bx;
lpEvent->Posx = _CX;
lpEvent->Posy = _DX;
gettime(lpEvent->t);
}
//---------------------------------------------------------
void ResetEvent(LPEVENT lpEvent)
{
lpEvent->Msg = 0;
lpEvent->Posx = lpEvent->Posy = 0;
}
//---------------------------------------------------------
EVENT PrevEvent, CurEvent;
//---------------------------------------------------------
LPEVENT GetEvent(void)
{
ResetEvent(&CurEvent);
MouseRead(&CurEvent);
// chuyen sang toa do ViewPort
CurEvent.Posx = CurEvent.Posx-MainWindow.rViewPort.left;
CurEvent.Posy = CurEvent.Posy-MainWindow.rViewPort.top;
// xet trang thai chuot co thay doi hay khong

if((CurEvent.Posx!=PrevEvent.Posx)&&(CurEvent.Posy!=PrevEvent.Posy))
CurEvent.Msg |= M_CHANGE;
PrevEvent = CurEvent;
LUAÂÄN VAÊN TOÁT NGHIEÄP 87

// delay(50);
return (&CurEvent);
}
//---------------------------------------------------------
void DeviceRelease(int Msg)
{
while(GetEvent()->Msg&Msg);
}
//---------------------------------------------------------
int Double(LPEVENT lpEvent)
{
if(lpEvent->Msg==1)
{
delay(100);
ResetEvent(lpEvent);
lpEvent=GetEvent();
if(lpEvent->Msg==1)
//if((abs(CurEvent.Posx-oldEvent.Posx))<=10&&abs(CurEvent.Posy-oldEvent.Posy)<=10)
{
{
return 1;
}
}
else
return 0;
}
else return 0;
}
//---------------------------------------------------------
void MouseText(int x,int y,int color1,int color2)//,char s[])//gia dau nhay con tro
{
HideMouse();
// int h=textheight(s);
int w=5;
int color=getcolor();
do
{
for(int i=0;i<10&&(!kbhit());i++)
{
setcolor(color2);//WHITE);
line(x,y,x+w,y);
line(x,y+1,x+w,y+1);
delay(10);
setcolor(color);
}
setcolor(color1);//GREEN);
line(x,y,x+w,y);
line(x,y+1,x+w,y+1);
setcolor(color);
for(i=0;i<10&&(!kbhit());i++)
{
setcolor(color1);//GREEN);
line(x,y,x+w,y);
LUAÂÄN VAÊN TOÁT NGHIEÄP 88

line(x,y+1,x+w,y+1);
delay(10);
setcolor(color);
}
}while(!kbhit());
}
//---------------------------------------------------------
int GetMtx()
{
return getx();
}
//---------------------------------------------------------
int GetMty()
{
return gety();
}
//---------------------------------------------------------
// End of MOUSE.CPP

X.CLASS SCREEN.H
#if !defined(__SCREEN_H__)
#define __SCREEN_H__

#define BORDERSIZE 3
#define TRUE 1
#define FALSE 0
#define DEMODELAY 0

// Dinh nghia cac kieu du lieu


typedef struct tagRECT{
int left, top, right, bottom ;
}RECT;
typedef RECT far *LPRECT;

typedef struct tagWINDOW {


char sCaption[80]; /*Window's caption*/
RECT rWinRect; /*Rectangle in which window is located*/
RECT rSys; /*System area of window*/
RECT rTitleBar; /*Caption area of window*/
RECT rMenuBar; /*Rectangle in which window's menu is located*/
RECT rMessage; /* Rectangle in which messages is display
}WINDOWS;

// Dinh nghia cac ham va bien dung toan cuc


extern int Xc, Yc; // Goc toa do
extern int LineColor;
extern int VP_WIDTH;
extern int VP_HEIGHT;
extern WINDOWS MainWindow;

extern void InitGraphics(void);


extern void OutMessage(char *Msg);
LUAÂÄN VAÊN TOÁT NGHIEÄP 89

extern void InitScreen(void);


extern void InitValues(char *lpCaption);
extern int OutError(char *s);
#endif
// End of SCREEN.H

XI.MODULE SCREEN.CPP
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <graphics.h>

#include "screen.h"
#include "mouse.h"

int T_SIZE, W_SIZE, H_SIZE, W_CHAR, H_CHAR, MSG_SIZE;


int COLOR_WINDOW;
int COLOR_BUTTON;
int COLOR_BORDER;
int COLOR_CAPTION;
int COLOR_TEXT;
int VP_WIDTH;
int VP_HEIGHT;
int Maxx, Maxy; // Maxx - Maxy of screen

WINDOWS MainWindow;
//int Xc, Yc; // Goc toa do
//int LineColor = MAGENTA; // Mau cua duong thang can ve - Dung trong thu tuc SetPixel
//---------------------------------------------------------
void InitGraphics(void)
// Khoi tao che do do hoa
{
int grDrv=DETECT, grMode;
int ErrCode;

initgraph(&grDrv, &grMode, "");


ErrCode = graphresult();
if(ErrCode!= grOk)
{
printf("Graphics error: %s\n", grapherrormsg(ErrCode));
printf("Press any key to halt...");
getch();
exit(1); /* return with error code */
}
Maxx = getmaxx();
Maxy = getmaxy();
}
//---------------------------------------------------------
void InitValues(char *lpCaption)
// Khoi tao cac gia tri cho bien Windows de ve cua so man hinh
{
int WinWidth, WinHeight;
LUAÂÄN VAÊN TOÁT NGHIEÄP 90

W_CHAR = 8; H_CHAR = 8; // Chieu rong va chieu cao cua mot ki tu


W_SIZE = 8; H_SIZE = 20; T_SIZE = 18; MSG_SIZE = 20;

COLOR_WINDOW = CYAN;
COLOR_BUTTON = LIGHTGRAY;
COLOR_BORDER = LIGHTGRAY;
COLOR_CAPTION = BLUE;
COLOR_TEXT = BLUE;

strcpy(MainWindow.sCaption, lpCaption);

// Gan gia tri cho WinRect - H.C.nhat chua cua so


MainWindow.rWinRect.left = 0;
MainWindow.rWinRect.top = 0;
MainWindow.rWinRect.right = Maxx;
MainWindow.rWinRect.bottom= Maxy;

WinWidth = MainWindow.rWinRect.right-MainWindow.rWinRect.left+1;
WinHeight= MainWindow.rWinRect.bottom-MainWindow.rWinRect.top+1;

// Gan gia tri cho rSys - H.C.nhat chua SystemMenu


MainWindow.rSys.left = BORDERSIZE;
MainWindow.rSys.top = BORDERSIZE;
MainWindow.rSys.right = MainWindow.rSys.left+T_SIZE;
MainWindow.rSys.bottom= MainWindow.rSys.top+T_SIZE;

// Gan gia tri cho rTitleBar - H.C.nhat chua thong tin thanh tieu de
MainWindow.rTitleBar.left = BORDERSIZE+1;//MainWindow.rSys.right+1;
MainWindow.rTitleBar.top = BORDERSIZE+1;
MainWindow.rTitleBar.right = WinWidth-BORDERSIZE-1;
MainWindow.rTitleBar.bottom= MainWindow.rSys.top+T_SIZE;

// Gan gia tri cho rMenuBar - H.C.nhat chua thong tin menu
// Gan gia tri cho rMessage - H.C.nhat chua thong tin cua cac //thong bao
MainWindow.rMessage.left = BORDERSIZE+1;
MainWindow.rMessage.right = WinWidth-BORDERSIZE-2;
MainWindow.rMessage.top = WinHeight-(BORDERSIZE+2)-MSG_SIZE;
MainWindow.rMessage.bottom= MainWindow.rMessage.top+MSG_SIZE;

// Gan gia tri cho rViewPort - H.C.nhat chua thong tin ve vung lam viec
// thuc su cua cua so
MainWindow.rViewPort.left = BORDERSIZE+1;
MainWindow.rViewPort.top =
MainWindow.rTitleBar.bottom+2;//MainWindow.rMenuBar.bottom+2;
MainWindow.rViewPort.right = WinWidth-BORDERSIZE-2;
MainWindow.rViewPort.bottom= MainWindow.rMessage.top-2;

VP_WIDTH = MainWindow.rViewPort.right-MainWindow.rViewPort.left;
VP_HEIGHT = MainWindow.rViewPort.bottom-MainWindow.rViewPort.top;
}
//---------------------------------------------------------
void OutMessage(char *Msg)
LUAÂÄN VAÊN TOÁT NGHIEÄP 91

// Ghi thong bao Msg ra cua so rMessage


{
struct fillsettingstype FillInfo;
int OldColor;
struct viewporttype vp;

// luu thong tin cu


getfillsettings(&FillInfo);
OldColor = getcolor();
getviewsettings(&vp);
// xoa thong bao cu
setviewport(MainWindow.rWinRect.left, MainWindow.rWinRect.top,
MainWindow.rWinRect.right, MainWindow.rWinRect.bottom, 1);
setfillstyle(SOLID_FILL, COLOR_BUTTON);
setcolor(COLOR_TEXT);
bar(MainWindow.rMessage.left, MainWindow.rMessage.top,
MainWindow.rMessage.right, MainWindow.rMessage.bottom);
// in thong bao moi ra
outtextxy(MainWindow.rMessage.left+W_CHAR,
MainWindow.rMessage.bottom-H_CHAR-5, Msg);
// tra ve trang thai cu
setfillstyle(FillInfo.pattern, FillInfo.color);
setcolor(OldColor);
setviewport(vp.left,vp.top, vp.right, vp.bottom, 1);
}
//---------------------------------------------------------
void DrawScreenBorder(int left, int top, int right, int bottom)
// Ve duong vien cho mot hinh chu nhat co toa do (left, top), (right, bottom)
{
setfillstyle(SOLID_FILL, COLOR_BORDER);
bar(left, top, right, top+BORDERSIZE);
bar(left, bottom, right, bottom-BORDERSIZE);
bar(left, top, left+BORDERSIZE, bottom);
bar(right-BORDERSIZE, top, right, bottom);
setcolor(BLACK);
rectangle(left, top, right, bottom);
rectangle(left+BORDERSIZE, top+BORDERSIZE,
right-BORDERSIZE, bottom-BORDERSIZE);
}
//---------------------------------------------------------
#include <dos.h>
void InitScreen(void)
// Ve cac thanh phan cua cua so
{
int x, y;
int WinWidth, WinHeight;
struct viewporttype vp;

getviewsettings(&vp);
setviewport(MainWindow.rWinRect.left, MainWindow.rWinRect.top,
MainWindow.rWinRect.right, MainWindow.rWinRect.bottom, 1);
WinWidth = MainWindow.rWinRect.right-MainWindow.rWinRect.left+1;
WinHeight= MainWindow.rWinRect.bottom-MainWindow.rWinRect.top+1;
LUAÂÄN VAÊN TOÁT NGHIEÄP 92

x = (WinWidth-W_CHAR*strlen(MainWindow.sCaption))/2+1;
y = BORDERSIZE+(T_SIZE-H_CHAR)/2+1;

// Ve duong vien cua hinh chu nhat


DrawScreenBorder(0, 0, WinWidth-1, WinHeight-1);
delay(DEMODELAY);
// Ve thanh tieu de
setfillstyle(SOLID_FILL, COLOR_CAPTION);
bar(MainWindow.rTitleBar.left, MainWindow.rTitleBar.top,
MainWindow.rTitleBar.right, MainWindow.rTitleBar.bottom);
setcolor(WHITE);
outtextxy(x, y, MainWindow.sCaption);
delay(DEMODELAY);
// Ve SystemMenu
setfillstyle(SOLID_FILL, COLOR_BUTTON);
/* bar(MainWindow.rSys.left+1, MainWindow.rSys.top+1,
MainWindow.rSys.right-1, MainWindow.rSys.bottom-1);
setcolor(BLACK);
rectangle((MainWindow.rSys.left+MainWindow.rSys.right)/2-5,
(MainWindow.rSys.top+MainWindow.rSys.bottom)/2-1,
(MainWindow.rSys.left+MainWindow.rSys.right)/2+5,
(MainWindow.rSys.top+MainWindow.rSys.bottom)/2+1);
delay(DEMODELAY);
*/ // Ve Menu
// bar(MainWindow.rMenuBar.left, MainWindow.rMenuBar.top,
// MainWindow.rMenuBar.right, MainWindow.rMenuBar.bottom);
// outtextxy(MainWindow.rMenuBar.left+8, MainWindow.rMenuBar.bottom-13,
// "Menu of Program is here");
// delay(DEMODELAY);
// Ve thanh chua thong bao
bar(MainWindow.rMessage.left, MainWindow.rMessage.top,
MainWindow.rMessage.right, MainWindow.rMessage.bottom);
OutMessage("Welcome to Demo Window Program");
delay(DEMODELAY);
// Ve vung lam viec
setfillstyle(SOLID_FILL, COLOR_WINDOW);
bar(MainWindow.rViewPort.left, MainWindow.rViewPort.top,
MainWindow.rViewPort.right, MainWindow.rViewPort.bottom);
setcolor(BLACK);
rectangle(MainWindow.rViewPort.left-1, MainWindow.rViewPort.top,
MainWindow.rViewPort.right+1, MainWindow.rViewPort.bottom);
delay(DEMODELAY);
// Dat lai viewport la rViewPort
setviewport(MainWindow.rViewPort.left, MainWindow.rViewPort.top,
MainWindow.rViewPort.right, MainWindow.rViewPort.bottom, 1);
}
//---------------------------------------------------------
/*void DrawSysCoordinates(void)
// Ve he truc toa do
{
Xc = VP_WIDTH/2;
Yc = VP_HEIGHT/2;
LUAÂÄN VAÊN TOÁT NGHIEÄP 93

setcolor(COLOR_TEXT);
// ve hai truc toa do
line(0, Yc, VP_WIDTH, Yc);
line(Xc, 0, Xc, VP_HEIGHT);
// ve hai mui ten
line(Xc, 0, Xc-5, 5);
line(Xc, 0, Xc+5, 5);
line(VP_WIDTH, Yc, VP_WIDTH-5, Yc-5);
line(VP_WIDTH, Yc, VP_WIDTH-5, Yc+5);
// Ve goc toa do
outtextxy(Xc-8, Yc+8, "O");
}
//---------------------------------------------------------
void SetLineColor(int C)
{
LineColor = C;
}
//---------------------------------------------------------
void SetPixel(int x, int y)
{
putpixel(Xc+x, Yc-y, LineColor);
}
//---------------------------------------------------------
void Set2Pixel(int Ox, int Oy, int x, int y)
{
putpixel(Ox+x, Oy-y, LineColor);
putpixel(Ox-x, Oy-y, LineColor);
}
//---------------------------------------------------------
void Set2PixelHor(int Ox, int Oy, int x, int y)
{
putpixel(Ox+x, Oy-y, LineColor);
putpixel(Ox+x, Oy+y, LineColor);
}
//---------------------------------------------------------
void ClearViewPort(void)
{
struct fillsettingstype FillInfo;

// luu thong tin cu


getfillsettings(&FillInfo);
setfillstyle(SOLID_FILL, COLOR_WINDOW);
bar(0, 0, VP_WIDTH, VP_HEIGHT);
setfillstyle(FillInfo.pattern, FillInfo.color);
DrawSysCoordinates();
} */
// End of SCREEN.C
//---------------------------------------------------------
#include <alloc.h>
int OutError(char *s)
{
void far *buf;//con tro chi vung luu tru man hinh
unsigned int size = imagesize(200,150,470,240);
LUAÂÄN VAÊN TOÁT NGHIEÄP 94

LPEVENT lpEvent;
int Cx1=280,Cy1=203,Cx2=337,Cy2=223;
int Ox1=350,Oy1=203,Ox2=405,Oy2=223;
if ((buf = farmalloc(size)) == NULL)
{
return -1;
}
else
{
getimage(200,150,470,240,buf);
}
setfillstyle(SOLID_FILL,BLUE);
HideMouse();
bar(200,150,470,240);
setcolor(WHITE);
rectangle(200,150,470,240);
outtextxy(200+(270-8*strlen(s))/2,170,s);
setfillstyle(SOLID_FILL,LIGHTBLUE);
bar(Cx1,Cy1,Cx2,Cy2);//280,203,337,223);
int OK=0;
outtextxy(285,210,"Cancel");
outtextxy(365,210,"OK");
int event;
do
{
lpEvent=GetEvent();
if(kbhit())
{
if((event=getch())==13)
{
CompleteOk:
HideMouse();
putimage(200,150,buf,COPY_PUT);
ShowMouse();
farfree(buf);
return OK;
}
if(event==27)
{
CompleteCancel:
HideMouse();
putimage(200,150,buf,COPY_PUT);
ShowMouse();
farfree(buf);
return 0;
}
if(event==9)
{
OK=!OK;
Cancel:
if(OK==0)
{
HideMouse();
LUAÂÄN VAÊN TOÁT NGHIEÄP 95

setfillstyle(SOLID_FILL,BLUE);
bar(Ox1,Oy1,Ox2,Oy2);//350,203,405,223);
outtextxy(365,210,"OK");
setfillstyle(SOLID_FILL,LIGHTBLUE);
bar(Cx1,Cy1,Cx2,Cy2);//280,203,337,223);
outtextxy(285,210,"Cancel");
ShowMouse();
}
Ok:
if(OK==1)
{
HideMouse();
setfillstyle(SOLID_FILL,BLUE);
bar(Cx1,Cy1,Cx2,Cy2);//280,203,337,223);
outtextxy(285,210,"Cancel");
setfillstyle(SOLID_FILL,LIGHTBLUE);
bar(Ox1,Oy1,Ox2,Oy2);//350,203,405,223);
outtextxy(365,210,"OK");
ShowMouse();
}
}
if(event==0)
{
event=getch();
if(event==75)
{
OK=0;
goto Cancel;
}
if(event==77)
{
OK=1;
goto Ok;
}
}
else
flushall();
}
if(lpEvent->Msg==1)
{
if(lpEvent->Posx>=Cx1&&lpEvent->Posx<=Cx2&&lpEvent->Posy>=Cy1&&lpEvent-
>Posy<=Cy2)
{
OK=0;
goto CompleteCancel;
}
if(lpEvent->Posx>=Ox1&&lpEvent->Posx<=Ox2&&lpEvent->Posy>=Oy1&&lpEvent-
>Posy<=Oy2)
{
OK=1;
goto CompleteOk;
}
}
LUAÂÄN VAÊN TOÁT NGHIEÄP 96

ShowMouse();
}while(1);
}

XII. CLASS SEND.HPP


#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <MATH.H>
#include <COMPLEX.H>
#include <PROCESS.H>
#include <string.h>

#if !defined __SEND__


#define __SEND__
class SEND
{
private:
char OutFile[100];
public:
char *CatFile(char St_add[],char End_add[],char InFile[]);
int Out();
int DeleteFile();//se del OutFile
};
#endif
extern int Esc();

XIII. MODULE SEND.CPP


#include "screen.h"
#include "send.hpp"

#define data 0x378


#define sta 0x379
#define ctr 0x37a

char *SEND::CatFile(char St_add[],char End_add[],char InFile[])


{
char KyTu_Hex[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','a','b','c','d','e','f'};
int Gtri_Dec[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15};

unsigned int i,DemSpace;


unsigned int Value1=0,Value2=0;

char FindPos,FindValue;
int Thoigian=0;

FILE *f,*f1;
char t,t1,t2,t3,t4;
// char St_add[]="0000 Hex",End_add[]="000F Hex";
int end_line;

strcpy(OutFile,InFile);
i=strlen(OutFile);
LUAÂÄN VAÊN TOÁT NGHIEÄP 97

do
{
OutFile[i]='\0';
}while(OutFile[--i]!='.');
strcat(OutFile,"tmp");//dat ten cho file se tao ra

for (FindPos=3;FindPos>=0;FindPos--)
for(FindValue=0;FindValue<22;FindValue++)
if(St_add[FindPos]==KyTu_Hex[FindValue])
Value1+=pow(16,(3-FindPos))*Gtri_Dec[FindValue];

for (FindPos=3;FindPos>=0;FindPos--)
for(FindValue=0;FindValue<22;FindValue++)
if(End_add[FindPos]==KyTu_Hex[FindValue])
Value2+=pow(16,(3-FindPos))*Gtri_Dec[FindValue];

f=fopen(InFile,"rt");
f1=fopen(OutFile,"w+t");
fwrite(St_add,4,1,f1);
fwrite(End_add,4,1,f1);

do
{
do
{
fread(&t1,1,1,f);
}while(t1!='\'');//ngay sau dia chi cua lenh

do
{
fread(&t1,1,1,f);
}while(t1==' ');//den lenh

end_line=0;
do
{
fread(&t2,1,1,f);
Value1++;
DemSpace=0;
do
{
fread(&t,1,1,f);
DemSpace++;
}while(t==' '&&DemSpace<3);//con la lenh hoac dia chi hay da cham dut mot lenh

if(DemSpace>=2)//la ma lenh hoac da ket thuc mot dong lenh


{
fwrite(&t1,1,1,f1);
fwrite(&t2,1,1,f1);
t1=t;
}
if(DemSpace==1)
LUAÂÄN VAÊN TOÁT NGHIEÄP 98

{
t3=t;
fread(&t4,1,1,f);
Value1++;
fwrite(&t3,1,1,f1);
fwrite(&t4,1,1,f1);
fwrite(&t1,1,1,f1);
fwrite(&t2,1,1,f1);
DemSpace=0;
do
{
fread(&t,1,1,f);
if(t==' ')
DemSpace++;
}while((t=='\''||t==' ')&&DemSpace<3);//con la lenh hoac dia chi hay da cham dut mot
lenh
if(DemSpace==2)
t1=t;
}
if(DemSpace>2)
{
end_line=1;
}
}while(end_line==0);
}while(Value1<=Value2);
fcloseall();
return OutFile;
}
//---------------------------------------------------------
int SEND::Out()
{
int result,Temp;
FILE *f;
char value;
int n,dem=0;
int Stop=0;

char KyTu_Hex[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F','a','b','c','d','e','f'};
int Gtri_Dec[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,10,11,12,13,14,15};

if ( (f = fopen(OutFile,"rt")) == NULL)
{
OutError("Cannot open input file.");
return dem;
}

while(!feof(f))
{
do
{
result=inportb(sta);
result=result & 0x80;
Stop=Esc();
LUAÂÄN VAÊN TOÁT NGHIEÄP 99

}while(result !=0x80&&Stop!=1);//doc busy cho toi khi !busy = 1


if(Stop==1)
return -1;
n=fread(&value,1,1,f);
if(n==0)
return dem;
for(int z=0;z<22;z++)//doi ky tu ra gia tri Dec de goi di
if(value==KyTu_Hex[z])//nible cao
{
Temp=Gtri_Dec[z]*16;
z=22;
}
fread(&value,1,1,f);
for(z=0;z<22;z++)//nible thap
if(value==KyTu_Hex[z])
{
Temp=Gtri_Dec[z]+Temp;
z=22;
}
outportb(data,Temp);//pow(2,i));//xuat du lieu ra thanh ghi du lieu
outportb(ctr,0x00);// cho strobe = 1 de bao cho phan thu biet da goi du lieu ra thanh ghi du
lieu
dem++;

do
{
result=inportb(sta);
result=result & 0xC0;
Stop=Esc();
}while(result!=0x40&&Stop!=1);//doc ack cho den khi ack = 1
if(Stop==1)
return -1;
outportb(ctr,0x01);// cho strobe = 0 de bao cho phan thu biet da goi xong mot byte du lieu ra
thanh ghi du lieu
}
return 0;
}
//---------------------------------------------------------
int SEND::DeleteFile()
{
return remove(OutFile);
}
//---------------------------------------------------------
int Esc()
{
if(kbhit())//nhan Esc de thoat
{
if(getch()==27)
{
OutError("Task is not complete !!!");
}
else
flushall();
LUAÂÄN VAÊN TOÁT NGHIEÄP 100

return 1;
}
return 0;
}

XIV.CLASS TEXTBOX.HPP
#include <string.h>
#if !defined __TEXTBOX__
#define __TEXTBOX__
class TEXTBOX
{
private:
int l,t,r,b;
int Color,Color1;
char S[100],S1[100];
char Dri[100],Path_var[100],Name[100],TenFile[100],SubFile[100];
int chiso;
public:
TEXTBOX() {S[0]='\0';}//S1="Duong dan";}
void InitTextBox(int x1,int y1,int x2,int y2,int color,int color1,char s[]);
void Path();
void PressTextBox();
void OutTextBox();
int Left(){return l;}
int Top(){return t;}
int Right(){return r;}
int Bottom(){return b;}
void DelChar(int length);//,int xoa);//de xoa ky tu khi gap phim del tai texbox
void InsertChar(char c);
void GetS(char s[]){strcpy(s,S);};
void GetS_in(char s[]){strcpy(S,s);}
int DuongDan(char s[]);
void Get_path(char s[]){strcpy(s,Path_var);};
void Get_name();
};
#endif

XV.MODULE TEXTBOX.CPP
#include <dir.h>
#include <stdio.h>
#include <conio.h>
#include <graphics.h>
#include <string.h>
#include <dos.h>
#include <ctype.h>
#include "textbox.hpp"
#include "mouse.h"
//---------------------------------------------------------
void TEXTBOX::InitTextBox(int x1,int y1,int x2,int y2,int color,int color1,char s[])
{
char buffer[MAXPATH];
l=x1;t=y1;r=x2;b=y2;
Color=color;
LUAÂÄN VAÊN TOÁT NGHIEÄP 101

Color1=color1;
strcpy(S1,s);
getcwd(buffer, MAXPATH);
strcpy(S,buffer);
strcat(S,"\\");
}
//---------------------------------------------------------
void TEXTBOX::OutTextBox()
{
setfillstyle(SOLID_FILL,Color);
bar(l,t,r,b);

setcolor(WHITE);
line(l,b,r,b);
line(r,t,r,b);

setcolor(BLACK);
line(l,t,r,t);
line(l,t,l,b);

setcolor(WHITE);
if(Color==WHITE)
setcolor(BLACK);
outtextxy(l,t+(b-t-textheight(S))/2-b+t-3,S1);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
}
//---------------------------------------------------------
/*
void TEXTBOX::PressTextBox()
{
setcolor(BLACK);
line(l,t,r,t);
line(l,t,l,b);
setcolor(WHITE);
line(l,b,r,b);
line(r,t,r,b);
}
*/
//---------------------------------------------------------
void TEXTBOX::Path()//lay duong dan nhap vao vao bien S cua TEXTBOX
{
char a;
int C1=Color1;//C1 la mau cua text trong textbox o che do nhap ten file
setcolor(C1);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
chiso=0;
MouseText(l+textwidth(S)+4,t+(b-t+textheight(S))/2,Color,C1);//,S);//gia dau nhac chuot
char stemp[128];
strcpy(stemp,S);
while((a=getch())!=13)//&&a!=27)//kiem tra phim Enter
{
switch(a)//kiem tra ky tu nhap vao
{
LUAÂÄN VAÊN TOÁT NGHIEÄP 102

case 0:switch(a=getch())
{
case 71://home
MouseText(l+6,t+(b-t+textheight(S))/2,Color,C1);//,S);
chiso=-strlen(S);
break;
case 72:break;
case 73:break;
case 75://left arrow
int f=textwidth(S);
int xt=l+6+f+(--chiso)*8;
int yt=t+(b-t+textheight(S))/2;
if(xt<l+6)
xt=l+6+f+((++chiso))*8;
MouseText(xt,yt,Color,C1);//,S);//so 8 la be ngang 1 ky tu
break;
case 77://right arrow
if(chiso==0)break;
f=textwidth(S);
MouseText(l+f+6+((++chiso))*8,t+(b-t+textheight(S))/2,Color,C1);//,S);//so 8 la
be ngang 1 ky tu
break;
case 79://end
f=textwidth(S);
MouseText(l+f+6,t+(b-t+textheight(S))/2,Color,C1);//,S);
chiso=0;
break;
case 80:
case 81:
case 82:break;
case 83://del
setcolor(GREEN);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
DelChar(strlen(S));//,chiso);
f=textwidth(S);
setcolor(YELLOW);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
MouseText(l+f+6+chiso*8,t+(b-t+textheight(S))/2,Color,C1);//,S);//so 8 la be
ngang 1 ky tu
break;
}break;
case 8://backspace
setcolor(Color);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
chiso--;
DelChar(strlen(S));
setcolor(C1);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
MouseText(l+textwidth(S)+6+chiso*8,t+(b-t+textheight(S))/2,Color,C1);//,S);
break;
case 27://Esc
strcpy(S,stemp);return;
default:
LUAÂÄN VAÊN TOÁT NGHIEÄP 103

if(a>=32&&a<=126)
{
if((strlen(S)+2)*8>(r-l))break;
setcolor(GREEN);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
InsertChar(a);
setcolor(C1);
outtextxy(l+5,t+(b-t-textheight(S))/2,S);
MouseText(l+textwidth(S)+6+chiso*8,t+(b-t+textheight(S))/2,Color,C1);//,S);//so 8 la
be ngang 1 ky tu
}
}
MouseText(l+textwidth(S)+6,t+(b-t+textheight(S))/2,Color,C1);//,S);//truong hop phim khong
co nhiem vu nao dac biet
};
if (S[0]=='\0')
strcpy(S,stemp);
}
//---------------------------------------------------------
void TEXTBOX::DelChar(int length)//xoa ky tu tai vi tri con tro
{
int vitri=length+chiso;
for(int i=vitri;i<length-1;i++)
S[i]=S[i+1];
if(chiso<0)
{
S[length-1]='\0';
chiso++;
}
}
//---------------------------------------------------------
void TEXTBOX::InsertChar(char c)
{
int length=strlen(S);
for(int i=length;i>length+chiso;i--)
S[i]=S[i-1];
S[length+1]='\0';
S[i]=c;
}
//---------------------------------------------------------
int TEXTBOX::DuongDan(char s[])
{
int l=strlen(s),dem,dr;
char s1[200]="",s2[200]="";
dem=l-1;
if(s[1]==':')
switch(toupper(s[0]))
{
case 'A':dr=1;break;
case 'B':dr=2;break;
case 'C':dr=3;break;
case 'D':dr=4;break;
case 'E':dr=5;break;
LUAÂÄN VAÊN TOÁT NGHIEÄP 104

}
else dr=_getdrive();
for(int i=l-1;i>0;i--)
{
if(s[i]=='\\')
{
dem=i+1;
i=0;
}
else
dem=0;
}
strcat(s2,&s[dem]);
if(dem!=0) dem-=1;
strncpy(s1,s,dem);
strcpy(Path_var,s1);
strcpy(Name,s2);
return dr;
}
//---------------------------------------------------------
void TEXTBOX::Get_name()
{
int n=strlen(Name);
int phan_ten=1;
for(int i=0;i<=n&&phan_ten;i++)
{
if(Name[i]=='.'&&i<n)
{
for(int j=n;j>i;j--)
Name[j]=Name[j-1];
Name[j]='1';
Name[n+1]='\0';
phan_ten=0;
}
if(i==n)
{
Name[i]='1';
Name[i+1]='\0';
}
}
S[0]='\0';
strcat(S,Path_var);
strcat(S,"\\");
strcat(S,Name);
}
C. SÖÛ DUÏNG CHÖÔNG TRÌNH DOWNLOAD.
Ñeå söû duïng chöông trình DowLoad, tröôùc tieân phaûi veà maøn hình Dos (vì
chöông trình ñöôïc vieát trong moâi tröông Dos, khoâng quaûn lyù ñöôïc caùc chöông
trình ñieàu khieån thieát bò saún coù trong maùy, thoaùt veà Dos ñeå traùnh nhöõng xung
ñoät chöông trình).
LUAÂÄN VAÊN TOÁT NGHIEÄP 105

Goïi teân Demo.exe, luùc ñoù maøn hình seõ hieän leân nhö sau:

Ñeå choïn file baèng caùch goõ phím, click chuoät vaøo oâ Open File.

Nuùt pulldown
OÂ nhaäp text

Neáu nhaép nuùt pulldown thì seõ choïn file theo kieåu click chuoät. (hình sau). Choïn oå
ñóa, choïn loaïi file, choïn teân file vaø click OK ñeå choïn file.
LUAÂÄN VAÊN TOÁT NGHIEÄP 106

Sau khi choïn xong file thì trong baûng “Free memory request” xuaát hieän caùc ñòa
chæ ñaàu cuoái, vaø dung löôïng boä nhôù seõ söû duïng.
Sau ñoù click Send ñeå gôûi döõ lieäu ñi.
Khi quaù trình truyeàn file keát thuùc thì xuaát hieän thoâng baùo “Task is complete.”

You might also like