Professional Documents
Culture Documents
Ngày nay với sự tiến bộ của khoa học kỹ thuật cộng với sự phát triển mạnh mẽ
của công cụ máy tính. Đã thay đổi phương thức sản suất đi theo một chiều hướng
mới đó là thời kỳ mà các dây chuyền, các máy sản xuất đã chuyển sang bán tự
động hoặc tự động hoá hoàn toàn.
Đối với các thiết bị tự động thì các chip vi điều khiển, các bộ vi xử lí trung
tâm đóng vai trò hết sức quan trọng là đầu não điều khiển mọi hoạt động của thiết
bị. Tuy nhiên với những thiết bị không đòi hỏi độ phức tạp trong xữ lí cao thì các
chip VĐK như họ 8051, PIC sử dụng rất tiện lợi, giá thành thấp.
Với mục đích của đồ án VĐK là nhằm giúp sinh viên làm quen, n ắm được
cách thức điều khiển một thiết bị thực tế bằng vi điều khiển. Em chọn chíp VĐK
89C51 cho đề tài của mình là: “Máy tính cộng trừ nhân chia hiển thị LCD”
Qua một thời gian tìm hiểu, thiết kế với sự cố gắng của bản thân và đặc biệt
là sự hướng dẩn của thầy Lê Xứng và các thầy giáo trong bộ môn đến nay em đã
hoàn thành đồ án VĐK này.
Em rất chân thành cảm ơn các thầy cô!
Đà Nẵng, ngày 12 tháng 6 năm 2009
Sinh viên thực hiện
Hoàng phi long
MỤC LỤC
Chương I
GIỚI THIỆU ĐỀ TÀI
Sơ đồ chương trình:
Đợi
ấn phím
No push
xử lý
Đọc phím
kết quả
Display
CHƯƠNG II:
GIỚI THIỆU VỀ VI ĐIỀU KHIỂN
VÀ CÁC LINH KIỆN LIÊN QUAN
A.GIỚI THIỆU VỀ HỌ VI ĐIỀU KHIỂN 89C51:
2.1.Giới thiệu chung
Bộ vi điều khiển viết tắt là Micro-controller, là mạch tích hợp trên một chip có thể
lập trình được, dùng để điều khiển hoạt động của một hệ thống. Theo các tập lệnh
của người lập trình, bộ vi điều khiển tiến hành đọc, lưu trữ thông tin, xử lý thông
tin, đo thời gian và tiến hành đóng mở một cơ cấu nào đó.
Trong các thiếh bị điện và điện và điện tử dân dụng, các bộ vi điều khiển, điều
khiển hoạt động của TV, máy giặt, đầu đọc laser, điện thọai, lò vi-ba … Trong hệ
thống sản xuất tự động, bộ vi điều khiển được sử dụng trong Robot, dây chuy ền tự
động. Các hệ thống càng "thông minh" thì vai trò c ủa hệ vi điều khiển càng quan
trọng.
2.2. Lịch sử phát triển của vi điều khiển
Bộ vi điều khiển thực ra, là một loại vi xử lí trong tập hợp các bộ vi xử lý nói
chung. Bộ vi điều khiển được phát triển từ bộ vi xử lí, từ những năm 70 do sự phát
triển và hoàn thiện về công nghệ vi điện tử dựa trên kỹ thuật MOS (Metal-Oxide-
Semiconductor) , mức độ tích hợp của các linh kiện bán dẫn trong một chip ngày
càng cao.
Năm 1971 xuất hiện bộ vi xử lí 4 bit loại TMS1000 do công ty texas Instruments
vừa là nơi phát minh vừa là nhà sản xuất. Nhìn tổng thể thì bộ vi xử lí chỉ có chứa
trên một chip những chức năng cần thiết để xử lí chương trình theo một trình tự,
còn tất cả bộ phận phụ trợ khác cần thiết như : bộ nhớ dữ liệu , bộ nhớ chương
trình , bộ chuển đổi AID, khối điều khiển, khối hiển thị, điều khiển máy in, hối
đồng hồ và lịch là những linh kiện nằm ở bên ngoài được nối vào bộ vi xử lí.
Mãi đến năm 1976 công ty INTEL (Interlligen -Elictronics). Mới cho ra đời bộ vi
điều khiển đơn chip đầu tiên trên thế giới với tên gọi 8048. Bên cạnh bộ xử lí trung
tâm 8048 còn chứa bộ nhớ dữ liệu, bộ nhớ chương trình, bộ đếm và phát thời gian
các cổng vào và ra Digital trên một chip.
Các công ty khác cũng lần lược cho ra đời các bộ vi điều khiển 8bit tương tự như
8048 và hình thành họ vi điều khiển MCS-48 (Microcontroller-sustem-48).
Đến năm 1980 công ty INTEL cho ra đ ời thế hệ thứ hai của bộ vi điều khiển đơn
chip với tên gọi 8051. Và sau đó hàng lo ạt các vi điều khiển cùng loại với 8051 ra
đời và hình thành họ vi điều khiển MCS-51 .
Đến nay họ vi điều khiển 8 bit MCS51 đã có đến 250 thành viên và hầu hết các
công ty hàng đầu thế giới chế tạo. Đứng đầu là công ty INTEL và rất nhiều công ty
khác như : AMD, SIEMENS, PHILIPS, DALLAS, OKI …
Ngoài ra còn có các công ty khác c ũng có những họ vi điều khiển riêng như:
Họ 68HCOS của công ty Motorola
Họ ST62 của công ty SGS-THOMSON
Họ H8 của công ty Hitachi
Họ pic cuả công ty Microchip
2.3 Khảo sát vi điều khiển 8051
IC vi điều khiển 8051/8031 thuộc họ MCS51 có các đặt điểm sau :
- 4kbyte ROM (được lập trình bởi nhà sản xuất chỉ có ở 8051)
- 128 byte RAM
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 4
ĐỒ ÁN VI ĐIỀU KHIỂN
- 4port I10 8bit
- Hai bộ định thời 16bit
- Giao tiếp nối tiếp
- 64KB không gian bộ nhớ chương trình mở rộng
- 64 KB không gian bộ nhớ dữ liệu mở rộng
- một bộ xử lí luận lí (thao tác trên các bit đơn)
- 210 bit được địa chỉ hóa
- bộ nhân / chia 4 s
CPU
Bus dæî liãûu, âëa chè, âiãöu khiãøn
RAM ROM
U1
40
VCC 1 39
VCC
2 P1.0 P0.0/AD0 38 Address &
3 P1.1 P0.1/AD1 37 Data Bus
4 P1.2 P0.2/AD2 36
R2 C3 5 P1.3 P0.3/AD3 35
6 P1.4 P0.4/AD4 34
100 10u 7 P1.5 P0.5/AD5 33
SW1 8 P1.6 P0.6/AD6 32
9 P1.7 P0.7/AD7
RST 31
SW R1 10u C1 19 EA/VPP
XTAL1 30 74573
10K 12Mz ALE/PROG
29 7408
10u C2 18 PSEN
10 XTAL2 28
11 P3.0/RXD P2.7/A15 27
Max232 12 P3.1/TXD P2.6/A14 26
13 P3.2/INTO P2.5/A13 25 Address Bus
14 P3.3/INT1 P2.4/A12 24
15 P3.4/TO P2.3/A11 23
8255 & Ram 16 P3.5/T1 P2.2/A10 22
GND
AT89C51
a.Port0 : là port có 2 chức năng ở trên chân từ 32 đến 39 trong các thiết kế cỡ nhỏ
( không dùng bộ nhớ mở rộng ) có hai chức năng như các đường IO. Đối với các
thiết kế cỡ lớn ( với bộ nhớ mở rộng ) nó được kết hợp kênh giữ a các bus )
b.Port1 : port1 là một port I/O trên các chân 1-8. Các chân được ký hiệu P1.0,
P1.1, P1.2 … có thể dùng cho các thiết bị ngoài nếu cần. Port1 không có chức
năng khác, vì vậy chúng ta chỉ được dùng trong giao tiếp với các thiết bị ngoài.
c.Port2 : port2 là một port công dụng kép trên các chân 21 - 28 được dùng như các
đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ
mở rộng.
d.Port3 : port3 là một port công dụng kép trên các chân 10 - 17. Các chân của port
này có nhiều chức năng, các công dụng chuyển đổi có liên hệ với các đặc tín đặc
biệt của 8051 / 8031 như ở bảng sau :
i.Chân XTAL:
SFR MỤC ĐÍCH ĐỊA CHỈ Địa chỉ hóa từng bít
TCON Điều khiển timer 88H có
TMOD Chế độ timer 89H không
TL0 Byte thấp của timer 0 8AH không
TL1 Byte thấp của timer 1 8BH không
TH0 Byte cao của timer 0 8CH không
TH1 Byte cao của timer 1 8DH không
Bảng 2.2: Thanh ghi chức năng đặc biệt dùng timer.
2.3.3.2. Thanh ghi chế độ timer (TMOD)
Thanh ghi TMOD chứa hai nhóm 4 bit dùng để đặt chế độ làm việc cho timer 0 và
timer 1.
+TF1: (địa chỉ 8Fh) cờ tràn bộ định thời 1. Được set bởi phần cứng khi bộ
định thời/ đếm bị tràn, được xoá bởi phần mềm hoặc bởi phần cứng khi trình phục
vụ ngắt được trỏ đến.
+TR1:(địa chỉ byte8Eh) bit điều khiển bộ định thời 1 hoạt động. Được set/
xoá bởi phần mềm để điều khiển bộ định thời hoạt động hoặc ngưng hoạt động.
+TF0(địa chỉ byte8Dh) cờ tràn của bộ định thời 0.
+TR0(địa chỉ byte8C) bit điều khiển bộ định thời 0 hoạt động.
+IE1:( địa chỉ byte8Bh) cờ ngắt ngoài 1 tác động cạnh. Được set bởi phần
cứng khi phát hiện có ngắt ngoài 1 tác động cạnh; được xoá bởi phần cứng khi
ngắt được xử lý.
+IT1(địa chỉ byte8Ah)bít điều khiển chọn loại ngắt. Được set/ xoá để xác
định ngắt ngoài thuộc loại tác động cạnh xuống hay tác động mức thấp.
+IE0(địa chỉ byte89h) cờ ngắt ngoài 0 tác động cạnh.
+IT0(địa chỉ byte88h)bit điều khiển chọn loại ngắt (kích khởi cạnh hoặc
mức).
THx(8 bit)
MAIN MAIN
7 6 5 4 3 2 1 0
- - - PS PT1 PX1 PT0 PX0
7 6 5 4 3 2 1 0
TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
+Tuỳ theo các tình huốn cụ thể mà ta cho chương trình đi theo một
chiều hướng mong muốn.
B.GIỚI THIỆU CÁC LINH KIỆN LIÊN QUAN ĐẾN MẠCH THIẾT KẾ:
a)Điện trở: đây là loại linh kiện thụ động nó được sử dụng với mục đích chính là
hạn dòng, hay phân áp cho c ác linh kiện khác có thể hoạt động bình thường.
+Các điện trở thường có giá trị được các nhà sản xuất qui định bởi màu sơn
ghi trên nó :
Các giá trị điện trở như sau:10kΩ,330Ω,4,7kΩ,1,2kΩ,270Ω…
b)Biến trở : là loại linh kiện điện trở mà giá trị của nó có thể thay đổi được một
cách dễ dàng. Hình dạng của nó củng có nhiều loại thường là có 3 chân ở trong
mạch này em sử dụng loại vi trở điều chỉnh được bằng nút vặn.
+Giá trị của biến trở có trong mạch là 10k.
c)Tụ điện: Sử dụng để lọc nguồn hay lọc tần số, chống nhiễu .
+Thường ta sử dụng các loại tụ sau : tụ sứ, tụ hoá
Giá trị tụ : ,2200µF,470 µF, 10 µF(tụ hóa);104,33pF(tụ sứ)
d) IC ổn áp :LM7805:
LM7805/TO
1 3
GND
VIN VOUT
2
+Photo diode:
D1
LCD được nói trong mục này có 14 chân, chức năng của các chân được cho
trong bảng 12.1. Vị trí của các chân được mô tả trên hình 12.1 cho nhiều LCD
khác nhau.
1. Chân VCC, VS S và VE E : Các chân VCC, VS S và VE E : Cấp dương nguồn - 5v
và đất tương ứng thì VEE được dùng để điều khiển độ tương phản của LCD.
2. Chân chọn thanh ghi RS (Register Select).
Có hai thanh ghi rất quan trọng bên trong LCD, chân RS được dùng để chọn các
thanh ghi này như sau: Nếu RS = 0 thì thanh ghi mà lệnh được chọn để cho phép
người dùng gửi một lệnh chẳng hạn như xoá màn hình, đưa con trỏ về đầu
dòng v.v… Nếu RS = 1 thì thanh ghi dữ liệu được chọn cho phép người dùng
gửi dữ liệu cần hiển thị trên LCD.
3. Chân đọc/ ghi (R/W).
Đầu vào đọc/ ghi cho phép người dùng ghi thông tin lên LCD khi R/W = 0
hoặc đọc thông tin từ nó khi R/W = 1.
4. Chân cho phép E (Enable).
Chân cho phép E được sử dụng bởi LCD để chốt thông tin hiện hữu trên chân dữ
liệu của nó. Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức cao xuống
thấp phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liêu. Xung
này phải rộng tối thiểu là 450ns.
5. Chân D0 - D7.
Đây là 8 chân dữ liệu 8 bít, được dùng để gửi thông tin lên LCD hoặc đọc nội
dung của các thanh ghi trong LCD.
Để hiển thị các chữ cái và các con số, chúng ta gửi các mã ASCII của các chữ
cái từ A đến Z, a đến f và các con số từ 0 - 9 đến các chân này khi bật RS = 1.
Cũng có các mã lệnh mà có thể được gửi đến LCD để xoá màn hình hoặc đưa con
trỏ về đầu dòng hoặc nhấp nháy con trỏ. Bảng 12.2 liệt kê các mã lênh.
Chúng ta cũng sử dụng RS = 0 để kiểm tra bít cờ bận để xem LCD có sẵn
sàng nhân thông tin. Cờ bận là D7 và có thể được đọc khi R/W = 1 và RS = 0
như sau:
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 15
ĐỒ ÁN VI ĐIỀU KHIỂN
Nếu R/W = 1, RS = 0 khi D7 = 1 (cờ bận 1) thì LCD bận bởi các công việc bên
trong và sẽ không nhận bất kỳ thông tin mới nào. Khi D7 = 0 thì LCD sẵn sàng
nhận thông tin mới. Lưu ý chúng ta nên kiểm tra cờ bận trước khi ghi bất kỳ dữ
liệu nào lên LCD.
Bảng 12.1 .Mô tả các chân của LCD
1 Vss - Đất
2 VCC - Dương nguồn 5V
3 VEE - Cấp nguồn điều khiển phản
RS=0 chọn thanh ghi
4 RS I
lệnh.RS=1 chọn thanh dữ liệu
5 Rw I RW=1 đọc dữ liệu.RW=1 ghi
6 E I/O Cho phép
7 DB0 I/O Các bít dữ liệu
8 DB1 I/O Các bít dữ liệu
9 DB2 I/O Các bít dữ liệu
10 DB3 I/O Các bít dữ liệu
11 DB4 I/O Các bít dữ liệu
12 DB5 I/O Các bít dữ liệu
13 DB6 I/O Các bít dữ liệu
14 DB7 I/O Các bít dữ liệu
Ở dạng đơn giản,bàn phím được tổ chức theo kiểu ma trận các h àng và các
cột.CPU truy cập cả hàng lẫn cột thông qua các cổng.Do vậy,với hai cổng 8 bít th ì
có thể nối một bàn phím 64 phím(8x8) tới bộ vi xử lý. Khi một phím đ ược nhấn
thì một hàng và một cột được tiếp xúc,các hàng và cột còn lại không có sự tiếp xúc
nào .Trong các bàn phím máy tính IBM PC có m ột bộ vi điều khiển(bao gồm một
bộ vi xử lý,bộ nhớ RAM,EPROM và một số cổng tất cả được bố trí trên một
chíp)Chịu trách nhiệm nối ghép phần cứng v à phần mền của bàn phím.Ở những hệ
như vậy,chương trình được lưu trong EPROM của bộ vi điều khiển đảm nhiệm
quét liên tục các phím,xác định xem phím n ào đã được kích hoạt và gủi thông tin
đến bo mạch chính.Trong phần n ày,chúng ta nghiên cứu về cơ cấu 8051 quét và
xác định phím nhấn.
Quét và xác định phím
Nếu không có phím nào được nhấn thì đọc cổng vào sẽ được toàn là 1 vì tất cả các
cột đều được nối tới nguồn Vcc.Nếu tất cả các hàng được nối đất và một phím
được nhấn thì một trong các cột sẽ có giá trị 0 v ì phím được nhấn nối cột xuống
đât.Chức năng của bộ vi điều khiển l à quét liên tục để phát hiện và xác định phím
được nhấn.
Để phát hiện phím nhấn bộ vi xử lý nối tất cả các h àng bằng cách đặt giá trị 0 lên
các chốt ra,sau đó đọc các cột.Nếu dữ liệu đọc đ ược ở các cột có giá trị 1111 tức là
không có phím nào được nhấn và quá trình cứ tiếp tục cho đến khi phát hiện ra
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 17
ĐỒ ÁN VI ĐIỀU KHIỂN
phím được nhấn.Nếu một trong các bít của cột có giá trị bằng 0,điều đó xác nhận
có phím được nhấn.Sau khi một phím nhấn đ ã được phát hiện,bộ vi xử lý sẽ
chuyển qua quá trình xác định phím nhấn đó.Bắt đầu từ h àng trên,sau đó nó tiến
hành đọc các cột.Nếu dữ liệu đọc được có giá trị toàn là 1 tức là không phím nào ở
hàng này được kích hoạt cả thì quá trình sẽ chuyển sang hàng tiếp theo.Bộ vi xử lý
lại nối đất hàng tiếp theo,đọc giá trị ở các cột v à kiểm tra xem có giá trị nào bằng
0 không.Quá trình này tiếp tục cho đến khi có h àng được xác định.Sau khi xác
định xong hàng có phím nhấn nhiệm vụ tiếp theo l à tìm xem cột nào có phím
nhấn.Việc này cũng khá đơn giản vì CPU biết được bất cứ thời điểm nào hàng nào
và cột nào được truy cập.
Chương trình thực hiện qua 4 giai đoạn chính nh ư sau:
1.Để bảo đảm rằng phím nhấn tr ước đó đã được nhả ra,các giá trị 0 cùng một lúc
áp đến tất các hàng,và tiến hành đọc nhiều lần giá trị các cột cho đến khi tất cả các
cột có giá trị cao.Khi tất cả các cột đ ã có giá trị cao ,chương trình sẽ đợi trong một
lúc trước khi chuyển sang bước tiếp theo là một phím được nhấn.
2.Để kiểm tra xem có phím n ào được nhấn,các cột được quét theo một chu trình
lặp cho đến khi một trong các cột có giá trị 0.Cần nhớ rằng các chốt lối có nghĩa l à
chúng được nối đất.Sau khi phát hiện được phím nhấn,chương trình sẽ chờ thêm
20ms rồi mới quét các cột một lần nữa .L àm như vậy với 2 mục đích (a) bảo đảm
việc phát hiện ra phím nhấn không phải do lỗi xung nhiễu gây ra v à (b) trễ 20ms
ngăn ngừa việc coi phím đó được nhiễu nhiều lần.Nếu sau khi giữ phím chậm
20ms phím đó vẫn cồn bị nhấn thì chương trình sẽ chuyển sang bước tiếp theo là
xác định đó thuộc về hàng nào,hay nói cách khác chương tr ình trở về vòng lặp để
xác định phím được nhấn thực sự.
3. Để phát hiện phím nhấn thuộc về h àng nào,cần nối đất từng hàng một và mỗi
lần như vậy phải đọc giá trị các cột.Nếu tất cả các cột đều ở mức cao có nghĩa l à
phím được nhấn không thuộc hàng đó,vì vậy cần nối đất hàng tiếp theo và cứ thế
tiếp tục cho đến khi tìm được hàng có phím được nhấn.Khi tìm ra hàng có phím
nhấn có nghĩa chúng ta có đ ược thông tin cần thiết để xác định vị trí phím thông
qua việc đối chiếu bảng chứa mã quét bàn phím.
4.Để xác định nhấn cần quay từng bít cột v ào cờ nhớ và kiểm tra xem liệu có giá
trị thấp hay không.Khi tìm thấy giá trị 0,có nghĩa là đã xác định được mã quét cho
phím nhấn,nếu không thì con trỏ sẽ tiếp tục tăng thêm 1 để trỏ đến phần tử tiếp
theo của bảng mã quét.
Bắt đầu
1
Nối đất tất cả các hàng Nối đất hàng tiếp theo
Phím hàng
nay được
Tất cả các
cột dc nhấn
Trở về
Có phím
nhấn
Có phím
nhấn
Chương III :
THIẾT KẾ MẠCH & CHƯƠNG TRÌNH
Sơ đồ mạch thiết kế:
Push button
Push button
Note
Action Process
Bắt đầu
Đợi xử lý
Nu op
mb
KTra Phím
Nhập vào
kết quả
hiển thị số
kết thúc
Quét phím
i=1
i<=10
P1=~i Thoát
Chon i
i=1
i=2
P1.4=0
i=4
P1.5=0
P1.6=0
i=8
Kết thúc
Đợi ấn “=”
KT phép toán
Phép +
phép-
Kq=a1+b1 Phép *
a1>b1 Phép /
Kq=a1*b1
Kq=a1-b1 Kq2=-
Kq1=(b1-b2)
Kq=a1/b1;
Kq5= *
Kq3=((a1%b1)*1000)/b1
char bien;
int k = 0;
char a,op,b,kq,kq2,kq5,buffer;
int a1,op1,b1,kq1,kq4,kq3,er;
int st1,phep = 0;
void main()
{
initialize();
clear(); // Clear Lcd.
outputstring("WELCOME... " );
delay_ms(1000);
lcd_command(0x01);
lcd_command(0x06);
outputstring(" DO AN VDKHIEN " );
lcd_command(0xCE);
lcd_command(0x07);
outputstring("HOANG PHI LONG 05CDT1");
while(1)
{
buffer = getkey();
while('\0' != buffer)
{
if(( buffer >= 48)&&(buffer <= 57))
{
if(st1==0)
{
a1 = (a1*10) + change_char_int(buffer);
display_number(change_char_int(buffer) ;
}
else
{
b1 = (b1*10) +change_char_int(buffer);
display_number(change_char_int(buffer)) ;
}
break;
}
case 45:
{
phep = 2;
st1 = 1;
display_op();
}
break;
case 42:
{
phep = 3;
st1 = 1;
display_op();
}
break;
case 47:
{
phep = 4;
st1 = 1;
display_op();
}
break;
default:
st1 = 0;
break;
break;
}
if(61 == buffer)
{
display_result();
delay_ms(3200);
clear();
kq2='\0';
kq3= 0;
kq5 ='\0';
kq1 = 0;
er = 0;
st1 = 0;
a1=b1=0;
break;
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 27
ĐỒ ÁN VI ĐIỀU KHIỂN
}
// display
}
void display_op()
{
if(phep == 1)
{
outputkey('+');
}
else if(phep == 2)
{
outputkey('-');
}
else if(phep == 3)
{
outputkey('*');
}
else if(phep == 4)
{
outputkey('/');
}
else
outputkey('\0');
void display_result()
{
if(phep == 1)
{
kq1 = a1 + b1;
}
if(phep == 2)
{
if(a1 > b1)
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 28
ĐỒ ÁN VI ĐIỀU KHIỂN
kq1 = a1 - b1;
else
{
kq2 = '-';
kq1 = b1 - a1;
}
}
if(phep == 3)
{
kq1 = a1 * b1;
if(phep == 4)
{
if(0 == b1)
{
kq5 = '\0';
er = 1;
}
else
{
kq1 = a1/b1;
kq5 = '.';
kq3 = ((a1%b1)*1000)/b1;
}
if(1 == er)
{
lcd_command(0x01);
lcd_command(0xC0);
outputstring(" ERROR " );
delay_ms(1000);
lcd_command(0x01);
}
if (kq3!=0)
{
lcd_command(0xC0);
convert_int_char(kq1);
outputkey(kq5);
convert_int_char(kq3);
}
lcd_command(0xC0);
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 29
ĐỒ ÁN VI ĐIỀU KHIỂN
outputkey(kq2);
convert_int_char(kq1);
// outputkey(' ');
void initialize()
{
bien = 0x0E;
lcd_command(bien);
lcd_check_busy();
DATA = a;
RS = 0;
RW = 0;
E = 1;
E = 0;
}
void lcd_check_busy()
{
P2_7 = 1;
RS = 0;
RW = 1;
while(1){
E=0;//cho nay la cho sai cua cac chuong trinh khac
E=1;// cu tuong la giong nhu xuat du lieu la e=1 sau do e=0
delay_ms(80);
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 30
ĐỒ ÁN VI ĐIỀU KHIỂN
if(P2_7==0) break;
}
lcd_check_busy();
DATA = a;
RW = 0;
RS = 1;
E = 1;
E = 0;
void clear()
{
bien = 0x01;
lcd_command(bien);
}
for(i=0x01;i<0x10;i<<= 1)
{
delay_ms(100);
if(k==16) lcd_command(0xc0);//neu go chu qua 16 ky tu thi se
xuong hang
if(k==32) {k=0;// neu go het hang thu 2 thi se xoa man hinh va bat
dau tu hang thu nhat
lcd_command(0x01);
lcd_command(0x06);
lcd_command(0x80);
}
P1=~i;
switch(i)
{
case 1:
{
if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '1';
}
if(P1_5==0)
{
k++;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
return '2';
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 32
ĐỒ ÁN VI ĐIỀU KHIỂN
if(P1_6==0)
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}
return '3';
}
if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '+';
}
}
break;
case 2:
{
if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '4';
}
if(P1_5==0)
{
k++;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
return '5';
}
if(P1_6==0)
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 33
ĐỒ ÁN VI ĐIỀU KHIỂN
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}
return '6';
}
if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '-';
}
}
break;
case 4 :
{
if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '7';
}
if(P1_5==0)
{
k++;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
return '8';
}
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 34
ĐỒ ÁN VI ĐIỀU KHIỂN
if(P1_6==0)
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}
return '9';
}
if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '*';
}
}
break;
case 8 :
{
if(P1_4==0)
{
k++;
delay_ms(15);
while(0 == P1_4)
{
delay_ms(5) ;
}
return '0';
}
if(P1_5==0)
{
k=0;
delay_ms(15);
while(0 == P1_5)
{
delay_ms(5) ;
}
lcd_command(0x01);
k=0;
return '\0';
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 35
ĐỒ ÁN VI ĐIỀU KHIỂN
}
if(P1_6==0)
{
k++;
delay_ms(15);
while(0 == P1_6)
{
delay_ms(5) ;
}
return '=';
}
if(P1_7==0)
{
k++;
delay_ms(15);
while(0 == P1_7)
{
delay_ms(5);
}
return '/';
}
}
break;
default:
break;
}
}
return '\0';
}
int change_char_int(char a)
{
switch (a)
{
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case '+': return 10;
case '-': return 11;
case '*': return 12;
SVTH : HOÀNG PHI LONG-LỚP 05CDT1 TRANG 36
ĐỒ ÁN VI ĐIỀU KHIỂN
case '/': return 13;
case '=': return 14;
default:
return -1;
}
}
void convert_int_char(int kq)
{
int i,dem;
i = 1;
while(0!=kq)
{
while(i<=kq)
{
i = i*10;
i = i / 10;
while(i != 1)
{
dem = kq / i;
lcd_write(dem + 48);
kq %=i;
i /=10;
}
break;
}
kq = kq/i;
lcd_write(kq + 48);