You are on page 1of 25

BÀI THÍ NGHIỆM 2

LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

MỤC TIÊU
 Nắm được cách sử dụng kit thí nghiệm, phần mềm lập trình.

 Nắm được cách giao tiếp LCD và ADC.

 Nắm được cách lập trình timer.

CHUẨN BỊ
 Đọc bài chuẩn bị thí nghiệm 2 tại nhà.
 Chuẩn bị cho thí nghiệm 2: Viết chương trình và mô phỏng trên Proteus tất cả các bài
trong thí nghiệm 2 dựa trên bài chuẩn bị 2 và thí nghiệm 0.
 Nộp tất cả các kết quả (bài chuẩn bị thí nghiệm 2) cho GVHD trước khi vào lớp.
Sinh viên không thực hiện hoặc nộp thiếu nếu không có lí do chính đáng sẽ không được
tham gia thí nghiệm và bị đánh vắng buổi đó.

Department of Electronics Page | 1


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

THÍ NGHIỆM 1
Mục tiêu: Nắm được cách thức xuất giá trị lên LCD.

Yêu cầu:

 Download chương trình mẫu LCD.A51 trên trang web bộ môn điện tử hoặc trong folder
thí nghiệm của sinh viên.

 Biên dịch và chạy thử chương trình.

 Sửa chương trình để hiển thị tên sinh viên lên hàng đầu.

Kiểm tra:

 Kiểm tra kết quả thực hiện của chương trình.

Câu hỏi:

 Giải thích ý nghĩa của các chương trình con trên project mẫu.

 Trình bày lưu đồ giải thuật giao tiếp LCD.

Department of Electronics Page | 2


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

THÍ NGHIỆM 2
Mục tiêu: Nắm được giao tiếp cơ bản của LCD.

Yêu cầu:

 Viết thêm chương trình con CLRSCREEN để xóa màn hình LCD. X

 Viết thêm chương trình con GOTOXY để di chuyển con trỏ của LCD đến hàng x, cột y,
với X chứa trong R0 và Y chứa trong R1. X

 Sửa chương trình ở thí nghiệm 1 để hiển thị thêm số nhóm ở hàng thứ 2. X

Kiểm tra:

 Kiểm tra kết quả chương trình.

Câu hỏi:

 Cho biết mã lệnh dùng để xóa màn hình, dịch con trỏ đến vị trí thứ 1 của hàng 1 và vị trí
thứ 1 của hàng 2 của LCD?
 Thực hiện canh giữa hàng 2 của LCD. Cho biết cách làm?

Chương trình con GOTOXY:

GOTOXY:

;DONG X: R0

; COT Y: R1

; DONG X; COT Y : 1<= X <=16 ; 1<=Y <=2

; DONG 1 COT Y: A = (Y-1)+80H ; ma lenh can tim

; DONG 2 COT Y: A = (Y-1)+0C0H ; ma lenh can tim

DEC R0

MOV P1,R0

Department of Electronics Page | 3


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
MOV A,P1

ANL A,#00000001B

MOV P1,A

JB P1.0, DONG1COTY

JNB P1.0, DONG2COTY

DONG1COTY:

DEC R1

MOV A,R1

ADD A,#80H

JMP DONE

DONG2COTY:

DEC R1

MOV A,R1

ADD A,#0C0H

DONE:

CALL WRITECOM

RET

Chương trình giải quyết vấn đề canh giữa

LCD_E BIT P3.3 ;??nh ngh?a LCD_E là chân P3.3

LCD_RS BIT P3.5 ;??nh ngh?a LCD_RS là chân P3.5

LCDADDR EQU 6000H ;??nh ngh?a LCDADDR là 6000H

Department of Electronics Page | 4


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
ORG 2000H

MAIN:

MOV @R0, 30H

MOV DPTR, #LCDADDR

ACALL CLEAR ; Xoa man hinh LCD

ACALL INIT_LCD ; Thiet lap cau hinh LCD

ACALL DISPLAYSTRING0

ACALL DISPLAYSTRING1 ;

SJMP $

INIT_LCD:

MOV A, #38H

ACALL WRITECOM

MOV A, #0EH

ACALL WRITECOM

MOV A, #06H

ACALL WRITECOM

RET

CLEAR: ; Xoa man hinh LCD

MOV A, #01H

ACALL WRITECOM

Department of Electronics Page | 5


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
RET

WRITECOM: ; Chi dung cho cau hinh LCD, Chinh con tro

MOV DPTR, #LCDADDR

SETB LCD_E

CLR LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

WRITETEXT:; ghi ki tu trong thanh ghi A ra LCD

MOV DPTR, #LCDADDR

SETB LCD_E

SETB LCD_RS

MOVX @DPTR, A

CLR LCD_E

ACALL WAIT_LCD

RET

DISPLAYSTRING0:

MOV R2,#0

MOV A,#0

LOOPP0:

Department of Electronics Page | 6


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
MOV A,R2

