Professional Documents
Culture Documents
ĐỒ Á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
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:
- 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.
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 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 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
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): $"
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
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
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
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
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
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
- 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:
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$"
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 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
;MOV AH,30H
;CALL LCD_CMD
;MOV CX,50
;CALL DELAY
;MOV AH,30H
;CALL LCD_CMD
;MOV CX,500
;CALL DELAY
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
;Ghi tung ki tu 1
PROC LCD_WRITE_CHAR
;input: AH
;output: none
;return
@LCD_PRINTSTR_EXIT:
POP AX
POP SI
RET
ENDP LCD_PRINTSTR
;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
;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
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
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