You are on page 1of 70

TRƯỜNG ĐẠI HỌC HÀNG HẢI VIỆT NAM

KHOA ĐIỆN – ĐIỆN TỬ

ĐỒ ÁN I
Đề tài: Thiết kế chương trình chọn và tính tiền hàng hóa
tự động sử dụng hệ vi xử lý 8086

Giảng viên hướng dẫn:


Nhóm
Sinh viên thực hiện:
Mã sinh viên:

HẢI PHÒNG 20

0
MỤC LỤC

MỤC LỤC.................................................................................................................... 1
A. Ý TƯỞNG............................................................................................................... 2
1. Đặt vấn đề..............................................................................................................2
2. Hướng thực hiện.....................................................................................................2
2.1. Mục tiêu..........................................................................................................2
2.2. Sơ đồ khối.......................................................................................................2
2.3. Hoạt động của hệ thống..................................................................................3
3. Cơ sở lý thuyết......................................................................................................3
3.1. Hệ vi xử lý 8086.............................................................................................3
3.2. IC 8255A......................................................................................................10
3.3. IC giải mã 74273..........................................................................................13
3.4. LCD 20x4.....................................................................................................13
B. HOÀN THIỆN Ý TƯỞNG...................................................................................15
1. Xây dựng 1 chương trình chọn và tính tiền hàng hóa tự động trên phần mềm EMU
8086 - Microprocessor Emulator..............................................................................15
1.1. Lưu đồ thuật toán..........................................................................................15
1.2. Lập trình.......................................................................................................15
1.3. Kết quả.........................................................................................................40
2. Mô phỏng chương trình trên phần mềm Proteus...................................................42
2.1. Lưu đồ thuật toán..........................................................................................43
2.2. Xây dựng mạch nguyên lý............................................................................43
2.3. Lập trình.......................................................................................................45
2.4. Kết quả.........................................................................................................66

1
A. Ý TƯỞNG
1. Đặt vấn đề
Ngày nay, khi sự phát triển của khoa học và công nghệ ngày càng trở lên
mạnh mẽ thì những chiếc máy bán hàng tự động hay những chiếc máy giúp
người mua hàng có thể tự chọn hàng hóa và tính tiền, in ra hóa đơn một cách tự
động đã không còn xa lạ với mọi người và trở lên rất phổ biến. Nhưng những
chiếc máy này đều được sử dụng trên những hệ vi xử lý mạnh mẽ hơn rất nhiều
hệ vi xử lý 8086 như Intel core i3, Intel core i5, Intel core i9,… Ngoài ra, còn rất
nhiều hệ vi xử lý của các công ty sản xuất chip bán dẫn khác được sử dụng phổ
biến như chip AMD, chip Qualcomm,…
Và với những kiến thức đã được học về hệ vi xử lý 8086, bọn em xin được áp
dụng vào đề tài “Thiết kế chương trình chọn và tính tiền hàng hóa tự động sử
dụng hệ vi xử lý 8086”.
2. Hướng thực hiện
2.1. Mục tiêu
- Xây dựng 1 chương trình chọn và tính tiền hàng hóa tự động trên phần mềm
EMU 8086 - Microprocessor Emulator
- Mô phỏng chương trình trên phần mềm Proteus với:
• Vi xử lý 8086: vi xử lý trung tâm.
• IC 74273 là IC số được tích hợp bởi 8 flip-flop loại D: dùng để tách các
đường địa chỉ của vi xử lý 8086.
• IC 8255A: mạch phối ghép vào/ra lập trình được gồm 24 chân I/O.
• Màn hình: dùng để hiển thị menu sản phẩm ,hóa đơn.
• Bàn phím: dùng để lựa chọn sản phẩm.

2.2. Sơ đồ khối
- Từ những mục tiêu trên, nhóm em xây dựng được 1 sơ đồ khối hệ thống mô
phỏng như sau:

Màn hình
Hệ vi xử lý
IC 74273 IC 8255A
8086
Bàn phím

2
2.3. Hoạt động của hệ thống
Dựa vào ngôn ngữ lập trình hợp ngữ assembly đã được học với những tập
lệnh cho vi xử lý 8086, chúng em sẽ viết 1 chương trình cho vi xử lý 8086 thông
qua IC 8255A để giao tiếp với màn hình và bàn phím. Màn hình sẽ đóng vai trò
hiển thị và bàn phím sẽ nhận tương tác của người mua hàng.
Khi khởi chạy, vi xử lý 8086 sẽ được tách các bit địa chỉ thông qua IC
74273 và tùy theo thiết lập cho trước, 8255A sẽ lấy 8 bit địa chỉ và dữ liệu để sử
dụng đồng thời thiết lập tín hiệu địa chỉ cho 4 thanh ghi bên trong. Khi đó, IC
8255A sẽ phối ghép với màn hình và bàn phím để hiển thị menu, tương tác và
hiển thị kết quả hóa đơn.
3. Cơ sở lý thuyết
3.1. Hệ vi xử lý 8086
- Hệ vi xử lý 8086 thuộc họ Intel 80x86 với 16 bit dữ liệu và 20 bit địa chỉ.
3.1.1. Sơ đồ khối của 8086
- Bên trong bộ vi xử lý 8086 bao gồm 2 khối chính:
+ Khối thực hiện lệnh (EU- Execution Unit) là nơi giải mã và thi hành các
lệnh + Khối giao tiếp bus (BIU- Bus Interface Unit) có nhiệm vụ đảm bảo
việc trao đổi thông tin giữa 8086 với các thiết bị ngoại vi.
- Sau đây chúng ta sẽ tìm hiều cấu tạo bên trong của từng khối:

Hình 1. Sơ đồ khối của bộ vi xử lý 8086


 Khối thực hiện lệnh (EU)
Khối thực hiện lệnh (EU- Execution Unit) là nơi giả mã và thi hành các lệnh.
EU bao gồm:
3
- Bộ xử lý số học và logic(ALU - Arithmatic Logiccal Unit) là nơi thưc hiện
các lệnh số học và lệnh logic.
- Các thanh ghi đa năng: Có chứa 4 thanh ghi đa năng 16 bit, mỗi thanh ghi có
thể chứa bất kì các loại dữ liệu, tuy nhiên một số công việc, các thanh ghi này
lại có chức năng đặc biệt của riêng nó mà các thanh ghi khác không thực hiện
được.
+ Thanh ghi AX: đây là thanh ghi chứa, kết quả của các thao tác thường được
chứa ở đây. Nếu kết quả là 8 bit thì thanh ghi AL sẽ được sử dụng
+ Thanh ghi BX: đây là thanh ghi cơ sở, thương được chứa địa chỉ cơ sở của
một bảng khi sử dụng lệnh XLAT.
+ Thanh ghi CX: đây là thanh ghi đếm, nó thường được chứa số lần lặp lại
trong trường hợp dùng lênh LÔP, còn CL thì thường được chứa số lần quay
hay dịch bít của các thanh ghi.
+ Thanh ghi DX: đây là thanh ghi dữ liệu, nó thường được sử dụng cùng với
thanh ghi AX để thực hiện các phép nhân hay chia của các số 16 bit. DX còn
được sử dụng để chứa địa chỉ các cổng trong các lệnh vào/ra dữ liệu trực tiếp.
- Trong 8086 còn có 3 thanh ghi con trỏ (IP, BP, SP) và 2 thanh ghi chỉ số (SI,
DI) 16 bit. Các thanh ghi này (trừ IP) đều có thể được dùng như các thanh ghi
đa năng. Nhưng ứng dụng chính của mỗi thanh ghi là chúng được ngầm định
như là thanh ghi lệch cho các đoạn tương ứng.
+ Bảng tóm tắt sự kết hợp ngầm định giữa thanh ghi đoạn và thanh ghi lệch:

Thanh ghi đoạn Thanh ghi lệch Địa chỉ

Địa chỉ lệnh sắp thực


CS IP
hiện

Địa chỉ trong đoạn dữ


DS BX, DI, SI
liệu

Địa chỉ trong đoạn ngăn


SS SP hoặc BP
xếp

ES DI Địa chỉ chuỗi đích

- Thanh ghi cờ F là một thanh ghi đặc biệt gọi là thanh ghi cờ hay thanh ghi
trạng thái. Mỗi bit của thanh ghi này được dùng để phản ánh một trạng thái
nhất định của kết quả phép toán do ALU thực hiện hoặc một trạng thái hoạt
động của CPU. Thanh ghi cờ có 16 bit nhưng chỉ dùng hết 9 bit làm bit cờ.

4
Ca ù
c côøcuûa boävi xöûlyù8086
x x x x O D I T S Z x A x P x C
X : Khoâ
ng ñöôïc ñònh nghóa
Hình 3.3 Sô ñoàthanh ghi côøcuû
a boävi xöûlyù8086/88
- Các bit cờ chia thành hai loại:
+ Các cờ trạng thái: có 6 cờ trạng thái là C, P, A, Z, S và O. Các cờ trạng thái
này được thiết lập bằng 1 hoặc xóa bằng 0 sau hầu hết các lệnh toán học và
logic.
 C (Carry): cờ nhớ;
 P (Parity): cờ chẵn lẻ;
 A (Auxiliary): cờ nhớ phụ;
 Z (Zero): cờ rỗng;
 S (Sign): cờ dấu;

 O (Overflow): cờ tràn;

+ Các cờ điều khiển: có 3 cờ T, I, D. Các cờ này được thiết lập bằng 1 hoặc
xóa
bằng 0 thông qua các lệnh để điều khiển chế độ làm việc của bộ vi xử lý.
 T (Trap): cờ bẫy;
 I (Interrupt): cờ ngắt;
 D (Direction): cờ hướng;

