Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.57 MB, 84 trang )
CHƯƠNG II: THIẾT KẾ PHẦN MỀM
Từ mạch đã thiết kế, chúng em đã xây dựng 3 bài toán ứng dụng:
• Quét bàn phím HEX, hiển thị phím được Ên ra LCD.
• Đọc thời gian từ đồng hồ thời gian thực DS12887.
• Điều khiển ADC0809 biến đổi tín hiệu tương tự thành số.
I. CHUƠNG TRÌNH QUÉT BÀN PHÍM HEX.
Chương trình này thực hiện quét bàn phím HEX, kiểm tra xem có phím
nào được nhấn không. Nếu có, chuyển thành mã ASCII để hiển thị ra LCD. Nếu
không có phím nào được nhấn thì kết thúc.
• Lưu đồ của bài toán
• Lưu đồ hàm quét bàn phím
• Chương trình hợp ngữ
$debug
$tilte (**
TEST PROGRAM for the MyBOARD
**)
org
0000h
main:
call
scan
; Gọi chương trình quét bàn phím.
call
convert
; Gọi chương trình đổi Hex→ASCII.
call
display
; Gọi chương trình hiển thị ra LCD.
;========================================================;
;
Chương trình con quét bàn phím SCAN
;
;========================================================;
scan:
mov
A,#00H
mov
P1,A
mov
A,P1
; Đọc các hàng
anl
A,#0F0H
; Che các bit thấp
cjne
A,#0F0H,scan_key
; Nếu có phím Ên, gọi chương trình tìm
; phím Ên
ret
; Đưa 0 ra các cột
; Không có phím nào Ên thì thoát.
;==========================================================;
; Scan_KEY: đọc trạng thái bàn
phím.
; ;
trả về C=0 nếu
không có phím nào được Ên
; ;
trả về C=1
và mã hex của phím Ên trong ACC nếu có phím Ên.
;
;==========================================================;
scan_key: mov
R6,#4
; Dùng R6 làm bộ đếm.
mov
P1,A
; Tích cực cột.
mov
R7,A
; Lưu mẫu quét
mov
A,P1
; Đọc trở lại cổng Port1
anl
A,#0F0h
; Che các bit thấp.
cjne
A,#0F0h, tao_ma
; Có hàng tích cực, thì gọi chương trình
; tạo mã
mov
A,R7
; Nếu không, di chuyển tới cột kế.
rl
A
; quay trái A
djnz
R6,quet
clr
C
; Không có phím được Ên. Xóa C=0
sjmp
tao_ma:
; Bắt đầu quét từ cột 0.
mov
quet:
A,#0FEh
exit
; Thoát
mov
R7,A
; Lưu trong R7.
mov
A,#4
; Chuẩn bị tính trọng số cột.
clr
C
subb
A,R6
; Trọng số cột = 4-R6.
mov
R6,A
; Lưu trong R6.
mov
; Đặt trong 4 bit thấp.
R5,#4
; Dùng R5 làm bộ đếm.
rrc
A
; Quay phải A với cờ nhớ.
jnc
done
; Thực thi xong khi C=0.
inc
R6
; Cộng 4 đến khi thấy hàng tích cực.
inc
R6
inc
R6
inc
R6
djnz
R5,again
setb
C
; C=1 (có phím được Ên)
mov
exit:
A
mov
done:
; Phục hồi mã quét.
swap
again:
A,R7
A,R6
; Mã được cất trong A.
ret
ret
; Kết thúc chương trình quét.
;==========================================================;
;
Chương trình hiển thị ra LCD
;
;==========================================================;
display:
R3,A
; Cất dữ liệu trong A vào thanh ghi R3.
mov
A,#38h
; Khởi tạo LCD 2 dòng, ma trận điểm ;
5x7
call
write
; Gọi chương trình ghi lệnh điều khiển
; LCD
call
delay
; Tạo độ trễ cho LCD.
mov
A,R3
call
d_data
; Gọi chương trình hiển thị dữ liệu.
mov
P2,A
; Đưa lệnh ra.
clr
P3.7
; Đặt RS = 0 để chọn thanh ghi lệnh.
clr
P3.6
; Đặt RW = 0 để ghi lệnh.
setb
P3.4
; Đặt E = 1
clr
write:
mov
P3.4
; E = 0, tạo xung cao xuống thấp.
P2,A
; Sao chép dữ liệu cần hiển thị ra P2.
ret
d_data:
mov
setb
P3.7
; Đặt RS = 1 để chọn thanh ghi dữ liệu.
clr
P3.6
; Đặt RW = 0 để ghi dữ liệu.
setb
P3.4
;E=1
clr
P3.4
;E=0
; Tạo độ trễ
ret
delay:
mov
R2,#50
here:
djnz
R2,here
ret
ret
;========================================================;
;
Chương trình con Chuyển đổi mã HEX thành mã ASCII
;========================================================;
convert:
A,#0Fh
; Xóa các bit cao.
cjne
A,#0Ah,$+3
; So sánh xem A có nhỏ hơn 0Ah
;không?
jc
htoa
add
htoa:
anl
A,#7
; có, cộng thêm 7
add
A,#’0’
; Không, chuyển đổi trực tiếp.
ret
END
; Hết chương trình.
;
II. ĐỌC THỜI GIAN TỪ ĐỒNG HỒ THỜI GIAN THỰC RTC DS12887
Để thực hiện công việc đọc thời gian từ DS12887, trước hết ta phải tiến
hành chọn chip thông qua 74ALS138. Chân
của DS 12887 được nối với
chân Y1 của 74ALS138. Để chọn chân Y1, phải đặt A = 0, B = 1, C = 0.
Sau khi chọn chip, tiếp theo tiến hành đặt các thông số để đọc dữ liệu:
1. Đặt địa chỉ thanh ghi B của DS12887: đưa địa chỉ của thanh ghi B là 0Bh
vào R0 (của 8051). Gửi địa chỉ này đến Port 0 để gửi tới DS12887.
2. Đặt thông số cho thanh ghi B:
SET = 0 : không cho phép cập nhật thời gian bởi chương trình.
PIE = 1 : Cho phép ngắt.
AIE = 0 : Cho phép tín hiệu ngắt ở đầu ra
.
UIE = 1
SQWE = 0
DM = 0 : dữ liệu thông tin về thời gian được định dạng BCD.
= 1: Chế độ thời gian 24h.
DSE = 0 : Không sử dụng chế độ giê mùa đông.
Ta chỉ quan tâm tới bit SET, PIE, DM,
B trong bài toán này không cần chú ý tới.
, các bit còn lại của thanh ghi
3. Đọc thời gian :
- Địa chỉ byte giê trong DS12887 là 04h. Đọc xong lưu vào R2(của
8051).
- Địa chỉ của byte phót trong DS12887 là 02h. Đọc xong lưu vào thanh
ghi R3 (của 8051).
- Địa chỉ của byte giây trong DS12887 là 00h. Đọc xong lưu vào thanh
ghi R4( của 8051).
4. Chuyển đổi dữ liệu thời gian từ mã BCD sang mã ASCII để hiển thị ra
LCD.
5. Hiển thị trên LCD.
• Lưu đồ bài toán:
• Tiến trình đọc thông tin
• Lưu đồ hàm khởi tạo LCD
• Lưu đồ hàm kiểm tra LCD
• Chương trình hợp ngữ
$debug
$tilte (**
TEST PROGRAM for the MyBOARD
org
0000h
**)
ljmp
Main
org
0003h
; Điểm nhập vector ngắt ngoài 0.
;=======================================================;
;
ngoài
Trình xử lý ngắt
;
;=======================================================;
Ex0IRS:
setb
P3.0
; Hủy bỏ việc chọn DS12887 khi
; đọc
clr
P3.1
; xong dữ liệu.
clr
EX0
; Cấm ngắt ngoài 0.
reti
; Hết chương trình xử lý ngắt.
;=======================================================;
;
Main Program
;
;=======================================================;
org
here:
call
select_chip
;Gọi chương trình con chọn
;chip.
setb
Main:
0030h
P3.6
; Cho phép ghi.
mov
A,#0Bh
;Địa chỉ thanh ghi B của
;DS12887.
mov
P0, A
; Đưa ra cổng P0.
setb
ALE
; Cho ALE = 1
clr
ALE
; ALE = 0, tạo xung cao xuống
; thấp để chân DS cho phép chốt
; địa chỉ trong DS12887.
mov
P0,#01010010b
; Đặt các giá trị điều khiển cho
; thanh ghi B của DS12887.
setb
ALE
;Tạo mức cao ở chân DS để giải
; phóng việc chốt địa chỉ.
mov
A,#0FFh
mov
P0,A
; Thiết lập P0 làm đầu vào.
mov
R0,#04h
; Địa chỉ byte giê.
clr
ALE
mov
P0,@R0
; Đọc byte giê.