MOV DPTR,#TEN

MOVC A,@A+DPTR

JZ EXITTT0

INC R2

SJMP LOOPP0

EXITTT0:

MOV A,#16

SUBB A,R2

RR A

ADD A,#80H

ACALL WRITECOM

LOOP0:

MOV A,R0

MOV DPTR,#TEN

MOVC A,@A+DPTR

JZ EXIT0

ACALL WRITETEXT

INC R0

SJMP LOOP0

EXIT0:

RET

Department of Electronics Page | 7


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

DISPLAYSTRING1:

MOV R3,#0

MOV A,#0

LOOPP1:

MOV A,R3

MOV DPTR,#NHOM

MOVC A,@A+DPTR

JZ EXITTT1

INC R3

SJMP LOOPP1

EXITTT1:

MOV A,#16

SUBB A,R3

RR A

ADD A,#0C0H

ACALL WRITECOM

LOOP1:

MOV A,R4

MOV DPTR,#NHOM

MOVC A,@A+DPTR

JZ EXIT1

Department of Electronics Page | 8


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
ACALL WRITETEXT

INC R4

SJMP LOOP1

EXIT1:

RET

TEN:

DB "VO THI SAU",0

NHOM:

DB "NHOM 1",0

WAIT_LCD: ;Hàm con delay cho LCD

MOV R6,#10

DL1:

MOV R7, #250

DJNZ R7, $

DJNZ R6,DL1

RET

END

Department of Electronics Page | 9


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

THÍ NGHIỆM 3
Mục tiêu: Nắm được cách thức giao tiếp ADC.

Yêu cầu:

 Viết chương trình con READADC thực hiện đọc giá trị của kênh 0 và trả về giá trị trong
R0.

 Viết chương trình hiển thị giá trị của kênh 0 của ADC lên LCD dùng chương trình con
READADC đã viết.

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình.

Câu hỏi:

 Giá trị này có phải giá trị thực của điện áp đặt vào kênh 0 hay không?

 Để hiển thị giá trị thực tế của mức điện áp đặt vào kênh 0 ta phải làm như thế nào?
LCD_E BIT P3.3
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ADCADDR EQU 4000H

ORG 0
MAIN:
CALL READADC

MOV DPTR, #LCDADDR


CALL CLEAR
CALL INIT_LCD
CALL DISPLAYSTRING

Department of Electronics Page | 10


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
call readadc
push acc
mov a,#0c6h
call writecom
pop acc
call print_adc
sjmp main

print_adc:
mov b,#10
div ab
mov r2,b
mov b,#10
div ab
mov r3,b
mov b,#10
div ab
mov r4,b
; hang tram: r4 , chuc: r3, don vi r2
mov a,r4
add a,#48
call writetext
mov a,r3
add a,#48
call writetext
mov a,r2
add a,#48
call writetext
ret

Department of Electronics Page | 11


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

READADC:
MOV DPTR,#ADCADDR ;Start ADC
MOV A,#0
MOVX @DPTR,A
CALL WAIT_LCD ;EOC
MOVX A,@DPTR ;OE
MOV R0,A
MOV P1,A ;Hi?n th? A lên các LED t?i port 1 d? quan sát
RET

INIT_LCD: ;………
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET

CLEAR: ;………
MOV A, #01H
ACALL WRITECOM
RET

WRITECOM: ;………
MOV DPTR, #LCDADDR
SETB LCD_E

Department of Electronics Page | 12


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET

WRITETEXT: ;………
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET

WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET

;………

DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE

Department of Electronics Page | 13


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET

MESSAGE: DB "Gia tri kenh 0: ",0


END

THÍ NGHIỆM 4
Mục tiêu: Nắm được cách thức giao tiếp ADC và chuyển giá trị đọc được sang điện áp.

Yêu cầu:

 Viết chương trình con CALADC tính toán giá trị điện áp thực tế đặt vào kênh 0 ADC từ
giá trị đo được của ADC

 Chương trình có giá trị vào chứa trong R0 (là kết quả của chương trình con READADC)

 Giá trị trả về chứa trong R0 và R1, R0 chứa giá trị nguyên và R1 chứa giá trị thập phân.

 Hiển thị giá trị đo được lên LCD theo cấu trúc: "Voltage: x.xx V" với x.xx là giá trị điện
áp đo được, với hai số sau dấu chấm. (X)

Kiểm tra:

 Biên dịch và kiểm tra hoạt động của chương trình, so sánh giá trị hiển thị với giá trị đo
được dùng VOM

Department of Electronics Page | 14


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
LCD_E BIT P3.3
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ADCADDR EQU 4000H

ORG 0
MAIN:
CALL READADC

MOV DPTR, #LCDADDR


CALL CLEAR
CALL INIT_LCD
CALL DISPLAYSTRING
call readadc
push acc
mov a,#8AH
call writecom
pop acc
call caladc

mov a,r1
add a,#48
mov r1,a