- Khối điều khiển (CU- Control unit): Có nhiệm vụ tạo ra các tín hiệu điều
khiển các bộ phận bên trong và bên ngoài CPU.
 Khối giao tiếp bus (BIU)
Khối giao tiếp bus (BIU- Bus Interface Unit) có nhiệm vụ đẩm bảo việc trao
đổi thông tin giữa 8086 với các linh kiện bên ngoài. BIU gồm :
- Một bộ cộng để tạo địa chỉ vật lý 20 bit từ các thanh ghi 16 bit.
- Bốn thanh ghi đoạn 16 bit gồm CS, DS, SS và ES để giúp 8086 truy cập tới
các đoạn trên bộ nhớ.
+ Thanh ghi đoạn mã CS (Code Segment),.
+ Thanh ghi đoạn dữ liệu DS (Data Segment).
+ Thanh ghi đoạn dữ liệu phụ ES (Extra Segment).
+ Thanh ghi đoạn ngăn xếp SS (Stack Segment).
5
- Mạch logic điều khiển có nhiệm vụ đảm bảo giao tiếp giữa 8086 với thiết bị
bên ngoài.
- Hàng đợi lệnh có độ dài 6 byte là nơi chứa các mã lệnh đọc được nằm sẵn để
chờ EU xử lý.
3.1.2. Sơ đồ chân của 8086

Vi xử lý 8086 được thiết kế để hoạt động một trong hai chế độ, tùy thuộc vào
mức điện áp đặt ở chân số 33 (chân MN/MX):
- Chế độ tối thiểu (chế độ MIN) đươc thiết lập nếu điện áp ở chân số 33 ở mức
5V. là chế độ tong hệ thống chỉ có 8086 và các vi mạch nhớ , các vi mạch
ghép nối vào ra.
- Chế độ tối đa (chế độ MAX) được thiết lập nếu điện áp ở chân số 33 ở mức
0V, là chế độ áp dụng cho hệ thống đa xử lý, đồng xử lý (8086 và bộ đồng xử
lý toán học 8087).
- Các chân mang thông tin địa chỉ: Vi xử lý 8086 có 20 đường địa chỉ từ A0
đến A19 trong đó 16 đường dây địa chỉ thấp từ A0 đến A15 được ghép kênh
dữ liệu từ D0 đến D15 trên các chân từ AD0 đến AD15 ; còn 4 đường dây địa
chỉ cao nhất từ A16 đến A19 được ghép kênh với tín hiệu trạng thái từ S3 đến
S6 trên các chân A16/S3 đến A19/S6.
- Các chân mang thông tin dữ liệu: Vi xử ly 8086 có 16 đường dây dữ liệu từ
Do đến D15 được ghép kênh với 16 đường địa chỉ thấp từ D0 đến D15. Khi
hoạt động ở chu kỳ bus dữ liệu thì các đường dây này mang thong tin về dữ
liệu, là dữ liệu đọc ra hay vào bộ nhớ.
- Các chân tín hiệu trang thái.
+ Bốn đường dây địa chỉ cao nhất từ A16 đến A19 của 8086 cũng được ghép
kênh, nhưng trong trường hợp này nó được ghép kênh với các tín hiệu trạng

6
thái từ S3 đến S6. Các bit trang thái này được đưa ra cùng thời điểm với các
dữ liệu được truyền trên các chân AD0 đến AD15.
+ READY: Tín hiệu báo cho CPU biết tình trạng sẵn sàng của thiết bị ngoại
vi hay bộ nhớ. Khi READY = 1 thì CPU thực hiện đọc/ghi dữ liệu mà không
phải chèn thêm các chu kỳ đợi. Khi các thiết bị ngoại vi hay bộ nhớ cótốc độ
chậm, chúng có thể đưa tin hiệu READY = 0 để báo cho CPU biết mà chờ
chúng. Lúc này CPU tự kéo dài thời gian thực hiện đọc/ghi bằng cách chèn
thêm các chu kỳ đợi.
- Các chân tín hiệu điều khiển.
+ ALE: [I] Address Latch Enable. Xung cho phép chốt địa chỉ. Khi ALE = 1
có nghĩa là trên các chân ghép kênh AD có địa chỉ của thiết bị vào/ra hoặc
ônhớ. Khi CPU chấp nhận treo chân này không ở trạng thái trở kháng cao mà
ALE = 0.
+ DEN : [O] Data bus Enable. Kích hoạt các bộ đệm bus dữ liệu.
+ M / IO: Chọn bộ nhớ (= 0) hoặc thiếtbị vào/ra (= 1) làm việc với CPU. Khi
đó trên bus địa chỉ sẽ có địa chỉtương ứng của các thiết bị đó. Chân này ở
trạng thái trở kháng cao khi CPU chấp nhận treo.
+ DT / R : [O] Data Transmit/Receive. Tín hiệu này cho biết bus dữ liệu đang
vận chuyển dữ liệu vào CPU hay ra khỏi CPU. Tín hiệu này cũng dùng để
điều khiển các bộ đệm 2 chiều của bus dữ liệu.
+ BHE: Dùng để báo răng đang truy cập năng cao hay băng thấp của bộ nhớ
+ RD : :[O] Read signal. Xung cho phép đọc. Khi RD = 0 thì bus dữ liệu nhận
dữ liệu từ bộ nhớ hoặc thiết bị ngoại vi. Chân này ở trạng thái trở kháng
caokhi CPU chấp nhận treo.
- Các chân tín hiệu ngắt:
+ INTR: [I] Interrupt request. Tín hiệu yêu cầu ngắt che được. Khi có yêu cầu
ngắt (INTR = 1) mà cờ cho phép ngắt IF = 1 thì CPU kết thúc lệnh đang làm
dở, sau đó đi vào chu kỳ chấp nhận ngắt và đưa ra bên ngoài tín hiệu INTA =
0.
+ TEST : [I] Tín hiệu tại chân này được kiểm tra bởi lệnh WAIT. Khi CPU
thực hiện lệnh WAIT mà lúc đó tín hiệu TEST = 1 thì nó sẽ chờ cho đến khi
tín hiệu TEST = 0 thì mới thực hiện lệnh tiếp theo.
+ NMI: [I] None-Maskable Interrupt. Tín hiệu yêu cầu ngắt không che được.
Tín hiệu này không bị khống chế bởi cờ IF và nó sẽ được CPU nhận biết bằng
tác động của sườn lên của xung yêu cầu ngắt. Nhận được yêu cầu ngắt này
(NMI = 1) CPU kết thúc lệnh đạng làm dở,sau đó chuyển sang thực hiện
chương trình phục vụ ngắt kiểu INT2.

7
+ RESET: Dùng để thiết lập lại phần cứng cho CPU. Chuyển RESET xuống
mức logic 0 dùng để khởi tạo các thanh ghi nội của vi xử lý và khởi tạo
chương trình con phục vụ thiết lập hệ thống.
- Các chân mang tín hiệu phục vụ DMA : Ở chế độ MIN của 8086 gồm hai tín
hiệu HOLD và HLDA. Khi một thiết bị ngoài muốn giành quyền điều khiển
bus hệ thống thực hiện truy cập bộ nhớ trực tiếp , nó báo yêu cầu này cho
CPU bằng cách chuyển HOLD lên mức logic 1.Sau đó CPU chuyển sang
trạng thái cô lập sau khi chu kỳ bus hiện tại thực hiện xong. Khi ở trạng thái
cô lập , các đường dây tín hiệu AD0- AD15, A16/S3- A19/S6, BHE/S7, , , ,
và INTR.
3.1.3. Các hàm ngắt và tập lệnh của 8086.
- Một số lệnh của 8086
+ Lệnh ADD/SUB: cộng/trừ 2 toán hạng (ADD Đích, Gốc).
+ Lệnh DIV: thực hiện phép chia không dấu, toán hạng nguồn có thể là một ô
nhớ hay đoạn ghi. Nếu toán hạng nguồn là 8 bit thì thương số nằm trong AL,
số dư nằm trong AH; nếu toán hạng nguồn là 16 bit, thì thương số nằm trong
AX còn số dư nằm
trong DX (DIV Gốc).
+ Lệnh INT : dùng để gọi các hàm của DOS và BIOS (VD: int 21h).
+ Lệnh MOV: chuyển dữ liệu từ toán hạng nguồn vào toán hạng đích (MOV
đích, gốc).
+ Lệnh OUT: xuất dữ liệu từ đoạn chứa ra cổng (OUT cổng,thanh ghi).
+ Lệnh IN: đọc dữ liệu từ cổng vào đoạn ghi (IN thanh ghi, cổng).
+ Lệnh MUL(Multiply): thực hiện phép nhân không dấu. Nhân nội dung của
đoạn AL với toán hạng nguồn. Nếu nguồn kiểu byte thì tích chứa trong AX,
nếu nguồn là kiểu từ thì tích chứa trong DX:AX (MUL nguồn).
+ Lệnh JNZ: nếu KQ của lệnh trước đó khác 0 thi thực hiện lệnh nhảy đến
nhãn_đích, ngược lại thì thực hiện lệnh kế tiếp sau đó (JNZ nhãn_đích).
+ Lệnh JA, JG: nhảy nếu lớn hơn
+ Lệnh JB, JL : nhảy nếu nhỏ hơn.
+ Lệnh JNA, JNG: nhảy nếu không lớn hơn.
+ Lệnh JE: nhảy nếu bằng.
+ Lệnh JC : nhảy nếu cờ CF=1.
+ Lệnh JMP: nhảy không điều kiện nhảy đến nhãn_nguồn khi gặp lệnh này
(JMP nhan_nguon).
+ Lệnh CMP (CoMPare) : so sánh 2 toán hạng bằng cách trừ 2 toán hạng cho
nhau mà không lưu lại kết quả (CMP đích, gốc).
+ Lệnh lặp : lặp lại nhãn_nguồn khi gặp lệnh này. Số lần lặp được quyết định
bởi thanh ghi CX (LOOP nhan_nguon).
+ Các lệnh AND, OR, XOR và TEST:
 AND dich,nguon ;AND đích với nguồn, kết quả lưu ở đích.

