CALCULATOR
MICROPROCESSOR 8951
DIGITAL TECHNOLOGY
DIGITAL TECHNOLOGY
UNIVERSITY OF TRANSPORT IN HOCHIMINH CITY
TD06-NHÓM VI-ĐỀ TÀI 12
CALCULATOR
C1
GROUP VI - TD06 - HCMUTRANS
LCD1
LM020L
X1
D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14
RS
RW
E
RS
RW
E
0
1
2
3
4
5
6
7
VSS
VDD
VEE
1
2
3
B
8
9
CLR
CLR
C
4
5
6
7
D
0
1
2
3
ON/C
4
3
ALL
p1.3
AT89C51
p1.0
10k
10
11
12
13
14
15
16
17
=
p1.2
R1
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
+
A
2
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
VCC
p1.1
Reset
1
2
3
4
5
6
7
8
GND
1
C3
PSEN
ALE
EA
21
22
23
24
25
26
27
28
GROUP6-TD06-HCMUTRANS
p1.7
10uF
p1.7 p1.5
p1.4 p1.2p1.0
p1.6 p1.3 p1.1
29
30
31
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
10k
p1.6
RST
VCC
RV1
39
38
37
36
35
34
33
32
p1.5
9
XTAL2
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
p1.4
18
30p
XTAL1
7 6 5 4 32 1 0
19
4
5
6
U1
FREQ=12MHz
RSRW
E
C2
CRYSTAL
81%
30p
CALCULATOR
CALCUL
Y OF TRANSPORT I N HOCHI MI
ALCUL
Y
GVHD: HOÀNG XUÂN DƯƠNG
THỰC HIỆN: NHÓM VI
- Nguyễn Công Long
- Lê Văn Tình
- Hoàng Ngọc Ninh
-Trần Võ Ngọc Quỳnh
- Nguyễn Văn Thắng(A)
TD06025
TD06042
TD06034
TD06038
TD06046
Let’s make things better
HCM 25/4/2009
NHÓM 6
CALCULATOR
BÁO CÁO BÀI TẬP LỚN VI XỬ LÝ
Nội dung:
A. PHẦN MỀM:
1.
2.
3.
4.
5.
GIAO TIẾP 8951 VÀ LCD
GIAO TIẾP 8951 VÀ BÀN PHÍM
CHƯƠNG TRÌNH CHÍNH
CÁC CHƯƠNG TRÌNH CON
MÔ PHỎNG TRÊN PROTUES
B. PHẦN CỨNG:
1. BẢN VẼ MẠCH IN TRÊN ORCAD
2. MẠCH PHẦN CỨNG THỰC TẾ
C. KẾT LUẬN:
Nhận xét của thầy giáo:
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
…………………………………………
Chữ ký:
NHÓM 6
CALCULATOR
A.PHẦN MỀM:
2. GIAO TIẾP 8951 VÀ LCD:
a. Tổng quan LCD
Trong những năm gần đây, LCD (Liquid Crystal Display) đã được sử dụng rộng rãi thay
thế cho LED 7 đoạn hay các loại LED nhiều đoạn khác. Ngày nay LCD với những tính
năng nổi trội của nó đã được sử dụng rất nhiều trong vi điều khiển. Khả năng hiện thị
của LCD là rất đa dạng, trực quan (chữ, số và nhiều loại ký tự đồ họa khác), dễ dàng
đưa vào mạch ứng dụng theo nhiều giao thức khác nhau, giá thành rẻ…
LCD sử dụng trong mạch: TC1602_01T
- Hình dạng, kích thước:
- Sơ đồ chân:
b. Giao tiếp LCD với 8951:
Nhóm chúng tôi thực hiện giao tiếp trực tiếp với 8951 (kết nối 8 bit):
- P2.0 P2.7 (của 8951) nối với DB0 DB7 (của LCD)
- P3.0 nối với E (chân 6 của LCD)
- P3.1 nối với RW (chân 5 của LCD)
- P3.2 nối với RS (chân 4 của LCD)
Để thuận lợi cho việc viết chương trình, chúng tôi định nghĩa các chân và nhóm
chân của LCD như sau (định nghĩa đầu chương trình):
RS
RW
E
D A T A_LC D
BIT
BIT
BIT
EQ U
P3.2
P3.1
P3.0
P2
Các chương trình con khi giao tiếp với LCD:
Xử lý đường điều khiển E:
NHÓM 6
CALCULATOR
-
Để thiết lập các lệnh hay gởi dữ liệu ký tự cho LCD, ta phải tạo ra một
xung cạnh xuống trên chân E, do đó ta đưa chân E lên mức cao, tạo một
đỗ trễ khoảng 200ms (để tạo độ rộng xung) và sau đó đưa E xuống thấp,
ta có thể coi nó là một chương trình con để ra lệnh cho LCD đọc dữ liệu,
coi nó là một chương trình con:
LENH:
SETB E
LCALL DELAY2
CLR
E
RET
-
Đọc dữ liệu hay trạng thái từ LCD: tạo một xung cạnh lên, chương trình
như sau:
LENH2:
-
CLR
E
LCALL DELAY2
SETB E
RET
Chương trình delay: 200ms, timer1, chế độ 1
DELAY2:
LL:
MOV
MOV
MOV
MOV
SETB
JNB
CLR
CLR
DJNZ
MOV
RET
TMOD,#10H
R7,#4
TH1,#HIGH(-50000)
TL1,#LOW(-50000)
TR1
TF1,$
TR1
TF1
R7,LL
R7,#00H
Kiểm tra trạng thái bận LCD:
Trong khi viết chương trình ta phải kiểm tra xem LCD có còn bận thực hiện lệnh
đã nhận trước đó hay không.
Khi thực hiện các hoạt động bên trong chíp, mạch nội bên trong cần một khoảng
thời gian để hoàn tất. Khi đang thực thi các hoạt động bên trong chip như thế, LCD bỏ qua
mọi giao tiếp với bên ngoài và bật cờ BF (thông qua chân DB7 khi có thiết lập RS=0,
R/W=1) lên để báo cho 8951 biết nó đang “bận”. Dĩ nhiên, khi xong việc, nó sẽ đặt cờ BF
lại mức 0. Dựa trên nguyên tắc đó ta viết đoạn chương trình con kiểm tra trạng thái bận
của LCD như sau:
WAIT_LCD:
CLR
CLR
SETB
MOV
SETB
MOV
JB
CLR
CLR
RET
E
RS
RW
DATA_LCD,#0FFH
E
A,DATA_LCD
ACC.7,WAIT_LCD
RW
RS
Khởi tạo LCD: chương trình khởi tạo LCD như sau:
KHOITAO: CLR
RS
;Chọn chế độ gởi lệnh
NHÓM 6
CALCULATOR
MOV
LCALL
LCALL
CLR
MOV
LCALL
LCALL
RET
DATA_LCD,#38H
LENH
WAIT_LCD
RS
DATA_LCD,#0FH
LENH
WAIT_LCD
;Chọn bus 8bit, font ký tự 5x8, 2 hàng
;Gọi lệnh thực thi xuất ra LCD
;Kiểm tra trạng thái bận của LCD
;Chọn chế độ gởi lệnh
;LCD on, bật cursor
Xóa màn hình hiển thị LCD:
CLR_LCD:
MOV DATA_LCD,#01H
LCALL LENH
LCALL WAIT_LCD
RET
Ghi ra màn hình LCD:
CÁCH 1:
WRITE_TEXT:
SETB
SETB
E
RS
MOV DATA_LCD,#’T’
CLR
E
LCALL WAIT_LCD
RET
;E=1 bắt đầulệnh LCD
;RS=1 để chọn thanh chế độ xuất
;các dữ liệu ký tự để hiển thị lên LCD
;goi dữ liệu ký tự chữ T lên LCD
;E=0 tạo cạnh xuống
; Kiểm tra xem LCD còn bận hay không
CACH2:
WRITE_TEXT:
SETB
MOV
LCALL
LCALL
RET
RS
DATA_LCD,#’T’
LENH
WAIT_LCD
Trong chương trình có một số đoạn chương trình xuất chữ, VD:
WRITE_TEXT1:
MOV A,R6
MOV DPTR,#TEN1
MOVC A,@A+DPTR
SETB RS
MOV DATA_LCD,A
LCALL LENH
LCALL WAIT_LCD
MOV A,R6
INC
A
MOV R6,A
CJNE A,#18,WRITE_TEXT1
RET
TEN1:
DB
‘!DH GTVT TPHCM! ‘
NHÓM 6
CALCULATOR
3. GIAO TIẾP 8951 VỚI BÀN PHÍM 4x4:
Kết nối:
NHÓM 6
CALCULATOR
P1.7
C4
P1.6
C3
P1.7
P1.7
P1.5
C2
P1.4
C1
P1.3
H4
P1.2
3
7
B
F
2
6
A
E
1
5
9
D
0
4
8
C
H3
P1.1
H2
P1.0
H1
Xác định mã các phím nhấn bằng phần mềm:
- Khi nhấn phím thì hàng và cột tương ứng sẻ được nối với nhau
- Để xác định được phím nhấn ta quét bàn phím: ta thực hiện quét từng
hàng, đầu tiên cho hàng 1 ở mức logic 0, các hàng và cột khác ở mức logic
1, ta đoc giá trị hàng và cột thông qua Port 1.
NHÓM 6
CALCULATOR
-
-
Nếu 1 phím nào đó được nhấn: hàng và cột tương ướng nối với nhau và ở
mức logic 0, tuân theo quy tắc sau ta xác định mã phím:
+Ta có số hàng là 4: đếm theo thứ tự
hi = 1(ứng với H4), 2( ứng với H3), 3(ứng với H2), 4(ứng với H1)
ci = 0 (ứng với C1), 4(ứng với C2), 8(ứng với C3), 12(ứng với C4)
Ta có thể thấy các cột hơn kém nhau 4 đơn vị
Mã phími = (4-hi)+ci
Ta thực hiện quét 4 lần, lần lượt 4 hàng
Chương trình con quét bàn phím như sau:
SCAN_KEY
Mã quét hàng = 11111110 B
Nạp (đếm hàng) = 4
Xuất (mã quét hàng)
Ra port 1
Đọc giá trị hàng và
cột ở Port1 vào A
Xóa các bit hàng [4 bit thấp]
Giữ lại các bit cột [4 bit cao]
Có phím ấn?
[Có bít cột nào =0]
1
Quay trái mã quét hàng
[quét hàng kế]
Giảm (đếm hàng)
NHÓM 6
(Đếm hàng) =
0
Xóa (cờ)
CALCULATOR
2
1
Xác định hàng có phím nhấn
(hàng) = 4 – (đếm hàng)
(mã phím) = (hàng)
NHÓM 6
CALCULATOR
Chuyễn mã cột về 4 bit thấp
(đếm cột) = 4
Quay phải (A) qua cờ C [để
xác định vị trí của cột = 0]
(C) = 0
(mã phím) = (hàng) + 4
Giảm (đếm cột)
(Đếm cột) =
0
Đặt (cờ) = 1
Cất mã phím vào A
2
Ret
Chương trình con quét bàn phím được viết như sau:
SCAN_KEY:
MOV
MOV
SCAN:
R1,#0FEH
R6,#4
MOV
MOV
ANL
CJNE
XCH
RL
XCH
P1,R1
A,P1
A,#0F0H
A,#0F0H,GET_CODE
A,R1
A
A,R1
NHÓM 6
CALCULATOR
EXIT:
DJNZ
CLR
LJMP
GET_CODE:
PUSH
MOV
CLR
SUBB
MOV
POP
SWAP
MOV
LOOP2:
RRC
JNC
XCH
ADD
XCH
DJNZ
SET_FLAG:
SETB
MOV
MOV
MOV
RET
R6,SCAN
F0
EXIT
ACC
A,#4
C
A,R6
R5,A
ACC
A
R4,#4
A
SET_FLAG
A,R5
A,#4
A,R5
R4,LOOP2
F0
A,R5
R1,#00H
R6,#00H
Mạch thực tế được kết nối với Port1 như sau:
+
P1.7
A
=
P1.6
B
8
9
CLR
CLR
P1.5
C
4
5
6
7
P1.4
D
0
1
2
3
ON/C
1
2
3
4
ALL
P1.0
P1.1
P1.2
P1.3
NHÓM 6
CALCULAT O R
SƠ ĐỒ MẠCH KẾT NỐI NHƯ SAU:
CALCULATOR
C1
GROUP VI - TD06 - HCMUTRANS
LCD1
LM020L
X1
RS
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
7
8
9
10
11
12
13
14
0
1
2
3
4
5
6
7
RS
RW
E
VSS
VDD
VEE
1
2
3
8
9
CLR
CLR
C
4
5
6
7
D
0
1
2
3
ON/C
ALL
4
3
B
2
10
11
12
13
14
15
16
17
=
1
P3.0/RXD
P3.1/TXD
P3.2/INT0
P3.3/INT1
P3.4/T0
P3.5/T1
P3.6/WR
P3.7/RD
+
A
p1.3
AT89C51
p1.2
10k
P1.0
P1.1
P1.2
P1.3
P1.4
P1.5
P1.6
P1.7
VCC
p1.1
R1
1
2
3
4
5
6
7
8
GND
p1.0
C3
p1.7p1.6
p1.5
p1.4
p1.3p1.2
p1.1
p1.0
10uF
Reset
PSEN
ALE
EA
21
22
23
24
25
26
27
28
GROUP6-TD06-HCMUTRANS
p1.7
29
30
31
P2.0/A8
P2.1/A9
P2.2/A10
P2.3/A11
P2.4/A12
P2.5/A13
P2.6/A14
P2.7/A15
10k
p1.6
RST
VCC
RV1
39
38
37
36
35
34
33
32
p1.5
9
XTAL2
P0.0/AD0
P0.1/AD1
P0.2/AD2
P0.3/AD3
P0.4/AD4
P0.5/AD5
P0.6/AD6
P0.7/AD7
p1.4
18
30p
XTAL1
7 6 5 4 3 2 1 0
19
4
5
6
U1
FREQ=12MHz
RS RW
E
C2
CRYSTAL
81%
30p
NHÓM 6
CALCULAT O R
4. CHƯƠNG TRÌNH CHÍNH
START
K h ởi tạo LCD
Xuất chữ
1
Khởi tạo LCD
Đặt vị trí cusor cuối
dòng 1 của LCD
Nạp (đếm chữ số) =
5
Các chữ số sau khi nhấn lưu vào các ô
nhớ, bắt đầu là ô nhớ 30H, (R0) = 30H
Gán nội dụng các ô nhớ từ 30H tới 33H là
0FFH để dùng khi hiệu chỉnh các số
trước khi tính
2
Quét bàn phím
Đưa Port1 vào R4
đề kiểm tra
(R4) =
0F7H
3
NHÓM 6
CALCULATOR
3
(R4) =
077H
Tắt mở chương
trình
1
(R4)=
0BBH
Gán số tràn phép
tính trước = 0
(R4) =
0B7H
Gán số tràn phép
tính trước = 0
Xóa màn LCD
Xóa màn LCD
1
(R4) =
07BH
1
Điều chỉnh và lưu số
thứ nhất
Xóa màn LCD
(R4)=
07DH
Điều chỉnh và lưu số
thứ nhất
Đánh dấu đây là
phép tính cộng
(60H)= 0FFh
1
Xóa màn LCD
(R4) =
07EH
Kết quả
Đánh dấu đây là
phép tính trừ
(60H)= 0FFh
1
4
2
NHÓM 6
CALCULAT O R
4
X u ất số khi có phím nhấn
Dịch hiển thị sang trái
để đợi xuất số kế tiếp
(đếm chữ số)=
0
2
Xóa màn LCD
Đưa vị trí cursor về đầu
dòng 1
Xuất chữ báo:
‘ Nhập 4 số thui! ’
Xóa màn LCD
Xóa toàn bộ dữ liệu cũ
1
Đoạn mã chươORG
ng trình0000H
chính:
JMP
ORG
MAIN
0030H
START: MOV
DATA_LCD,#0FFH
MAIN: LCALL KHOITAO
;#####################################################################################
;CHUONG TRINH CHINH
;-------------------------------------------------------------------------------------------------------------------------LCALL XUATCHU
;Xuất chữ giới thiệu mạch
NHAPSO:
LCALL KHOITAO
MOV
DATA_LCD,#8FH
LCALL LENH
LCALL WAIT_LCD
MOV
R0,#30H
MOV
R3,#5
MOV
30H,#0FFH
NHÓM 6
CALCULATOR
KK:
NEXT:
MOV
MOV
MOV
LCALL
MOV
31H,#0FFH
32H,#0FFH
33H,#0FFH
SCAN_KEY
R4,P1
CJNE
JMP
CJNE
LCALL
R4,#0F7H,NEXT
;Tiep tuc scan key khi tin hieu vao tu ban phim ko co
KK
R4,#077H,XOATUNGKYTU
TATMO
;stop tat mo ct
;Quet ban phim
XOATUNGKYTU:
CJNE
R4,#0BBH,NEXT3
MOV
29H,#0
MOV
39H,#0
LCALL CLR_LCD
LJMP
NHAPSO
NEXT3:
CJNE
MOV
MOV
LCALL
JMP
R4,#0B7H,NEXTCONG
29H,#0
39H,#0
CLR_LCD
NHAPSO
;Xoa man hinh
NEXTCONG:
CJNE
LCALL
LCALL
LCALL
CLR
MOV
LJMP
R4,#07BH,NEXTTRU
DIEUCHINHSOTHU1
WAIT_LCD
CLR_LCD
A
60H,#0FFH
NHAPSO
;Nhấn phím +
;Luu so vua nhap vao dung vi tri de tinh toan sau
NEXTTRU:
CJNE
LCALL
LCALL
LCALL
CLR
MOV
LJMP
R4,#07DH,NEXTBANG
DIEUCHINHSOTHU1
WAIT_LCD
CLR_LCD
A
60H,#00H
NHAPSO
;Nhấn phím ;Luu so vua nhap vao dung vi tri de tinh toan sau
NEXTBANG:
CJNE
R4,#07EH,XUATSO
LCALL KETQUA
LJMP
KK
XUATSO:
LCALL
MOV
LCALL
LCALL
DJNZ
LCALL
MOV
LCALL
LCALL
MOV
LCALL
WRITE1
DATA_LCD,#07H
LENH
WAIT_LCD
R3,KK
CLR_LCD
DATA_LCD,#06H
LENH
WAIT_LCD
R6,#0
WRITE_TEXT3
;quay lai nhap lai so moi
;quay lai nhap lai so moi
;Nhấn phím =
;Xuất số ra màn hình LCD
;Dich hien thi sang trai de xuat so ke tiep
;Số chữ số có quá 4 không, quá thì báo ngay!
;Xuất báo nhập quá 4 chữ số
NHÓM 6
CALCULATOR
LCALL CLR_LCD
LCALL XOA
LJMP
NHAPSO
END
5. CÁC ĐOẠN CHƯƠNG TRÌNH CON:
+ Xuất chữ:
WRITE_TEXT2
(Số ký tự xuất)=0
A = (số ký tự
xuất)
DPTR chỉ tới bảng TEN2
Lấy ký tự từ TEN2 vào A
SETB RS chọn cđ xuất
Xuất ký tự ra màn
LCD
Lệnh xuất
Kiểm tra LCD còn bận không
Tăng (số ký tự xuất)
WRITE_TEXT2:
MOV
R6,#0
WW: MOV
A,R6
MOV
DPTR,#TEN2
MOVC A,@A+DPTR
SETB
RS
MOV
DATA_LCD,A
LCALL LENH
LCALL WAIT_LCD
MOV
A,R6
INC
A
MOV
R6,A
(Số ký tự xuất)
= 16
RET
NHÓM 6
CALCULATOR
CJNE
RET
A,#16,WW
NHÓM 6
CALCULATOR
+ Tắt mở:
TATMO
(R3)=(dấu hiệu đã tắt)
(R3) = 22H
Gán lại dấu hiệu đã mở
(69H) = 00H
Xuất chữ bye bye
Xóa số tràn trong phép
tính
Xóa màn LCD
clear RS
Xóa màn LCD
Tắt màn LCD
(DATA_LCD) = 08H
1
Lệnh xuất
TATMO:
Kiệm tra LCD còn bận ko
Gán lại dấu hiệu đã tắt
(69H) = 22H
TAT:
Đưa Port1 vào R4
đề kiểm tra
(R4) =
077H
TAT1:
MOV
CJNE
MOV
MOV
LCALL
JMP
R3,69H
R3,#22H,TAT
69H,#00H
39H,#0
CLR_LCD
NHAPSO
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL
MOV
LCALL
LCALL
CLR_LCD
DATA_LCD,#06H
LENH
WAIT_LCD
R6,#0
WRITE_TEXT4
CLR_LCD
DATA_LCD,#08H
LENH
WAIT_LCD
MOV
69H,#22H
MOV
CJNE
LJMP
RET
R4,P1
R4,#077H,TAT1
TATMO
NHÓM 6
CALCULATOR
+Điều chỉnh và lưu số thứ nhất:
ĐIỀU CHỈNH SỐ THỨ
1
(33H) =
0FFH
(43H) = (33H)
(42H) = (32H)
(32H) =
0FFH
(43H) = (32H)
(41H) = (31H)
(40H) = (30H)
(42H) = (31H)
(39H) = (29H)
(41H) = (30H)
R
(40H) = 0
(31H)= 0FFH
(43H) = (31H)
R
(42H) = (30H)
(43H) = (30H)
(41H) = 0
(30H) =
0FFH
(40H) = 0
(42H) = 0
R
R
E
(41H) = 0
(40H) = 0
R
RET
DIEUCHINHSOTHU1:
B4:
B3:
MOV
CJNE
MOV
CJNE
MOV
CJNE
MOV
CJNE
MOV
MOV
MOV
MOV
LJMP
MOV
A,33H
A,#0FFH,B1
A,32H
A,#0FFH,B2
A,31H
A,#0FFH,B3
A,30H
A,#0FFH,B4
43H,30H
42H,#00H
41H,#00H
40H,#00H
EXIT1
43H,31H
B2:
B1:
MOV
MOV
MOV
LJMP
MOV
MOV
MOV
MOV
LJMP
MOV
MOV
MOV
MOV
EXIT1:
42H,30H
41H,#00H
40H,#00H
EXIT1
43H,32H
42H,31H
41H,30H
40H,#00H
EXIT1
43H,33H
MOV
42H,32H
41H,31H
40H,30H
39H,29H
RET
NHÓM 6
- Xem thêm -