mov a,r2
add a,#48
mov r2,a

Department of Electronics Page | 15


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
mov a,r3
add a,#48
mov r3,a

mov a,r1
call writetext

mov a,#"."
call writetext

mov a,r2
call writetext
mov a,r3
call writetext

mov a,#"V"
call writetext

sjmp main

READADC:
MOV DPTR,#ADCADDR ;Start ADC
MOV A,#0
MOVX @DPTR,A
CALL WAIT_LCD ;EOC
MOVX A,@DPTR ;OE
MOV R0,A
MOV P1,A ;Hi?n th? A lên các LED t?i port 1 d? quan sát
RET

Department of Electronics Page | 16


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

INIT_LCD: ;………
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET

CLEAR: ;………
MOV A, #01H
ACALL WRITECOM
RET

WRITECOM: ;………
MOV DPTR, #LCDADDR
SETB LCD_E
CLR LCD_RS
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET

WRITETEXT: ;………
MOV DPTR, #LCDADDR
SETB LCD_E
SETB LCD_RS

Department of Electronics Page | 17


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET

WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET

;………

DISPLAYSTRING:
MOV A,#0
LOOP:
MOV DPTR, #MESSAGE
MOV R0,A
MOVC A,@A+DPTR
JZ EXIT
ACALL WRITETEXT
MOV A,R0
INC A
SJMP LOOP
EXIT:
RET

Department of Electronics Page | 18


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
caladc:
mov b,#5
mul ab ; b: 8 bit cao; a: 8 bit thap
mov r1,b ; phan nguyen
mov b,#10
mul ab
mov r2,b ; chu so thu nhat sau dau cham
mov b,#10
mul ab
mov r3,b ; chu so thu hai sau dau cham
ret

MESSAGE: DB "VOLTAGE: ",0


ENd

Department of Electronics Page | 19


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

THÍ NGHIỆM 5
Mục tiêu: Nắm được cách thức sử dụng Timer mode 1.

Yêu cầu:

 Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng Timer 0 ở mode 1.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình.

Câu hỏi:

 Để tạo sóng 1 Hz, ta có thể sử dụng timer ở mode 2 được không? Nếu được, trình bày
đoạn chương trình tạo sóng 1 Hz sử dụng timer ở mode 2.

 Trong chương trình của sinh viên, khi sử dụng mode 1, sóng vuông 1 Hz có bị sai số
không? Để hạn chế sai số ta phải nạp các giá trị vào timer như thế nào?

Code timer mode 1


; 10^6 MC; UP: 500000MC ; DOWN: 500000MC

ORG 00

MOV TMOD,#00000001B

start:

setb p1.0

mov r0,#10

up:

call delay

djnz r0, up

Department of Electronics Page | 20


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
clr p1.0

mov r1,#10

down:

call delay

djnz r1,down

sjmp start

delay:

mov tl0,#low(-50000)

mov th0,#high(-50000)

setb tr0

jnb tf0,$

clr tr0

clr tf0

ret

end

Code timer mode 2

; 10^6 MC; UP: 500000MC ; DOWN: 500000MC

ORG 00

MOV TMOD,#00000010B

mov tl0,#-250

Department of Electronics Page | 21


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
mov th0,tl0

start:

setb p1.0

mov r0,#8

up:

call delay

djnz r0, up

clr p1.0

mov r1,#8

down:

call delay

djnz r1,down

sjmp start

delay:

mov r3,#250

loop:

setb tr0

Department of Electronics Page | 22


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
jnb tf0,$

clr tr0

clr tf0

djnz r3,loop

ret

end

Department of Electronics Page | 23


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER

THÍ NGHIỆM 6
Mục tiêu: Nắm được cách thức sử dụng Timer mode 2.

Yêu cầu:

 Viết chương trình tạo sóng vuông 1 Hz trên chân P1.0 sử dụng timer 0 ở chế độ 2.

Kiểm tra:

 Biên dịch, thực thi và kiểm tra chương trình.

Câu hỏi:

 Ở chế độ 2, độ trễ gây ra do các câu lệnh đảo giá trị bit có gây sai số cho dạng sóng ngõ
ra không? Vì sao?

; 10^6 MC; UP: 500000MC ; DOWN: 500000MC


ORG 00
MOV TMOD,#00000010B
mov tl0,#-250
mov th0,tl0

start:
setb p1.0
mov r0,#8

up:
call delay
djnz r0, up

clr p1.0

Department of Electronics Page | 24


Microprocessor Laboratory
BÀI THÍ NGHIỆM 2
LẬP TRÌNH GIAO TIẾP LCD, ADC VÀ TIMER
mov r1,#8
down:
call delay
djnz r1,down

sjmp start

delay:
mov r3,#250
loop:
setb tr0
jnb tf0,$
clr tr0
clr tf0
djnz r3,loop

ret
end

Department of Electronics Page | 25


Microprocessor Laboratory

You might also like