8
 OR dich,nguon ;OR đích với nguồn, kết quả lưu ở đích.
 XOR dich,nguon ;XOR đích với nguồn, kết quả lưu ở đích.
 TEST dich,nguon ;AND đích với nguồn, kết quả không lưu lại.
+ Lệnh dịch:
 SHL/SAL dich,1 ;dịch sang trái 1 bit.
 SHL/SAL dich,CL ; dịch sang trái nhiều bit.
 SHR dich,1 ; dịch sang phải 1 bit.
 SHR dich,CLL ; dịch sang phải nhiều bit.
+ Lệnh quay:
 ROL/ROR dich,1 ; quay đích sang trái/phải 1 bit.
 ROL/ROR dich,CL ; quay đích sang trái/phải n bit, với CL=n.
 RCL/RCR dich,1 ; quay đích sang trái/phải 1 bit.
 RCL/RCR dich,CL ; quay đích sang trái/phải n bit, với CL=n.
+ Lệnh HLT (HaLT): đưa bộ vi xử lý vào trạng thai dừng để chờ ngắt ngoài.
+ Lệnh LOCK: khóa bus trong môi trường có nhiều bộ vi xử lý.
+ Lệnh NOP: không thực hiện một thao tác nào.
+ Lệnh PUSH: cất dữ liệu vào ngăn xếp, giảm SP đi 2 (PUSH nguon).
+ Lệnh POP: lấy dữ liệu ra khỏi ngăn xếp và đưa vào toán hạng đích (POP
dich).
+ Lệnh CALL: gọi thủ tục (CALL nhan).
+ Lệnh RET: trả lại điều khiển khi thủ tục được thực hiện xong.

- Các hàm ngắt 21h của 8086:


+ Hàm 1: là hàm chờ đọc vào 1 ký tự từ thiết bị vào ra chuẩn(bàn phím). Kết
quả được lưu vào trong AL.
Cú pháp : MOV AH,1
INT 21H
+ Hàm 2 : là hàm hiển thị nội dung thanh ghi DL lên màn hình hoặc thi hành
các chức năng điều khiển.
Cú pháp : MOV AH,2
MOV DL,’A’
INT 21H
9
+ Hàm 4CH : là hàm kết thúc chương trình hiện tại và trả điều khiển về cho
chương trình gọi nó.
Cú pháp : MOV AH,4CH
INT 21H
+ Hàm 9 : Là hàm hiển thị ra màn hình một chuỗi kí tự
Cú pháp : MOV AX,@DATA
MOV DS,AX ;khoi tao thanh ghi doan du lieu DS
MOV AH,9
LEA DX,’chuoi ki tu’
INT 21H
- Cấu trúc chương trình lập trình cho 8086:
.model small ;khai bao kieu bo nho la small
.stack 100h ;khai bao kich thuoc ngan xep la 100h
.data ;khai bao doan du lieu
;khai báo các biến, các hằng ở đây
.code ;khai bao doan ma
Main proc
;các lệnh chương trình chính
Main endp
End main

3.2. IC 8255A
3.2.1. Sơ đồ chân và chức năng của các chân

- Các chân 4, 3, 2, 1, 40, 39, 38, 37: tương ứng với cổng PA từ PA0 đến PA7.
Đây là cổng giao tiếp dữ liệu 8 bit vào/ ra PA. tùy theo thanh ghi điều khiển

10
được cài đặt mà cổng này có thể xuất dữ liệu ra hoặc nhận dữ liệu vào. Cổng
này khác với cổng PC, nó không thể tách làm 2 độc lập với nhau được.
- Các chân từ 18 đến 25: tương ứng với cổng PB từ PB0 đến PB7 . Tương tự
như cổng PA, cổng PB cũng có thể đưa dữ lieu 8 bít ra hoặc vào bằng cách
thiết lập giá trị của thanh ghi điều khiển.
- Các chân 14, 15, 16, 17, 13, 12, 11, 10: tương ứng theo thứ tự từ PC0 đến
PC7. Đây là cổng giao tiếp dữ liệu 8 bít PC, khi cần thiết, nó có thể tách thành
2 phần PC cao từ bít PC7 đến PC4 và PC thấp từ bít PC0 đến PC3.đặc biệt,
hai phần này có thể hoạt động độc lập với nhau nếu cần. tùy thuộc vào thanh
ghi điều khiển được cài đặt mà các cổng này có thể vào/ ra dữ liệu.
- Các chân từ 27 đến 34 : tương ứng theo thứ tự từ D7 đến D0 - Bus dữ liêu(2
chiều). Bus dữ liệu 2 chiều này được nối tới các tín hiệu tương ứng của Vi xử
lý để trao đổi dữ liệu vào/ra do chip 8086 xử lý.
- Chân 35: là chân Reset - khởi tạo trạng thái ban đầu của IC 8255. Nếu đặt
mức này lên mức 1 thì IC bị RESET lại từ đầu. để mạch có thể chạy được,
chúng ta phải đặt chân này về mức 0V – GND.
- Chân 6: chân /CS - Tín hiệu chọn vi mạch. Đây là tín hiệu tích cực ở mức
thấp 0v, vì vây chúng ta phải đặt chân này ở mức thấp để chọn IC 8255 hoạt
động. nhơ vậy, chân này được sử dụng để kết hợp với mạch giải mã địa chỉ để
Vi xử lý điều khiển nó hoạt động đúng yêu cầu.
- Chân 5: chân /RD (Read)- là chân tín hiệu cho phép đọc.
- Chân 36: chân /WR(Write) – là chân tín hiệu cho phép ghi.
- Chân 9 và 8: tương ứng với chân tín hiệu địa chỉ A0 – A1, 2 chân này được
nối với 2 bít được tách ra từ bộ tách địa chỉ của 8086, 2 chân này dùng để giải
mã cho các cổng của 8255 với quy luật sau:
+ A1A0 là 00: mã hóa cho cổng PA
+ A1A0 là 01: mã hóa cho cổng PB + A1A0 là 10: mã hóa cho cổng PC
+ A1A0 là 11: mã hóa cho thanh ghi điều khiển
Chính vì vậy, để chọn đúng vị trí cổng chúng ta phải đưa 2 bít bất kì được
tách ra từ bộ tách tín hiệu địa chỉ sao cho 2 chân này cũng được mã hóa đúng
như quy luật của A1, A0 trên 8255.
3.2.2. Chế độ hoạt động
Tuy thuộc vào đoạn ghi điều khiển khi khởi tạo mà vi mạch có thể hoạt động
ở các chế độ 0, 1, 2 khác nhau, chiều của các cổng A, B, C có thể ra hoặc vào.
Thanh ghi điều khiển gồm có 8 bit, mỗi bít có các chức năng khác nhau :

- Bit D6 và D5 dùng để chọn chế độ nhóm A


11
+ Nếu D6D5 là 00 thì chọn chế độ 0
+ Nếu D6D5 là 01 thì chọn chế độ 1
+ Các trường hợp khác sẽ không xác định

- Bit PA: chọn chiều cho cổng PA


+ Nếu PA=0: cổng PA sẽ xuất dữ liệu ra
+ Nếu PA=1: cổng PA sẽ nhận dự liệu bên ngoài vào

- Bit PC cao: chọn chiều ra/vào cho 4 bit cao của cổng PC
+ Nếu PC=0 thì cho phép cổng PC cao xuất dữ liệu ra
+ Nếu PC=1 thì cho phép cổng PC ca0 nhận dữ liệu

- Bit D2: chọn chế độ nhóm B


+ Nếu D2=0 thì chọn chế độ 0
+ Nếu D2=1 thì chọn chế độ 1

- Bit PB: chọn chiều ra/vào cho cổng PB


+ Nếu PB=0 thì cho phép cổng PB xuất dữ liệu ra
+ Nếu PB=1 thì cho phép cổng PB nhận dữ liệu

- Bit PC thấp: chọn chiều ra/vào cho 4 bit thấp của cổng PC
+ Nếu PC=0 thì cho phép cổng PC thấp xuất dữ liệu ra
+ Nếu PC=1 thì cho phép cổng PC thấp nhận dữ liệu

VD: để chọn chọn chế độ nhóm A là chế độ 0, nhóm B là chế độ 0, cổng PA, PB
xuất dữ liệu, cổng PC nhận dữ liệu , ta cài đặt thanh ghi điều khiển như sau:
Mov al, 100010001B
Out DK, al

- Chế độ 0:
+ các cổng A, B, C được sử dụng đọc lập với nhau.
+ Cổng A, B, C có thể vào hoặc ra tùy vào đoạn ghi điều khiển

- Chế độ 1: chế độ này được gọi là chế độ vào/ra đột cửa hay ddooid thoại với
các bit của cổng C. Các cổng A, B, C được chia thành 2 nhóm:
+ Nhóm A gồm cổng A để trao đổi dữ liệu với cổng C cao để giao tiếp với vi
xử lý và thiết bị ngoài.
+ Nhóm B gồm cổng B để trao đổi dữ liệu với cổng C thấp để giao tiếp với vi
xử lý và thiết bị ngoài.

12
3.3. IC giải mã 74273
- Sơ đồ chân của IC giải mã 74273:

