TRƯỜNG ĐẠI HỌC BÁCH KHOA
TP.HỒ CHÍ MINH
------
Thành viên nhóm:
Đinh Xuân Tuế
MSSV:
41104041
Đỗ Mạnh Thưởng
Nguyễn Đức Bình
41100298
Nguyễn Hữu Thạnh
41003060
Bài 1: Thí nghiệm với LED đơn
Chớp tắt đèn p1.0 với chu kì là 500ms
Thuật toán: tạo vòng lặp liên tục chớp tắt đèn với chu kì là 500ms
Lưu đồ thuật toán:
ORG
CPL P1.0 ;Chớp
đèn P1.0
z
DELAY 500ms
Source code:
ORG
2000H
LAP:
CPL
CALL
SJMP
DL500:
PUSH
PUSH
PUSH
MOV
L2:
MOV
L1:
MOV
DJNZ
DJNZ
DJNZ
POP
P1.0
DL500
LAP
;thay đổi trạng thái p1.0 sang trạng thái ngược lại
;gọi delay 500ms để đèn sáng được lâu
;quay trở lại chương trình để đèn được chớp liên tục
05
06
07
R5, #10
;chương trình delay 500s
;đặt để cất giá trị ở thanh ghi r5 r6 r7 vào ngăn xếp
R6, #100
;gán r6 = 100
R7, #250
R7, $
R6, L1
R5, L2
;gán r7 = 250
07
;gán r5 = 10
;thực hiện 10x100x250x2
; chu kì máy (1 chu kì 1us)
;lấy lại giá trị r7 lưu trong
;ngăn xếp để bảo tồn giá trị
; ( theo quy tắc cất trước thì lấy sau)
POP
POP
RET
06
05
END
Bài 2: Thí Nghiệm Hiển Thị LED
Hiển thị đèn LED từ 0 đến 9 sau đó lặp lại.
Thuật toán: sử dụng thanh ghi DPTR để kết nối LED bằng cách move địa chỉ thanh
ghi DPTR vào địa chỉ #0000H. Lựa chọn đèn LED nào sáng vào hiển thị giá trị số nào
bằng cách gán nội dụng vào thanh ghi DPTR (đó là @DPTR) (sử dụng 8 bit). 4 bit
đầu quy định led nào sẽ sáng 4 bit sau quy định số sẽ sáng.
VD: chọn LED số 4 thì LED số 4 phải ở mực thấp: 1110E, hiển thị số 0 thì nội
dụng @DPTR phải là #0E0H
Tương tự: LED 3 hiển thị số 2: 1101 0010 @DPTR là #0D2H
LED 2 hiển thị số 1: 1011 0001 @DPTR là #0B2H
Sử dụng vòng lặp tăng giá trị lên. Dùng delay điều chỉnh thời gian thi hành chậm lại
để có thể lưu ảnh trong mắt người quan sát. Đồng thời kiểm tra nếu quá 9 sẽ trở lại về
0 (sử dụng CJNE)
Lưu đồ thuật toán:
ORG
DPTR#0000H
A#0E0H
@DPTRA
DELAY
INC A
A>9
N
Y
Source code:
AGAIN:
NEXT:
ORG
MOV
MOV
MOVX
DPTR
LCALL
INC
CJNE
SJMP
DELAY:
LAP1:
MOV
MOV
MOV
MOV
SETB
JNB
CLR
CLR
DJNZ
RET
END
2000H
DPTR,#0000H
A, #0E0H
@DPTR, A
; truy xuất đến LED
;gán A là 1110 0000B
;Đưa A vào nội dung thanh ghi
;( bằng cách mov vào @DPTR)
DELAY
;Gọi delay để có thời gian chờ để lưu
;ảnh trong mắt.
A
;Tăng giá trị A lên để đếm đến 9
A, #0EAH, NEXT
;Kiểm tra xem có
;vượt quá 9 không
; nếu không vượt thì tiếp tục quay lại
;hiển thị rồi tăng A
AGAIN
;trở lại để hiển thị từ 0
R7,#10
;vòng lặp delay sử dụng timer 1
TMOD,#01H
TH0,#HIGH(-50000)
TL0,#LOW(-50000)
TR0
TF0,$
TR0
TF0
R7,LAP1
Bài 3:Thí Nghiệm Hiển Thị LCD
Hiển thị chữ ‘HELLO’ trên màn hình LCD
Thuật toán: -Sử dụng thanh ghi DPTR để kết nối LCD bằng cách move địa chỉ thanh
ghi DPTR vào địa chỉ #8000H
-Viết 2 chương trình con:
+Thứ nhất: chương trình con nhận lệnh truyền đến để thực hiện (WRITE). Để nhận
lệnh thì ta phải setb p3.4 và clr p3.5. Chương trình này giúp LCD nhận lệnh từ máy
như xóa màn hình LCD, hiển thị kiểu nào, con trỏ ở đâu.v..v
+Thứ hai: chương trình nhận kí tự xuất ra LCD hiển thị (WRITE_TEXT). Để nhận
chuỗi kí tự ta phải setb p3.4 và cả p3.5.
-Viết chương trình con khởi động LCD (tên là LCD) với phổ biến là truyền 3
lệnh sau:
+#06H: hiển thị tăng và không shift
+#0EH: hiển thị cursor nhưng không hiển thị blinking
+#38H: giao tiếp 8 bit, 2 dòng với font 5x8
-Viết chương trình con lấy kí tự từ bảng (là chuỗi kí tự muốn hiển thị) (chương
trình con BANG).
-Viết chương trình con delay để tạo độ trễ. Để có thể xuất hiện từng chữ một
trên LCD.
-Chương trình chính:
+Khởi động LCD.
+Xóa màn hình đang hiện thị trên LCD bằng cách truyền lệnh #01H.
+Tạo vòng lặp hiển thị từng chữ một trên LCD bằng cách tra bảng.
Lưu đồ thuật toán:
ORG
DPTR#8000H
CALL LCD ; khởi động LCD
A#01H
CALL WRITE ;xóa màn hình
R5#5
A#0
R4#0
CALL BANG
CALL WRITE_TEXT
R4R4+1
AR4
R5R5-1
R5=0
Y
SJMP $
; lặp
tại chỗ để chương
trình không kết thúc
N
Source code:
ORG
MAIN:
MOV
CALL
MOV
2000H
DPTR , #8000H
LCD
A,#01H
CALL
WRITE
MOV
R5,#5
MOV
MOV
LAP: CALL
CALL
INC
MOV
DJNZ
SJMP
BANG:
MOV
MOVC
RET
;Truy xuất đến LCD
;Khởi động LCD cài đặt thông số cần thiết
;cho A=#01H để truyền lệnh vào
;LCD xóa màn
; hình LCD
;Tạo vòng lặp 5 lần ứng với
;chữ HELLO có 5 kí tự
A,#0
;Khởi tạo A bằng đầu từ kí tự thứ nhất
R4,#0
;Khởi tạo biến đếm để tăng giá trị A
; (vì A dễ thay đổi trong quá trình làm)
BANG
;Gọi bảng mang kí tự
WRITE_TEXT
;Hiển thị lên LCD
R4
;Tăng biến đêm R4 để gán vào A
A,R4
R5,LAP
;Giảm R5 rồi quay lại
$
;Lặp tại chỗ để không làm
; tiếp câu lệnh tiếp theo
DPTR,#TABLE
A,@A+DPTR
;gọi bảng
;Gán vào A kí tự thứ A của chuỗi kí tự
MOV
A,#38H
;Khởi động LCD
;truyền lệnh cho LCD giao tiếp 8 bit,
; 2 dòng với font 5x8
LCALL
MOV
WRITE
A,#0EH
LCALL
MOV
WRITE
A,#06H
LCALL
RET
WRITE
LCD:
WRITE_TEXT:
MOV
SETB
DPTR,#8000H
P3.4
;truyền lệnh cho LCD hiển thị cursor nhưng
;không hiển thị blinking
; truyền lệnh cho LCD hiển
;thị tăng, không shift
;hiển thị kí tự trong thanh ghi A bằng LCD
;Truy xuất đến LCD
;Khởi động chế độ
SETB
MOVX
P3.5
@DPTR,A
CLR
LCALL
RET
P3.4
WAIT
WRITE:
MOV
SETB
CLR
DPTR,#8000H
P3.4
P3.5
MOVX
@DPTR,A
CLR
LCALL
RET
P3.4
WAIT
WAIT:
PUSH
PUSH
MOV
LAP1:
MOV
DJNZ
DJNZ
POP
POP
RET
;Bật chế độ nhận kí tự hiển thị ra LCD
;Nhận kí tự qua từ thanh ghi A vào nội dung
; DPTR (là @DPTR)
;để hiển thị
;Kết thúc chế độ
07
;nhận lệnh từ thanh ghi A vào LCD
;Truy xuất đến LCD
;khởi động chế độ
;Bật chế độ nhập lệnh từ
;thanh ghi A vào LCD
;Nhận lệnh từ thanh ghi A vào
; nội dung DPTR (là @DPTR)
;Kết thức chế độ
;tạo thời gian delay để nhận lệnh, hay tốc độ
; hiện kí tự trên LCD
06
R7,#250
R6,#250
R6,$
R7,LAP1
06
07
TABLE:
DB 'HELLO'
END
;Bảng chứa chuỗi kí tự muốn hiển thị trên LCD
4) Giao Tiếp Qua Cổng Nối Tiếp:
Lý thuyết cơ bản:
Về cơ bản, phần cứng đã có trong giáo trình. Phần này ta sử dụng thêm hiển thị LCD
đã được nói ở thí nghiệm trước.
Lưu ý: xác định chính xác tốc độ baud. Trên LCD do hiển thị có 2 hàng mỗi hang 16
ký tự, nhưng thực tế thì
Yêu Cầu: Viết chương trình nhập 1 ký tự từ cổng nối tiếp hiển thị lên CLD đồng thời
phát ra cổng nối tiếp.
Lưu đồ giải thuật:
ORG
Khởi tạo các giá trị cho:
1. SCON
2. TMOD
3.
LCD
Gọi chương trình con nhập dữ
liệu.
Xuất dữ liệu lên LCD và cổng
nối tiếp.
Yes
No
Nhập ký tự nữa
hay không.
Code:
ORG
2000H
MOV
SCON,#52H
; cổng nối tiếp , chế độ 1
MOV
TMOD,#20H
; time 1 mode 2
MOV
TH1,#-3
; Trị nạp cho 19200 baud
SETB
TR1
; cho time 1 chạy
MOV
A,#01H
; xóa màn hình LCD
CALL
WRITE
MOV
DPTR,#8000H
Nhảy tại chỗ chờ
lệnh kế tiếp.
CALL
LCD
CALL
IN
CALL
WRITE_TEXT
CALL
OUT
SJMP
LAP
SJMP
$
LAP:
; Gọi chương trình con nhập dữ liệu vào.
; Gọi chương trình con xuất dữ liệu ra.
;================
;============================
;======= Các chương trình con.
OUT:
JNB
TI,$
; Chờ phát xong byte trước đó
CLR
TI
;Chuẩn bị phát byte kế tiếp.
MOV
SBUF,A
;Phát
JNB
RI,$
;Chờ nhận xong 1 byte
CLR
RI
;Nhận byte kế tiếp
MOV
A,SBUF
; Chuyển byte kế tiếp vào trong A
RET
IN:
RET
;================================
;=====================================
;=== Dưới đây là phần giao tiếp với LCD đã được nói ở mục trước.
LCD: MOV
A,#38H
LCALL
WRITE
MOV
A,#0EH
LCALL
WRITE
MOV
A,#06H
LCALL
WRITE
RET
WRITE_TEXT:
MOV
DPTR,#8000H
SETB
P3.4
SETB
P3.5
MOVX
@DPTR,A
CLR
P3.4
LCALL
WAIT
RET
WRITE:
MOV
DPTR,#8000H
SETB
P3.4
CLR
P3.5
MOVX
@DPTR,A
CLR
P3.4
LCALL
WAIT
RET
WAIT:
MOV
R7,#4
LAP1:
MOV
R6,#250
DJNZ
R6,$
DJNZ
R7,LAP1
RET
END
5) Điều Khiển ADC:
Lý thuyết cơ bản:
Về cơ bản, phần cứng đã có trong giáo trình. Phần này ta sử dụng thêm hiển thị
LCD đã được nói ở thí nghiệm trước. Tuy nhiên lưu ý thêm về hoạt động và thiết kế
của ADC0809 đã được nêu trong giáo trình.
Lưu ý:
Lưu ý các lệnh giao tiếp với ADC.
Cách hiện thị số nhị phân (hiện đang thể hiện giá trị thập phân ).
Yêu cầu: Viết chương trình thực hiện đọc điện áp kênh 0 và hiển thị lên LCD.
Lưu đồ giải thật:
ORG 2000H
Kết hợp địa chỉ ADC với kênh
Lệnh chuyển đổi kênh
Delay
Lấy dữ liệu từ ADC ra cất vào thanh ghi
A
Nhân A với 5.
Hiển thị hang đơn vị .
Nhân giá trị hang thập phân thứ nhất với
10
Hiển thị giá trị thập phân thứ nhất.
yes
no
Giá trị có thay
đổi
Nhảy tại chỗ
Lưu ý: Lưu đồ giải thuật của LCD đã được nói tại phần LCD.
CODE và chú thích:
ORG
2000H
MOV
A,#01H
CALL
WRITE
MOV
DPTR,#8000H
CALL
LCD
MOV
A,#01H
CALL
WRITE
MOV
DPTR,#4000H
LAP:
;xóa man hình LCD
;Giao tiếp với ADC địa chỉ
; ADC với kênh
;Lệnh chuyển đổi kênh tương ứng
MOVX
@DPTR,A
MOV
R7,#50
DJNZ
R7,$
MOVX
A,@DPTR
MOV
B,#05H
MUL
AB
; thực hiện phép nhân A.B
MOV
R3,A
; bit thấp vào R3
MOV
A,B
;bit cao chuyển vào A
MOV
DPTR,#TABLE
; hiển thị số. Giao tiếp với LCD
MOVC
A,@A+DPTR
CALL
WRITE_TEXT
MOV
A,#'.'
CALL
WRITE_TEXT
MOV
B,#10
;Delay rất quan trọng để đợi giá trị của ADC
; đọc ngoại vi để lấy giá trị
; chuyển 10 vào B
MOV
A,R3
; Lấy bit thấp
MUL
AB
; Hiển thị chữ số thập phân thứ nhất
; sau dấu phẩy
MOV
A,B
;chuyển bit cao vào A
MOV
DPTR,#TABLE
; Hiển thị số. Giao tiếp với LCD
MOVC
A,@A+DPTR
CALL
WRITE_TEXT
CALL
WAIT
MOV
A,#'V'
CALL
WRITE_TEXT
CALL
WAIT
SJMP
LAP
SJMP
$
;==============================
;====================================
;===== Các chương trình con giao tiếp với LCD đã nói ở phần trước
LCD: MOV
A,#38H
LCALL
WRITE
MOV
A,#0EH
LCALL
WRITE
MOV
A,#06H
LCALL
WRITE
RET
WRITE_TEXT:
MOV
DPTR,#8000H
SETB
P3.4
SETB
P3.5
MOVX
@DPTR,A
CLR
P3.4
LCALL
WAIT
RET
WRITE:
MOV
DPTR,#8000H
SETB
P3.4
CLR
P3.5
MOVX
@DPTR,A
CLR
P3.4
LCALL
WAIT
RET
WAIT:
PUSH
07
PUSH
06
MOV
R7,#4
LAP1: MOV
R6,#250
DJNZ
R6,$
DJNZ
R7,LAP1
POP
06
POP
07
RET
XUAT:
MOV
DPTR,#0000H
MOV
X @DPTR,A
RET
TABLE:
END
DB 030H,031H,032H,033H,034H,035H,036H,037H,038H,039H
6) Thí nghiệm giao tiếp cảm biến nhiệt độ
ĐỀ BÀI :Viết chương trình đo và hiển thị nhiệt độ lên LCD
CHUẨN BỊ:
-
Cách sử dụng giao thức 1-Wire
Datasheet DS18S20
Các chương trình con liên quan tới LCD ở các bài trước
Một vài chú ý trước khi viết code
Định dạng thanh ghi nhiệt độ.
Bit S ở đây đóng vai trò là bit dấu.
Tuy nhiên bài toán của chúng ta là đo nhiệt độ phòng. Nên mình xin phép bỏ qua bit
dấu luôn cho nó là 0 ( tức nhiệt độ luôn dương). Ta chỉ xét 8 bit thấp qui định giá trị
của nhiệt độ phòng. Mộ điểm lưu ý nữa là vì nhiệt độ phòng nên bỏ qua việc so sánh
với giá trị TH,TL vì nhiệt độ phòng ta thí nghiệm luôn nằm trong khoảng âm 55 độ C
tới dương 85 độ C
Bài này ta sẽ truy xuất với DS18S20 thông qua port P3.2
Sơ đồ định thì khởi động DS1820. Dùng chương trình con RESET _DS1820
Theo sơ đồ thì ta sẽ tạo 1 xung reset 50% chu kì khoảng 1ms bằng cách.
ban đầu CLR P3.2 sau đó delay khoảng 500 µs. Set bit P3.2 delay tương ứng 500 µs
Sơ đồ định thì khe thời gian đọc/ghi
Hình 1 dùng để định thì thời gian ghi. Dùng cho chương trình con WRITE_TIME
SLOT.theo sơ đồ thời gian clear P3.2 là khoảng 60 µs. thời gian set là khoảng 2 µs
Hình 2 dùng để định thì thời gian đọc. Dùng cho chương trình con READ_TIME
SLOT. Theo sơ đồ thời gian clear P3.2 khoảng 15 µs. set là 45 µs. nhưng thực tế khi
viết code nó không chạy đúng tham khảo tài liệu mà mình tự mày mò dịnh thì lại thì
mình định thì như trong chương trình con thì lại chạy ổn.
các lệnh NOP ở đây giúp tạo thời gian delay để hoàn tất việc nhận bit. Số lệnh NOP
do ta tự định thì. Việc định thì là công việc khó khăn nhất ở đây !
Với đặc thù kit chỉ có 1 cảm biến nhiệt đô nên ta chỉ sử dung 1 số lệnh RO M và chức
năng sau
lệnh ROM:
- SKIP ROM (CCh)
Lệnh này cho phép thiết bị điều khiển truy nhập thẳng đến các lệnh bộ nhớ của
DS1820 mà không cần gửi chuỗi mã 64 bit ROM. Như vậy sẽ tiết kiệm được thời gian
chờ đợi nhưng chỉ mang hiệu quả khi trên bus chỉ có một cảm biến.
Lệnh chức năng DS1820
- CONVERT T (44h)
Lệnh này khởi động một quá trình đo và chuyển đổi giá trị nhiệt độ thành số (nhị
phân). Sau khi chuyển đổi giá trị kết quả đo nhiệt độ được lưu trữ trên thanh ghi nhiệt
độ 2 byte trong bộ nhớ nháp Thời gian chuyển đổi không quá 200 ms, trong thời gian
đang chuyển đổi nếu thực hiện lệnh đọc thì các giá trị đọc ra đều bằng 0.
- READ SCRATCHPAD (BEh)
Lệnh này cho phép thiết bị chủ đọc nội dung bộ nhớ nháp. Quá trình đọc bắt đầu từ bit
có ý nghĩa nhất của byte 0 và tiếp tục cho đến byte rhứ 9 (byte 8 – CRC). Thiết bị chủ
có thể xuất ra một xung reset để làm dừng quá trình đọc bất kỳ lúc nào nếu như chỉ có
một phần của dữ liệu trên bộ nhớ nháp cần được đọc.
ORG
2000
Tạo xung reset xác nhận sự có
mặt của cảm biến
Gọi lệnh SKIP ROM
Truy xuất thẳng tới DS1820
Cấu trúc 1 lần truy xuất
DS18S20 gồm 3 lệnh.
Tạo 1 xung reset
Gọi lệnh CONVERT T
Ra lệnh bắt đầu chuyển đổi
nhiệt độ
Tạo xung reset
Gọi lệnh SKIP ROM
Gọi lệnh READ SCRATCHPAD
Đọc nội dung bộ nhớ nháp chứa giá trị
nhiệt độ
Gọi chương trình READ BYTE
Đọc giá trị nhiệt độ khỏi cảm biến và
lưu trên thanh ghi A
Xuất giá trị ra
LCD
1 lệnh ROM
1 lệnh chức năng
Ví dụ : giả sử muốn thao tác lệnh SKIP ROM với DS18S20.
Thanh ghi A chứa giá trị 44H
Nhiệm vụ của write_time _slot:
C
P3.2
Chuyển 1 bit dữ liệu từ C vào P3.2. khi muốn truy xuất lệnh SKIPROM thì ta sẽ
chuyển dần từng bit mã lệnh của SKIPROM là 44H vào P3.2 thông qua cờ C
Nhiệm vụ của Read_time_slot:
C
P3.2
Đọc 1 bit dữ liệu từ P3.2 ra C . khi đọc dữ liệu ra thanh ghi A. ta cũng thực hiện tương
tự đọc dần từng bit thông qua cờ C.
SOURCE CODE
ORG 2000H
; gán dùng R2 như là thanh ghi đếm
DEM
EQU R2
JMP
CHUONG_TRINH_CHINH
WRITE_TIME_SLOT:
CLR
P3.2
; chương trình ghi từng bit vào DS18S20
; thông qua cổng P3.2
NOP
NOP
MOV
P3.2, C
MOV
R5, #30
LCALL
DELAY
SETB
P3.2
NOP
NOP
RET
READ_TIME_SLOT:
CLR
NOP
NOP
P3.2
; chương trình đọc từng bit từ DS1820 ra cờ C
; thông qua bit P3.2
SETB
P3.2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
MOV
C,P3.2
MOV
R5,#50
LCALL
DELAY
RET
RESET_DS1820:
; tạo xung reset phát hiện sự có
; mặt của slave(DS18S20)
CLR
P3.2
MOV
R5,#255
LCALL
DELAY
SETB
P3.2
MOV
R5,#255
LCALL
DELAY
RET
; chương trình gọi lệnh điều
WRITE_BYTE:
; khiển DS1820
MOV
DEM,#8
; gán giá trị đếm là 8.
;Tức là ta dịch 8 bit
WRITE_LAI:
RRC
A
LCALL
WRITE_TIME_SLOT
DJNZ
DEM, WRITE_LAI
SETB
P3.2
MOV
R5,#50
LCALL
DELAY
RET
;chương trình gọi lệnh đọc
READ_BYTE:
; từng bit dữ liệu
DEM,#8
; chứa giá trị nhiệt độ
LCALL
READ_TIME_SLOT
; đọc 1 bit lưu vào cờ C
RRC A
;
MOV
READ_LAI:
DJNZ
DEM,READ_LAI
dịch bit từ cờ C vào A
; thưc hiện lần lượt 8 lần ứng
;vơi 8 bit
MOV
R5,#50
;delay 100µs dảm bảo
;hoàn tất việc dịch bit
LCALL
DELAY
; kết thúc chương trình con giá
RET
; trị nhị phân nhiệt độ lưu ở A
;chương trình delay R5*2 micro giây
DELAY:
DJNZ
R5,$
RET
DELAY_LONG:
; delay dài delay 2*255*R5
;micro giây
MOV
R6,#0FFH
DELAY_LAI:
LCALL
DELAY
DJNZ
R6, DELAY_LAI
RET
CHUONG_TRINH_CHINH:
;=======xóa màn hình LCD========
MOV
DPTR,#8000H
CALL
LCD
LAP: MOV
A,#01H
;===========================
CALL
WRITE
SETB
P3.2
;set bit P3.2 để bắt đầu thao
; tác với DS18S20
AGAIN:
LCALL
RESET_DS1820
;gọi chương trình tạo xung reset
MOV
A,#0CCH
; gọi lệnh SKIP ROM.
; Truy xuất thẳng
LCALL
WRITE_BYTE
; tới DS1820 vì ở đây
;chỉ có 1 cảm biến
MOV
A,#44H
; lệnh CONVERT T
LCALL
WRITE_BYTE
; bắt đầu chuyển đổi nhiệt
; độ sang nhị phân
LCALL
RESET_DS1820
; xong 1 lần truy xuất
;phải reset đợi lần kế
; tương tự trên gọi SKIP ROM
MOV
A,#0CCH
LCALL
WRITE_BYTE
MOV
A,#0BEH
;lệnh READ SCRATCHPAD
LCALL
WRITE_BYTE
; đọc dần ô nhớ nháp chứa
;giá trị nhiệt độ
LCALL
READ_BYTE
; đọc dần
CLR C
;xóa cờ C vì dùng cờ C để lưu bit 0
RRC A
; dịch phải A có cờ C để
; lưu bit vào cờ C
MOV
P1.0,C
; A đang chứa 7 bit
; phần nguyên của nhiệt độ
MOV
B,#10
DIV
AB
; chia A cho 10 vì giá trị
; nhiệt độ gồm 2 chữ số
MOV
DPTR,#TABLE
MOVC
A,@A+DPTR
; A chứa số hàng chục
CALL
WRITE_TEXT
; xuất số hàng chục lên LCD
MOV
A,B
;B chứa hàng đơn vị
MOV
DPTR,#TABLE
;chuyển B vào A để xuất ra LCD
MOVC
A,@A+DPTR
CALL
WRITE_TEXT
; xuất số hàng đơn vị ra LCD
MOV
A,#'.'
; xuất dấu . lên LCD
CALL
WRITE_TEXT
MOV
C, P1.0
;xét bit 0 tức là cờ C xem nhiệt độ
JC
DOLE
; có phần thập phân hay không
SJMP
DOCHAN
DOLE:
MOV
A,#'5'
; nếu bit 0 là 1 thì nhiệt
; độ lẻ xuất xx.5 độ C
CALL
WRITE_TEXT
SJMP
NHAY
DOCHAN:
MOV
A,#'0'
;nếu bit 0 là 0 thì nhiệt độ
;chẵn xuất xx.0 độ C
CALL
WRITE_TEXT
SJMP
NHAY
NHAY:
CALL
WAIT