- IC 74273 là IC số được tích hợp bỏi 8 con flip-flop loại D lắp theo kiểu đồng bộ
xung đồng hồ và chân clear. IC gồm có 20 chân trong đó:
+ Chân 20 nối với Vcc nằm ở dải 4,75 đến 5,25 Volt
+ Chân 10 nối với Mass
+ Chân 1 là chân Clear (MR)
+ Chân 11 là chân xung đồng hồ (CP)
+ Các chân 3, 4, 7, 8, 13, 14, 17, 18 là chân tín hiệu vào nối với các dây tín hiệu đa
hợp của vi xử lý.
+ Các chân 2, 5, 6, 9, 12, 15, 16, 19 là các chân tín hiệu địa chỉ được tách ra.
Do IC 74273 được tích hợp bởi 8 FlipFlop D nên mỗi IC chỉ có thể tách được 8
đường địa chỉ đa hợp của 8086. Vì vậy mạch cần 3 con IC 74273 để tách hết 20 đường
địa chỉ của 8086. Tùy theo đề bài yêu cầu mà các đầu ra này được sử dụng với mục
đích khác nhau, các chân này được nối với mạch giải mã địa chỉ đưa vào chân CS của
8255 và dành ra 2 bit để mã hóa cho các cổng của 8255, 2 chân này được nối vào chân
A1, A0 của 8255.
3.4. LCD 20x4
- Sơ đồ chân của LCD 20x4:

13
- LCD 20x4 là là loại màn hình tinh thể lỏng nhỏ dùng để hiển thị chữ hoặc số
trong bảng mã ASCII. Mỗi ô của Text LCD bao gồm các chấm tinh thể lỏng,
các chấm này kết hợp với nhau theo trình tự “ẩn” hoặc “hiện” sẽ tạo nên các
kí tự cần hiển thị và mỗi ô chỉ hiển thị được một kí tự duy nhất. LCD 20x4
nghĩa là loại LCD có 4 dòng và mỗi dòng chỉ hiển thị được 20 kí tự. Đây là
loại màn hình được sử dụng rất phổ biến trong các loại mạch điện. LCD bao
gồm 14 chân trong đó:
+ Chân 1: (Vss) Chân nối đất cho LCD, khi thiết kế mạch ta nối chân này với
GND của mạch điều khiển.
+ Chân 2: VDD Là chân cấp nguồn cho LCD, khi thiết kế mạch ta nối chân
này với VCC = 5V của mạch điều khiển.
+ Chân 3: V0 là chân điều chỉnh độ tương phản của LCD.
+ Chân 4: RS Là chân chọn thanh ghi (Register select). Nối chân RS với logic
“0” (GND) hoặc logic “1” (VCC) để chọn thanh ghi.
 Logic “0”: Bus D0-D7 sẽ nối với thanh ghi lệnh IR của LCD (ở chế độ
ghi) hoặc nối với bộ đếm địa chỉ của LCD (ở chế độ đọc).
 Logic “1”: Bus D0-D7 sẽ nối với thanh ghi dữ liệu DR bên trong LCD.
+ Chân 5: R/W là chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với
logic “0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để LCD ở
chế độ đọc.
+ Chân 6: E Là chân cho phép (Enable). Sau khi các tín hiệu được đặt lên bus
D0-D7, các lệnh chỉ được chấp nhận khi có 1 xung cho phép của chân E.
 Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển vào(chấp nhận) thanh
ghi bên trong nó khi phát hiện một xung (chuyển từ trạng thái thấp lên
cao hoặc cao xuống thấp) của tín hiệu chân E.
 Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra D0-D7 khi phát hiện cạnh
lên (chuyển từ trạng thái thấp lên cao hoặc cao xuống thấp) ở chân E và
được LCD giữ ở bus đến khi nào chân E xuống mức thấp.
+ Chân 7 - 14: D0 - D7 - Tám đường của bus dữ liệu dùng để trao đổi thông
tin với MPU. Có 2 chế độ sử dụng 8 đường bus này:
 Chế độ 8 bit: Dữ liệu được truyền trên cả 8 đường từ D0 tới D7, với bit
MSB là bit D7.
 Chế độ 4 bit: Dữ liệu được truyền trên 4 đường từ D4 tới D7, với bit
MSB là D7.
+ Chân 15: Nguồn dương cho đèn nền.
+ Chân 16: GND cho đèn nền.

14
B. HOÀN THIỆN Ý TƯỞNG
1. Xây dựng 1 chương trình chọn và tính tiền hàng hóa tự động trên phần
mềm EMU 8086 - Microprocessor Emulator
1.1. Lưu đồ thuật toán

1.2. Lập trình


15
# Chương trình lựa chọn và tính tiền, in ra hóa đơn hàng hóa tự động
.model small
.stack 100h
.data
tb1 db "------CHAO MUNG BAN DEN VOI THE COFFEE HOUSE------$"

tb2 db 10,13,"******************* MENU THUC DON ******************$"


tb3 db 10,13,"** **$"
tb4 db 10,13,"** 1. CA PHE **$"
tb5 db 10,13,"** 2. TRA & MACCHIATO **$"
tb6 db 10,13,"** 3. THUC UONG DA XAY **$"
tb7 db 10,13,"** 4. THUC UONG TRAI CAY **$"
tb8 db 10,13,"** 5. BANH & SNACK **$"
tb9 db 10,13,"******************************************************$"
tb10 db 10,13,"Vui long chon (1-5): $"

tb11 db 10,13,"******************** MENU CA PHE *******************$"


tb12 db 10,13,"** **$"
tb13 db 10,13,"** 1. BAC SUU (29K) 2. AMERICANO (39K) **$"
tb14 db 10,13,"** 3. CA PHE DEN (29K) 4. ESPRESSO (35K) **$"
tb15 db 10,13,"** 5. CA PHE SUA (29K) 6. CAPPUCINNO (45K) **$"
tb16 db 10,13,"** 7. SO-CO-LA DA (55K) 8. QUAY VE MENU CHINH **$"
tb17 db 10,13,"******************************************************$"
tb18 db 10,13,"Vui long chon (1-8): $"
tb19 db 10,13,"Ban co muon dung them gi khong? (Y/N): $"

tb20 db 10,13,"******************** MENU TRA & MACCHIATO


*********************$"
tb21 db 10,13,"** **$"
tb22 db 10,13,"** 1. TRA DAO CAM SA (45K) 2. TRA DEN MACCHIATO
(42K) **$"
tb23 db 10,13,"** 3. TRA MATCHA LATTE (59K) 4. TRA XOAI MACCHIATO
(55K) **$"
tb24 db 10,13,"** 5. TRA CHERRY MACCHIATO (55K) 6. TRA OOLONG VAI
NHU Y (45K) **$"
tb25 db 10,13,"** 7. QUAY VE MENU CHINH **$"
tb26 db
10,13,"***************************************************************
**$"
tb27 db 10,13,"Vui long chon (1-7): $"

tb28 db 10,13,"********************** MENU THUC UONG DA XAY


**********************$"
tb29 db 10,13,"** **$"
tb30 db 10,13,"** 1. CHANH SA DA XAY (49K) 2. DAO VIET QUAT DA
XAY (59K) **$"

16
tb31 db 10,13,"** 3. CHOCOLATE DA XAY (59K) 4. COOKIES DA XAY
(59K) **$"
tb32 db 10,13,"** 5. QUAY VE MENU CHINH **$"
tb33 db
10,13,"***************************************************************
******$"
tb34 db 10,13,"Vui long chon (1-5): $"

tb35 db 10,13,"****************** MENU THUC UONG TRAI CAY


*****************$"
tb36 db 10,13,"** **$"
tb37 db 10,13,"** 1. SINH TO CAM XOAI (59K) 2. SINH TO VIET QUAT (59K)
**$"
tb38 db 10,13,"** 3. QUAY VE MENU CHINH **$"
tb39 db
10,13,"**************************************************************$"
tb40 db 10,13,"Vui long chon (1-3): $"

tb41 db 10,13,"************************* MENU BANH & SNACK


**********************$"
tb42 db 10,13,"** **$"
tb43 db 10,13,"** 1. BANH CHOCOLATE (29K) 2. BANH MATCHA
(29K) **$"
tb44 db 10,13,"** 3. BANH BONG LAN TRUNG MUOI (29K) 4. BANH
TIRAMISU (29K) **$"
tb45 db 10,13,"** 5. QUAY VE MENU CHINH **$"
tb46 db
10,13,"***************************************************************
*****$"
tb47 db 10,13,"Vui long chon (1-5): $"

tb48 db 10,13,"So tien thanh toan (Nghin Dong): $"


tb49 db 10,13,"Cam on ban rat nhieu!$"
tb50 db 10,13,"Ban da nhap sai, Vui long nhap lai: $"

tb51 db 10,13,"Thuc don ban da chon: $"

tb52 db 10,13,"BAC SUU (29K) x$"


tb53 db 10,13,"AMERICANO (39K) x$"
tb54 db 10,13,"CA PHE DEN (29K) x$"
tb55 db 10,13,"ESPRESSO (35K) x$"
tb56 db 10,13,"CA PHE SUA (29K) x$"
tb57 db 10,13,"CAPPUCINNO (45K) x$"
tb58 db 10,13,"SO-CO-LA DA (55K) x$"

tb59 db 10,13,"TRA DAO CAM SA (45K) x$"


tb60 db 10,13,"TRA DEN MACCHIATO (42K) x$"
17
tb61 db 10,13,"TRA MATCHA LATTE (59K) x$"
tb62 db 10,13,"TRA XOAI MACCHIATO (55K) x$"
tb63 db 10,13,"TRA CHERRY MACCHIATO (55K) x$"
tb64 db 10,13,"TRA OOLONG VAI NHU Y (45K) x$"

tb65 db 10,13,"CHANH SA DA XAY (49K) x$"


tb66 db 10,13,"DAO VIET QUAT DA XAY (59K) x$"
tb67 db 10,13,"CHOCOLATE DA XAY (59K) x$"
tb68 db 10,13,"COOKIES DA XAY (59K) x$"

tb69 db 10,13,"SINH TO CAM XOAI (59K) x$"


tb70 db 10,13,"SINH TO VIET QUAT (59K) x$"

tb71 db 10,13,"BANH CHOCOLATE (29K) x$"


tb72 db 10,13,"BANH MATCHA (29K) x$"
tb73 db 10,13,"BANH BONG LAN TRUNG MUOI (29K) x$"
tb74 db 10,13,"BANH TIRAMISU (29K) x$"

tb75 db 10,13,"********************************$"

a dw ?
b dw ?
c dw ?
d dw ?
e dw ?
;Kiem tra xem la chon mon gi
cf1 db ?
cf2 db ?
cf3 db ?
cf4 db ?
cf5 db ?
cf6 db ?
cf7 db ?

tm1 db ?
tm2 db ?
tm3 db ?
tm4 db ?
tm5 db ?
tm6 db ?

tu1 db ?
tu2 db ?
tu3 db ?
tu4 db ?
tu5 db ?
tu6 db ?
18
bs1 db ?
bs2 db ?
bs3 db ?
bs4 db ?

.code
main proc
;thu tuc
mov ax, @data
mov ds, ax
;tb1
mov ah, 9
lea dx, tb1
int 21h
;cat noi dung 00H vao trong bo nho dem
mov dx,00H
push dx
;
mov a,0
mov b,0
mov c,0
mov d,0
mov e,0
;
mov cf1,0
mov cf2,0
mov cf3,0
mov cf4,0
mov cf5,0
mov cf6,0
mov cf7,0
;
mov tm1,0
mov tm2,0
mov tm3,0
mov tm4,0
mov tm5,0
mov tm6,0
;
mov tu1,0
mov tu2,0
mov tu3,0
mov tu4,0
mov tu5,0
mov tu6,0
19
;
mov bs1,0
mov bs2,0
mov bs3,0
mov bs4,0
;
call nhap
;ket thuc
;mov ah, 4ch
;int 21h
HLT

main endp

;menu
nhap proc
;tb2
mov ah, 2
mov dl, 0Ah
int 21h
;menu chinh
mov ah, 9
lea dx, tb2
int 21h
mov ah, 9
lea dx, tb3
int 21h
mov ah, 9
lea dx, tb4
int 21h
mov ah, 9
lea dx, tb5
int 21h
mov ah, 9
lea dx, tb6
int 21h
mov ah, 9
lea dx, tb7
int 21h
mov ah, 9
lea dx, tb8
int 21h
mov ah, 9
lea dx, tb9
int 21h
mov ah, 9
20
lea dx, tb10
int 21h
nhap_chinh:
mov ah, 1
int 21h
cmp al, 31h
je nhap1
cmp al, 32h
je nhap2
cmp al, 33h
je nhap3
cmp al, 34h
je nhap4
cmp al, 35h
je nhap5
jmp nhap_sai
nhap_sai:
mov ah,9
lea dx, tb50
int 21h
jmp nhap_chinh

nhap endp
;coffee
nhap1 proc

mov ah, 9
lea dx, tb11
int 21h
mov ah, 9
lea dx, tb12
int 21h
mov ah, 9
lea dx, tb13
int 21h
mov ah, 9
lea dx, tb14
int 21h
mov ah, 9
lea dx, tb15
int 21h
mov ah, 9
lea dx, tb16
int 21h
mov ah, 9
lea dx, tb17
int 21h
21
nhap_chinh_1:
mov ah, 9
lea dx, tb18
int 21h
mov ah, 1
int 21h
cmp al, 31h
je nhap1_1
cmp al, 32h
je nhap2_1
cmp al, 33h
je nhap3_1
cmp al, 34h
je nhap4_1
cmp al, 35h
je nhap5_1
cmp al, 36h
je nhap6_1
cmp al, 37h
je nhap7_1
cmp al, 38h
je nhap8_1
jmp nhap_sai_1
nhap1_1:
inc cf1
mov ax, 29
jmp chung_1
nhap2_1:
inc cf2
mov ax, 39
jmp chung_1
nhap3_1:
inc cf3
mov ax, 29
jmp chung_1
nhap4_1:
inc cf4
mov ax, 35
jmp chung_1
nhap5_1:
inc cf5
mov ax, 29
jmp chung_1
nhap6_1:
inc cf6
22
mov ax, 45
jmp chung_1
nhap7_1:
inc cf7
mov ax, 55
jmp chung_1
nhap8_1:
mov ah,2
mov dl, 10
int 21h
mov ah,2
mov dl, 13
int 21h
call nhap
nhap_sai_1:
mov ah,9
lea dx, tb50
int 21h
jmp nhap_chinh_1

chung_1:
xor ah, ah
add ax, a
mov a, ax
mov ah,9
lea dx, tb19
int 21h
mov ah, 1
int 21h
cmp al, 59h
je tiep
cmp al, 79h
je tiep
jmp tinh_tien

tiep:
jmp nhap_chinh_1
tinh_tien:
call tinh_tien_tong
nhap1 endp

;TRA & MACCHIATO

nhap2 proc
mov ah, 9
lea dx, tb20
int 21h
23
mov ah, 9
lea dx, tb21
int 21h
mov ah, 9
lea dx, tb22
int 21h
mov ah, 9
lea dx, tb23
int 21h
mov ah, 9
lea dx, tb24
int 21h
mov ah, 9
lea dx, tb25
int 21h
mov ah, 9
lea dx, tb26
int 21h

nhap_chinh_2:

mov ah, 9
lea dx, tb27
int 21h
mov ah, 1
int 21h
cmp al, 31h
je nhap1_2
cmp al, 32h
je nhap2_2
cmp al, 33h
je nhap3_2
cmp al, 34h
je nhap4_2
cmp al, 35h
je nhap5_2
cmp al, 36h
je nhap6_2
cmp al, 37h
je nhap7_2
jmp nhap_sai_2

nhap1_2:
inc tm1
mov ax, 45
jmp chung_2
24
nhap2_2:
inc tm2
mov ax, 42
jmp chung_2
nhap3_2:
inc tm3
mov ax, 59
jmp chung_2
nhap4_2:
inc tm4
mov ax, 55
jmp chung_2
nhap5_2:
inc tm5
mov ax, 55
jmp chung_2
nhap6_2:
inc tm6
mov ax, 45
jmp chung_2
nhap7_2:
mov ah,2
mov dl, 10 ;xuong dong
int 21h
mov ah,2
mov dl, 13 ;lui ve dau dong
int 21h
call nhap
nhap_sai_2:
mov ah,9
lea dx, tb50
int 21h
jmp nhap_chinh_2

chung_2:
xor ah, ah
add ax, b
mov b, ax
mov ah,9
lea dx, tb19
int 21h
mov ah, 1
int 21h
cmp al, 59h
je tiep_2
cmp al, 79h
je tiep_2
25
jmp tinh_tien_2

tiep_2:
jmp nhap_chinh_2
tinh_tien_2:
call tinh_tien_tong
nhap2 endp

; THUC UONG DA XAY


nhap3 proc
mov ah, 9
lea dx, tb28
int 21h
mov ah, 9
lea dx, tb29
int 21h
mov ah, 9
lea dx, tb30
int 21h
mov ah, 9
lea dx, tb31
int 21h
mov ah, 9
lea dx, tb32
int 21h
mov ah, 9
lea dx, tb33
int 21h

nhap_chinh_3:

mov ah, 9
lea dx, tb34
int 21h
mov ah, 1
int 21h
cmp al, 31h
je nhap1_3
cmp al, 32h
je nhap2_3
cmp al, 33h
je nhap3_3
cmp al, 34h
je nhap4_3
cmp al, 35h
26
je nhap5_3
jmp nhap_sai_3

nhap1_3:
inc tu1
mov ax, 49
jmp chung_3
nhap2_3:
inc tu2
mov ax, 59
jmp chung_3
nhap3_3:
inc tu3
mov ax, 59
jmp chung_3
nhap4_3:
inc tu4
mov ax, 59
jmp chung_3
nhap5_3:
mov ah,2
mov dl, 10
int 21h
mov ah,2
mov dl, 13
int 21h
call nhap
nhap_sai_3:
mov ah,9
lea dx, tb50
int 21h
jmp nhap_chinh_3

chung_3:
xor ah, ah
add ax, c
mov c, ax
mov ah,9
lea dx, tb19
int 21h
mov ah, 1
int 21h
cmp al, 59h
je tiep_3
cmp al, 79h
je tiep_3
jmp tinh_tien_3
27
tiep_3:
jmp nhap_chinh_3
tinh_tien_3:
call tinh_tien_tong
nhap3 endp

; THUC UONG TRAI CAY


nhap4 proc
mov ah, 9
lea dx, tb35
int 21h
mov ah, 9
lea dx, tb36
int 21h
mov ah, 9
lea dx, tb37
int 21h
mov ah, 9
lea dx, tb38
int 21h
mov ah, 9
lea dx, tb39
int 21h

nhap_chinh_4:

mov ah, 9
lea dx, tb40
int 21h
mov ah, 1
int 21h
cmp al, 31h
je nhap1_4
cmp al, 32h
je nhap2_4
cmp al, 33h
je nhap3_4
jmp nhap_sai_4

nhap1_4:
inc tu5
mov ax, 59
jmp chung_4
nhap2_4:
28
inc tu6
mov ax, 59
jmp chung_4
nhap3_4:
mov ah,2
mov dl, 10
int 21h
mov ah,2
mov dl, 13
int 21h
call nhap
nhap_sai_4:
mov ah,9
lea dx, tb50
int 21h
jmp nhap_chinh_4

chung_4:
xor ah, ah
add ax, d
mov d, ax
mov ah,9
lea dx, tb19
int 21h
mov ah, 1
int 21h
cmp al, 59h
je tiep_4
cmp al, 79h
je tiep_4
jmp tinh_tien_4

tiep_4:
jmp nhap_chinh_4
tinh_tien_4:
call tinh_tien_tong
nhap4 endp

; BANH & SNACK


nhap5 proc
mov ah, 9
lea dx, tb41
int 21h
mov ah, 9
lea dx, tb42
int 21h
mov ah, 9
29
lea dx, tb43
int 21h
mov ah, 9
lea dx, tb44
int 21h
mov ah, 9
lea dx, tb45
int 21h
mov ah, 9
lea dx, tb46
int 21h

nhap_chinh_5:

mov ah, 9
lea dx, tb47
int 21h
mov ah, 1
int 21h
cmp al, 31h
je nhap1_5
cmp al, 32h
je nhap2_5
cmp al, 33h
je nhap3_5
cmp al, 34h
je nhap4_5
cmp al, 35h
je nhap5_5
jmp nhap_sai_5

nhap1_5:
inc bs1
mov ax, 29
jmp chung_5
nhap2_5:
inc bs2
mov ax, 29
jmp chung_5
nhap3_5:
inc bs3
mov ax, 29
jmp chung_5
nhap4_5:
inc bs4
mov ax, 29
30
jmp chung_5
nhap5_5:
mov ah,2
mov dl, 10
int 21h
mov ah,2
mov dl, 13
int 21h
call nhap
nhap_sai_5:
mov ah,9
lea dx, tb50
int 21h
jmp nhap_chinh_5

chung_5:
xor ah, ah
add ax, e
mov e, ax
mov ah,9
lea dx, tb19
int 21h
mov ah, 1
int 21h
cmp al, 59h
je tiep_5
cmp al, 79h
je tiep_5
jmp tinh_tien_5

tiep_5:
jmp nhap_chinh_5
tinh_tien_5:
call tinh_tien_tong
nhap5 endp

;tinh tien tong


tinh_tien_tong proc
mov ah,9
lea dx, tb75
int 21h
mov ah,9
lea dx, tb48
int 21h
mov cx, 0
mov bx, 10
mov ax, a
31
add ax, b
add ax, c
add ax, d
add ax, e
chia:
mov dx,0; phan du ti se luu tai day
div bx
push dx
inc cx
cmp al,0
je ht
jmp chia
ht:
pop dx
add dl, 30h
mov ah,2
int 21h
dec cx
cmp cx ,0
je them_chu_k
jmp ht
them_chu_k:
mov ah,2
mov dl,4Bh ;4B la ki tu K
int 21h
mov ah,9
lea dx, tb51
int 21h
mov ah,9
lea dx, tb75
int 21h
jmp menu_da_chon
menu_da_chon:
cmp cf1,0
ja menu_11 ;nhay neu lon hon 0
cmp cf2,0
ja menu_12
cmp cf3,0
ja menu_13
cmp cf4,0
ja menu_14
cmp cf5,0
ja menu_15
cmp cf6,0
ja menu_16
cmp cf7,0
ja menu_17
32
cmp tm1,0
ja menu_21
cmp tm2,0
ja menu_22
cmp tm3,0
ja menu_23
cmp tm4,0
ja menu_24
cmp tm5,0
ja menu_25
cmp tm6,0
ja menu_26

cmp tu1,0
ja menu_31
cmp tu2,0
ja menu_32
cmp tu3,0
ja menu_33
cmp tu4,0
ja menu_34

cmp tu5,0
ja menu_41
cmp tu6,0
ja menu_42

cmp bs1,0
ja menu_51
cmp bs2,0
ja menu_52
cmp bs3,0
ja menu_53
cmp bs4,0
ja menu_54

jmp cam_on
;
menu_11:
mov ah,9
lea dx, tb52
int 21h
mov al, cf1
add al, 30h
mov dl, al
mov ah, 2
33
int 21h
mov cf1,0
jmp menu_da_chon
menu_12:

mov ah,9
lea dx, tb53
int 21h
mov al, cf2
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov cf2,0
jmp menu_da_chon
menu_13:
mov ah,9
lea dx, tb54
int 21h
mov al, cf3
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov cf3,0
jmp menu_da_chon
menu_14:

mov ah,9
lea dx, tb55
int 21h
mov al, cf4
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov cf4,0
jmp menu_da_chon
menu_15:
mov ah,9
lea dx, tb56
int 21h
mov al, cf5
add al, 30h
mov dl, al
mov ah, 2
int 21h
34
mov cf5,0
jmp menu_da_chon
menu_16:
mov ah,9
lea dx, tb57
int 21h
mov al, cf6
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov cf6,0
jmp menu_da_chon
menu_17:

mov ah,9
lea dx, tb58
int 21h
mov al, cf7
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov cf7,0
jmp menu_da_chon
;
menu_21:

mov ah,9
lea dx, tb59
int 21h
mov al, tm1
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tm1,0
jmp menu_da_chon
menu_22:

mov ah,9
lea dx, tb60
int 21h
mov al, tm2
add al, 30h
mov dl, al
mov ah, 2
35
int 21h
mov tm2,0
jmp menu_da_chon
menu_23:

mov ah,9
lea dx, tb61
int 21h
mov al, tm3
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tm3,0
jmp menu_da_chon
menu_24:

mov ah,9
lea dx, tb62
int 21h
mov al, tm4
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tm4,0
jmp menu_da_chon
menu_25:

mov ah,9
lea dx, tb63
int 21h
mov al, tm5
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tm5,0
jmp menu_da_chon
menu_26:

mov ah,9
lea dx, tb64
int 21h
mov al, tm6
add al, 30h
mov dl, al
36
mov ah, 2
int 21h
mov tm6,0
jmp menu_da_chon
;
menu_31:

mov ah,9
lea dx, tb65
int 21h
mov al, tu1
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tu1,0
jmp menu_da_chon
menu_32:

mov ah,9
lea dx, tb66
int 21h
mov al, tu2
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tu2,0
jmp menu_da_chon
menu_33:

mov ah,9
lea dx, tb67
int 21h
mov al, tu3
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tu3,0
jmp menu_da_chon
menu_34:

mov ah,9
lea dx, tb68
int 21h
mov al, tu4
37
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tu4,0
jmp menu_da_chon

;
menu_41:

mov ah,9
lea dx, tb69
int 21h
mov al, tu5
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tu5,0
jmp menu_da_chon
menu_42:

mov ah,9
lea dx, tb70
int 21h
mov al, tu6
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov tu6,0
jmp menu_da_chon
;
menu_51:

mov ah,9
lea dx, tb71
int 21h
mov al, bs1
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov bs1,0
jmp menu_da_chon
menu_52:

38
mov ah,9
lea dx, tb72
int 21h
mov al, bs2
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov bs2,0
jmp menu_da_chon
menu_53:

mov ah,9
lea dx, tb73
int 21h
mov al, bs3
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov bs3,0
jmp menu_da_chon
menu_54:

mov ah,9
lea dx, tb74
int 21h
mov al, bs4
add al, 30h
mov dl, al
mov ah, 2
int 21h
mov bs4,0
jmp menu_da_chon

;
cam_on:
mov ah,9
lea dx,tb75
int 21h
mov ah,9
lea dx, tb49
int 21h

tinh_tien_tong endp

end main
39
1.3. Kết quả
- Sau quá trình viết và kiểm tra, chương trình đã hoạt động tốt và có thể lựa
chọn, tính tiền, in ra hóa đơn 1 cách tự động với các trường hợp nhiều loại
hàng hóa, cùng một loại hàng hóa nhiều lần như trong những bức ảnh phía
dưới.

40
41
2. Mô phỏng chương trình trên phần mềm Proteus
Ở mục trên, chúng em đã bước đầu xây dựng được chương trình và chạy mô
phỏng được trên phần mềm EMU 8086 hoàn toàn từ vi xử lý 8086 mà chưa có
ghép nối ngoại vi. Ở phần này, để chương trình trực quan hơn chúng em đã sử
dụng phần mềm proteus.
Để có thể mô phỏng được trên phần mềm, chúng em cần phải vẽ mạch
nguyên lý và sử dụng màn hình, bàn phím. Từ đó, chương trình cũng bị thay đổi
một phần vì các lệnh vào/ra của ghép nối ngoại vi và các chương trình con để
điều khiển được màn hình và bàn phím.

42
2.1. Lưu đồ thuật toán

2.2. Xây dựng mạch nguyên lý


- Do IC 74273 được tích hợp bởi 8 FlipFlop D nên mỗi IC chỉ có thể tách được
8 đường địa chỉ đa hợp của 8086. Vì vậy sơ đồ cần 3 con IC 74273 để tách
hết 20 đường địa chỉ của 8086.
- Chúng em lựa chọn địa chỉ các cổng PA, PB, PC và CWR lần lượt là E1H,
E3H, E5H và E7H.
- Ta có bảng địa chỉ các cổng như sau:
43
A1 A1 Địa
Cổng A15 A13 A12 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A0
4 1 chỉ
PA 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 E1H
PB 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 1 E3H
PC 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 1 E5H
CWR 0 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 E7H

- Ta nhận thấy, bit có trọng số thấp nhất A0 có giá trí không đổi và là bit ‘1’
nên các chân dữ liệu được sử dụng cho 8255A sẽ là chân D8-D15.
- Bit địa chỉ thứ 2 và 3 (A1-A2) tạo thành tổ hợp 2 bit (00-01-10-11) tương tự
như bit A0-A1 trên 8255A nên được sử dụng cho 2 cổng A0, A1 của 8255A.
- Các bit A0 và A3-A15 đều là các bit địa chỉ cố định nên được sử dụng để đưa
vào mạch OR cùng chân M/IO, GND để tạo thành tín hiệu chọn vỏ CS của
8255A (CS = 0 thì 8255A hoạt động). Nếu các chân địa chỉ bị thay đổi và lệch
đi thì tín hiệu chọn vỏCS = 0 và IC 8255A sẽ không hoạt động.
- LCD 20x4 được ghép nối với IC 8255A với cổng PA dùng để vào/ra dữ liệu
với LCD thông qua 8 bit. Đồng thời, 3 bit thấp của cổng PB được sử dụng để
đưa vào các chân điều khiển và chân cho phép của LCD (RS, RW, E)

44
- Bàn phím 2x3 là tổ hợp các nút nhấn được kết nối với 6 bit thấp của cổng PC.

- Từ đó, chúng em có sơ đồ mô phỏng ghép nối giữa 8086, IC giả mã địa chỉ
74273, LCD 20x4 và bàn phím như sau:

2.3. Lập trình


# Chương trình tính và in ra menu hàng hóa đã chọn tự động với IC lập trình
vào/ra 8255A và LCD, bàn phím.

45
DATA SEGMENT
;Bien de theo doi du lieu tren cac cong
PORTA_VAL DB 0
PORTB_VAL DB 0
PORTC_VAL DB 0

;Chuoi can in
TB1 DB " WELCOME TO$"
TB2 DB " THE COFFEE HOUSE$"

TB3 DB " MENU$"


TB4 DB "1.CA PHE$"
TB5 DB "2.TRA $"
TB6 DB "3.BANH & SNACK$"

TB7 DB " MENU CA PHE$"


TB8 DB "1.BAC SUU-29K$"
TB9 DB "2.CAPPUCINNO-45K$"
TB10 DB "3.CA PHE SUA-29K$"

TB11 DB " MENU TRA$"


TB12 DB "1.TRA DAO-45K$"
TB13 DB "2.TRA OOLONG-45K$"
TB14 DB "3.TRA CHERRY-55K$"

TB15 DB " MENU BANH & SNACK$"


TB16 DB "1.BANH BONG LAN-29K$"
TB17 DB "2.BANH TIRAMISU-29K$"
TB18 DB "3.BANH MATCHA-29K$"

TB19 DB " BAN MUON MUA THEM$"


TB20 DB " KHONG (Y/N)?$"
TB21 DB " THUC DON DA CHON$"

TB22 DB "BAC SUU (29K)$"


TB23 DB "CAPPUCINNO (45K)$"
TB24 DB "CA PHE SUA (29K)$"

TB25 DB "TRA DAO (45K)$"


TB26 DB "TRA OOLONG (45K)$"
TB27 DB "TRA CHERRY (55K)$"

TB28 DB "BANH BONG LAN (29K)$"


TB29 DB "BANH TIRAMISU (29K)$"
TB30 DB "BANH MATCHA (29K)$"

TB31 DB "So tien thanh toan:$"


46
;
cf1 db ?
cf2 db ?
cf3 db ?

tm1 db ?
tm2 db ?
tm3 db ?

bs1 db ?
bs2 db ?
bs3 db ?
;
a dw ?
b dw ?
c dw ?
;
DONG_MAY DB ?
d db ?
;Dia chi cac cong
PORTA EQU 11100001b ;PORTA duoc ket noi tu D7-D0 cua LCD
PORTB EQU 11100011b ;PORTB0 ket noi voi chan RW, PORTB1 la RS,
PORTB2 la EN cua LCD
PORTC EQU 11100101b
PCW EQU 11100111b ;Thanh ghi dieu khien
;Ban phim 3x3
;Cot DB 0D0H, 0B0H, 070H
;Key DB 0DH, 015H, 019H, 0EH, 016H, 01AH
ENDS

STACK SEGMENT
DW 128 DUP(0)
ENDS

CODE SEGMENT
START:
; dat 1 so cac thu tuc:
MOV AX, @DATA
MOV DS, AX ;DS la thanh ghi doan du lieu
MOV ES, AX ;ES la thanh ghi doan du lieu phu

;Cai dat chuc nang cua thanh ghi dieu khien toi cac cong PA, PB, PC
MOV DX, PCW
MOV AL,10001001B ;PA, PB output, PC input
OUT PCW,AL

47
CALL LCD_INIT ; thiet lap ban dau

mov a,0
mov b,0
mov c,0

mov cf1,0
mov cf2,0
mov cf3,0

mov tm1,0
mov tm2,0
mov tm3,0

mov bs1,0
mov bs2,0
mov bs3,0
;MOV DL,1 ;dong 1
;MOV DH,1
;CALL LCD_SET_CUR

;MOV AH,'A'
;CALL LCD_WRITE_CHAR
;MOV AH,'B'
;CALL LCD_WRITE_CHAR
;MOV AH,'C'
;CALL LCD_WRITE_CHAR
;MOV AH,'D'
;CALL LCD_WRITE_CHAR

WELCOME:
MOV DL,2 ;in ra dong 2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB1
CALL LCD_PRINTSTR

MOV DL,3 ; in ra dong 3


MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB2
CALL LCD_PRINTSTR

MOV CX,60000
CALL DELAY

48
MENU_CHINH:
CALL LCD_CLEAR

MOV DL,1
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB3
CALL LCD_PRINTSTR
;
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB4
CALL LCD_PRINTSTR
;
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB5
CALL LCD_PRINTSTR
;
MOV DL,4
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB6
CALL LCD_PRINTSTR
CHON_MON:
CALL KEYPORT

MOV CX,50
CALL DELAY
;POP bx
CMP bl,01H
JE MENU_1
CMP bl,02H
JE MENU_2
CMP bl,03H
JE MENU_3
;CMP AL,26H
;JE QUAY_LAI
JMP CHON_MON
MENU_1:
mov bl,0
IN_MENU_1:
CALL LCD_CLEAR

49
MOV DL,1
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB7
CALL LCD_PRINTSTR
;
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB8
CALL LCD_PRINTSTR
;
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB9
CALL LCD_PRINTSTR
;
MOV DL,4
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB10
CALL LCD_PRINTSTR

MOV CX,30000
CALL DELAY

KIEM_TRA_1:
CALL KEYPORT

MOV CX,50
CALL DELAY

CMP bl,01H
JE MENU_1_1
CMP bl,02H
JE MENU_1_2
CMP bl,03H
JE MENU_1_3
CMP bl,06H
JE QUAY_LAI
JMP KIEM_TRA_1

MENU_1_1:
mov al,0
mov cf1,1
mov ax, 29
50
jmp chung_1
MENU_1_2:
mov al,0
mov cf2,1
mov ax, 45
jmp chung_1
MENU_1_3:
mov al,0
mov cf3,1
mov ax, 29
jmp chung_1

chung_1:
xor ah, ah
add ax, a
mov a, ax

CALL LCD_CLEAR
MOV DL,2 ;in ra dong 2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB19
CALL LCD_PRINTSTR
MOV DL,3 ; in ra dong 3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB20
CALL LCD_PRINTSTR

MOV CX,100
CALL DELAY

KT_YN_1:
CALL KEYPORT

MOV CX,50
CALL DELAY

CMP BL,04H
JE IN_MENU_1
CMP BL,05H
JE tinh_tien
JMP KT_YN_1
tinh_tien:
call tinh_tien_tong
jmp START
51
MENU_2:
mov bl,0
IN_MENU_2:
CALL LCD_CLEAR

MOV DL,1
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB11
CALL LCD_PRINTSTR
;
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB12
CALL LCD_PRINTSTR
;
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB13
CALL LCD_PRINTSTR
;
MOV DL,4
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB14
CALL LCD_PRINTSTR

MOV CX,30000
CALL DELAY

KIEM_TRA_2:
CALL KEYPORT

MOV CX,50
CALL DELAY

CMP BL,01H
JE MENU_2_1
CMP BL,02H
JE MENU_2_2
CMP BL,03H
JE MENU_2_3
CMP BL,06H
JE QUAY_LAI
JMP KIEM_TRA_2
52
MENU_2_1:
mov tm1,1
mov ax, 45
jmp chung_2
MENU_2_2:
mov tm2,1
mov ax, 45
jmp chung_2
MENU_2_3:
mov tm3,1
mov ax, 55
jmp chung_2

chung_2:
xor ah, ah
add ax, b
mov b, ax

CALL LCD_CLEAR
MOV DL,2 ;in ra dong 2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB19
CALL LCD_PRINTSTR
MOV DL,3 ; in ra dong 3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB20
CALL LCD_PRINTSTR

MOV CX,100
CALL DELAY
KT_YN_2:
CALL KEYPORT

MOV CX,50
CALL DELAY

CMP BL,04H
JE IN_MENU_2
CMP BL,05H
JE tinh_tien
JMP KT_YN_2

MENU_3:
53
mov bl,0
IN_MENU_3:
CALL LCD_CLEAR

MOV DL,1
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB15
CALL LCD_PRINTSTR
;
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB16
CALL LCD_PRINTSTR
;
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB17
CALL LCD_PRINTSTR
;
MOV DL,4
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB18
CALL LCD_PRINTSTR

MOV CX,30000
CALL DELAY

KIEM_TRA_3:
CALL KEYPORT

MOV CX,50
CALL DELAY

CMP BL,01H
JE MENU_3_1
CMP BL,02H
JE MENU_3_2
CMP BL,03H
JE MENU_3_3
CMP BL,06H
JE QUAY_LAI
JMP KIEM_TRA_3

54
MENU_3_1:
mov bs1,1
mov ax, 29
jmp chung_2
MENU_3_2:
mov bs2,1
mov ax, 29
jmp chung_2
MENU_3_3:
mov bs3,1
mov ax, 29
jmp chung_2

chung_3:
xor ah, ah
add ax, c
mov c, ax

CALL LCD_CLEAR
MOV DL,2 ;in ra dong 2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB19
CALL LCD_PRINTSTR
MOV DL,3 ; in ra dong 3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB20
CALL LCD_PRINTSTR

MOV CX,100
CALL DELAY
KT_YN_3:
CALL KEYPORT

MOV CX,50
CALL DELAY

CMP BL,04H
JE IN_MENU_2
CMP BL,05H
JE tinh_tien
JMP KT_YN_3

QUAY_LAI:
JMP MENU_CHINH

55
;HLT ; 8086 se dung lai

;ham tre
PROC DELAY
;input: CX dung de dieu khien thoi gian tre. CX=50 chinh la 1ms
;output: none
JCXZ @DELAY_END ;nhay neu noi dung thanh dem rong
@DEL_LOOP:
LOOP @DEL_LOOP
@DELAY_END:
RET
ENDP DELAY

; Khoi tao LCD


PROC LCD_INIT
;thiet lap RS=En=RW=0 --> che do ghi lenh
MOV AL,0
CALL OUT_B
;tre 20ms
MOV CX,1000
CALL DELAY
;Thiet lap lai trinh tu
;MOV AH,30H
;CALL LCD_CMD
;MOV CX,250
;CALL DELAY

;MOV AH,30H
;CALL LCD_CMD
;MOV CX,50
;CALL DELAY

;MOV AH,30H
;CALL LCD_CMD
;MOV CX,500
;CALL DELAY

;Thiet lap chuc nang


MOV AH,38H ;giao tiep 8 bit, hien thi tren ca 4 dong, kich thuoc font 5x7
CALL LCD_CMD

MOV AH,0CH ;bat hien thi va tat con tro


CALL LCD_CMD

MOV AH,01H ;xoa toan bo noi dung tren man hinh LCD
56
CALL LCD_CMD

MOV AH,06H ;tu dong di chuyen con tro den vi tri tiep theo moi khi xuat ra
LCD 1 ki tu
CALL LCD_CMD

RET
ENDP LCD_INIT

;gui lenh toi LCD


PROC LCD_CMD
;input: AH = ma lenh
;output: none

;luu lai thiet lap


PUSH DX
PUSH AX
;thiet lap rs=0 --> ghi lenh
MOV AL,PORTB_VAL
AND AL,0FCH ;En-RS-RW
CALL OUT_B
;thiet lap lenh ra tren chan.
MOV AL,AH ; tuy theo AH ma LCD se xu ly theo lenh
CALL OUT_A
;Sau do cho En tu 1-->0 de cho phep doc/ghi
;En=1
MOV AL,PORTB_VAL
OR AL,100B ;En-RS-RW
CALL OUT_B
;delay 1ms
MOV CX,50
CALL DELAY
;En=0
MOV AL,PORTB_VAL
AND AL,0FBH ;En-RS-RW
CALL OUT_B
;delay 1ms
MOV CX,50
CALL DELAY
;Lay lai thanh ghi
POP AX ; lay du lieu cac thanh ghi ra
POP DX
RET
ENDP LCD_CMD
57
;ctc xoa toan bo noi dung tren man hinh LCD
PROC LCD_CLEAR
MOV AH,1
CALL LCD_CMD
RET
ENDP LCD_CLEAR

;Ghi tung ki tu 1
PROC LCD_WRITE_CHAR
;input: AH
;output: none

;cat thanh ghi


PUSH AX
;set RS=1 --> ghi du lieu
MOV AL,PORTB_VAL
OR AL,10B ;EN-RS-RW
CALL OUT_B
;set du lieu dau ra
MOV AL,AH ;tuy theo AH bang bao nhieu
CALL OUT_A
;set En=1
MOV AL,PORTB_VAL
OR AL,100B ;EN-RS-RW
CALL OUT_B
;delay 1ms
MOV CX,50
CALL DELAY
;set En=0
MOV AL,PORTB_VAL
AND AL,0FBH ;EN-RS-RW
CALL OUT_B
;return
POP AX
RET
ENDP LCD_WRITE_CHAR

;in ra chuoi ki tu tai vi tri da dat tai LCD_set_cur


58
PROC LCD_PRINTSTR
;input: SI=dia chi cua chuoi, Si se tu ket thuc khi xuat hien ki tu '$'
;output: none

;cat cac thanh ghi


PUSH SI;cat thanh ghi con tro nguon
PUSH AX
;doc va ghi du lieu
@LCD_PRINTSTR_LT:
LODSB ;Nap vao AL/AX 1 phan tu cua chuoi
CMP AL,'$'
JE @LCD_PRINTSTR_EXIT
MOV AH,AL
CALL LCD_WRITE_CHAR
JMP @LCD_PRINTSTR_LT

;return
@LCD_PRINTSTR_EXIT:
POP AX
POP SI
RET
ENDP LCD_PRINTSTR

;thiet lap hang


PROC LCD_SET_CUR
;input: DL=hang, DH=Cot
; DL = 1, in ra hang 1
; DL = 2, in ra hang 2
; DH = 1-8, cot 1 tuong ung voi 1
;output: none

;cat thanh ghi


PUSH AX
;LCD se su dung dia chi cot bat dau tu 0
DEC DH ;tang DH len 1
;Lua chon hang
CMP DL,1
JE @ROW1
CMP DL,2
JE @ROW2
CMP DL,3
JE @ROW3
CMP DL,4
JE @ROW4
59
JMP @LCD_SET_CUR_END

;DL==1
@ROW1:
MOV AH,80H ; di chuyen dong 1
JMP @LCD_SET_CUR_ENDCASE

;DL==2
@ROW2:
MOV AH,0C0H ;di chuyen xuong con dong 2
JMP @LCD_SET_CUR_ENDCASE
;DL==3
@ROW3:
MOV AH,94H ; di chuyen dong 3
JMP @LCD_SET_CUR_ENDCASE

;DL==4
@ROW4:
MOV AH,0D4H ;di chuyen xuong con dong 4
JMP @LCD_SET_CUR_ENDCASE
;
@LCD_SET_CUR_ENDCASE:
ADD AH,DH
CALL LCD_CMD

;exit from procedure


@LCD_SET_CUR_END:
POP AX
RET
ENDP LCD_SET_CUR

;set Output ra
PROC OUT_A
;input: AL
;output: PORTA_VAL
PUSH DX
MOV DX,PORTA
OUT DX,AL
MOV PORTA_VAL,AL
POP DX
RET
ENDP OUT_A

PROC OUT_B
;input: AL
60
;output: PORTB_VAL
PUSH DX
MOV DX,PORTB
OUT DX,AL
MOV PORTB_VAL,AL
POP DX
RET
ENDP OUT_B

;Ban Phim 3x3


KEYPORT proc
QUET_COT:
mov al, 00000000b
out PORTA, al

in al,PORTC
test al,00000001b
je phim_1
test al,00000010b
je phim_2
test al,00000100b
je phim_3
test al,00001000b
je phim_4
test al,00010000b
je phim_5
test al,00100000b
je phim_6

jmp QUET_COT

phim_1:
mov bl, 01H
;xor bh,bh
;PUSH bx
RET
phim_2:
mov bl, 02H
;xor bh,bh
;PUSH bx
RET
;
phim_3:
mov bl, 03H
;xor bh,bh
;PUSH bx
RET
61
phim_4:
mov bl, 04H
;xor bh,bh
;PUSH bx
RET
;
phim_5:
mov bl, 05H
;xor bh,bh
;PUSH bx
RET
phim_6:
mov bl, 06H
;xor bh,bh
;PUSH bx
RET

KEYPORT endp

;tinh tien tong


tinh_tien_tong proc

CALL LCD_CLEAR
MOV DL,1
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB21
CALL LCD_PRINTSTR

MOV CX,100
CALL DELAY

;jmp menu_da_chon
menu_da_chon:
cmp cf1,1
je menu_11
cmp cf2,1
je menu_12
cmp cf3,1
je menu_13

cmp tm1,1
je menu_21
cmp tm2,1
je menu_22
cmp tm3,1
je menu_23
62
cmp bs1,1
je menu_31
cmp bs2,1
je menu_32
cmp bs3,1
je menu_33

jmp cam_on
;
menu_11:
mov cf1,0
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB22
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
menu_12:
mov cf2,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB23
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
menu_13:
mov cf3,0
;CMP DONG_MAY ,1
;JE IN_13_DONG_4
MOV DL,2
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB24
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
63
;
menu_21:
mov tm1,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB25
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
menu_22:
mov tm2,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB26
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
menu_23:
mov tm3,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,3
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB27
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon

;
menu_31:
mov bs1,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,4
64
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB28
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
menu_32:
mov bs2,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,4
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB29
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon
menu_33:
mov bs3,0
;CMP DONG_MAY ,1
;JE IN_12_DONG_4
MOV DL,4
MOV DH,1
CALL LCD_SET_CUR
LEA SI,TB30
CALL LCD_PRINTSTR
MOV CX,100
CALL DELAY
;MOV DONG_MAY, 1
jmp menu_da_chon

cam_on:
CALL KEYPORT
MOV CX,50
CALL DELAY
CMP BL,06H
JE tra_ve
jmp cam_on
tra_ve:
RET

65
tinh_tien_tong endp

CODE ENDS
END START
2.4. Kết quả
- Sau quá trình viết, mô phỏng và kiểm tra, chương trình của chúng em đã hoạt
động tốt và chính xác. Tuy nhiên, do sự giới hạn của số dòng, số kí tự hiển thị
trên LCD 20x4 nên chúng em không hiển thị được nhiều hàng hóa và in ra
được số lần lặp lại của một hàng hóa như ở chương trình mô phỏng trên EMU
8086.
- Sau đây là một số hình ảnh mô phỏng:

66
67
68
69

You might also like