You are on page 1of 15

BÀI TN 3

GIAO TIẾP LCD VÀ ADC

THÍ NGHIỆM 1

Yêu cầu

Download chương trình mẫu LCD.A51 trên trang web bộ môn điện tử.

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

CODE:

LCD_E BIT P3.4


LCD_RS BIT P3.5
LCDADDREQU 6000H
ORG 0000H
MAIN:
MOV @R0, 30H
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
SJMP $
INIT_LCD:
MOV A, #38H
ACALL WRITECOM
MOV A, #0EH
ACALL WRITECOM
MOV A, #06H
ACALL WRITECOM
RET
CLEAR:
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
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
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
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
DJNZ B, LOOP
EXIT:
RET
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
MESSAGE:
DB "NHAN_LONG_NGHIA",0
END

KẾT QUẢ:

Kiểm tra

Giải thích ý nghĩa và cách sử dụng các chương trình con trên project mẫu

- Giải thích:
+ Chương trình con INITLCD: có nhiệm vụ khởi động module LCD
+ Chương trình con WRITECOM : có nhiệm vụ ghi 1 byte lệnh đến LCD
+ Chương trình con WAIT_LCD: sử dụng chương trình con tạo trễ để chờ module hoàn
thành lệnh hiện thời
+ Chương trình con DISPLAYSTRING: Chọn ký tự cần hiển thị
+ Chương trình con WRITETEXT: Xuất ra LCD
BÀI TN 3
GIAO TIẾP LCD VÀ ADC

THÍ NGHIỆM 2

Yêu cầu

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

CODE1:

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

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

CODE2:

GOTOXY:

CJNE R0,#1,HANG2

MOV A,#80H

BACK:

ADD A,R1

ACALL WRITECOM

RET

HANG2:

MOV A,#0C0H

SJMP BACK
BÀI TN 3
GIAO TIẾP LCD VÀ ADC

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

CODE3:

LCD_E BIT P3.4


LCD_RS BIT P3.5
LCDADDR EQU 6000H
ORG 0000H
MAIN:
MOV @R0, 30H
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
ACALL DISPLAYSTRING
MOV R0,#2
ACALL GOTOXY
MOV A,#16
ACALL LOOP
SJMP $
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
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
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
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
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
DJNZ B, LOOP
EXIT:
RET
WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
GOTOXY:
CJNE R0,#1,HANG2
MOV A,#80H
BACK:
ADD A,R1
ACALL WRITECOM
RET
HANG2:
MOV A,#0C0H
SJMP BACK
MESSAGE:
DB "NHAN_LONG_NGHIA",0,"NHOM4",0
END
Kiểm tra

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


BÀI TN 3
GIAO TIẾP LCD VÀ ADC

THÍ NGHIỆM 3

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

CODE 1:
READADC:
MOV DPTR, #4000H
MOVX @DPTR, A
ACALL DELAY_ADC
MOVX A, @DPTR
MOV R0,A
RET

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
CODE 2:
LCD_E BIT P3.4
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ORG 0000H
MAIN:
MOV @R0, 30H
MOV DPTR, #LCDADDR
MAIN1:
ACALL CLEAR
ACALL INIT_LCD
ACALL READADC
ACALL DISPLAYADC

MOV A,R2
ADD A,#30H
ACALL WRITETEXT

MOV A,R1
ADD A,#30H
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
ACALL WRITETEXT
MOV A,R0
ADD A,#30H
ACALL WRITETEXT
SJMP MAIN1
INIT_LCD:
MOV A, #38H; 8bit 2dong 5x7
ACALL WRITECOM
MOV A, #0CH; onLCD Cursor_mod
ACALL WRITECOM
MOV A, #06H ; cho hien thi them cac ky tu sau;
ACALL WRITECOM
MOV A,#0C0H
ACALL WRITECOM
RET
CLEAR:
MOV A, #01H; CLR
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
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
READADC:
MOV DPTR, #4000H
MOVX @DPTR, A
ACALL DELAY_ADC
MOVX A, @DPTR
MOV R0,A
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
RET
DELAY_ADC:
MOV R4, #100
DJNZ R4, $
RET
DISPLAYADC:
MOV A,R0
MOV B,#10
DIV AB
MOV R0, B
MOV B,#10
DIV AB
MOV R1, B
MOV B,#10
DIV AB
MOV R2, B
RET
END
Kiểm tra

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?

- Giá trị này không phải trị thực điện áp đặt vào kênh 0. Vì ADC0809 sử dụng 8 bit, từ 0
 255 để hiển thị giá trị áp từ 0  5V.

Để 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?

- Ta phải thực hiện phép toán: (Giá trị hiển thị*5)/255 = Giá trị hiển thị / 51
BÀI TN 3
GIAO TIẾP LCD VÀ ADC

THÍ NGHIỆM 4

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.
CODE:
CALADC:
MOV A,R0
MOV B,#51
DIV AB
MOV R0,A
MOV A,#5
MUL AB
MOV B,#51
DIV AB
MOV R1,A
MOV A,#5
MUL AB
MOV B,#51
DIV AB
MOV R2,A
MOV A,#5
MUL AB
MOV B,#51
DIV AB
CJNE A,#5,khac
khac:
JC NEXT
INC R2
NEXT:
MOV A,R1
MOV B,#10
MUL AB
ADD A,R2
MOV B,#2
MUL AB
MOV R1,A
RET
BÀI TN 3
GIAO TIẾP LCD VÀ ADC

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.
LCD_E BIT P3.4
LCD_RS BIT P3.5
LCDADDR EQU 6000H
ORG 0000H
MAIN:
MOV @R0, 30H
MOV DPTR, #LCDADDR
ACALL CLEAR
ACALL INIT_LCD
MOV R0,#1
MOV R1,#0
ACALL GOTOXY
MOV R2,#0
RETURN:
MOV A,R2
ACALL DISPLAYSTRING2
INC R2
CJNE R2,#8,RETURN
MOV R0,#1
MOV R1,#12
ACALL GOTOXY
MOV A,#19
ACALL DISPLAYSTRING2
MAIN1:
MOV R0,#1
MOV R1,#8
ACALL GOTOXY

ACALL READADC
ACALL CALADC
MOV A,R0
ADD A,#9
ACALL DISPLAYSTRING2
MOV A,#8
ACALL DISPLAYSTRING2
MOV A,R1
MOV B,#10
DIV AB
ADD A,#9
ACALL DISPLAYSTRING2
MOV A,B
ADD A,#9
ACALL DISPLAYSTRING2
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
SJMP MAIN1
INIT_LCD:
MOV A, #38H; 8bit 2dong 5x7
ACALL WRITECOM
MOV A, #0CH; onLCD Cursor_mod
ACALL WRITECOM
MOV A, #06H ; cho hien thi them cac ky tu sau;
ACALL WRITECOM
MOV A,#0C0H
ACALL WRITECOM
RET
CLEAR:
MOV A, #01H; CLR
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
MOVX @DPTR, A
CLR LCD_E
ACALL WAIT_LCD
RET
DISPLAYSTRING2:
MOV DPTR,#MESSAGE
MOVC A,@A+DPTR
ACALL WRITETEXT
RET
WAIT_LCD:
MOV R6,#10
DL1:
MOV R7, #250
DJNZ R7, $
DJNZ R6,DL1
RET
MESSAGE: DB "Voltage .0123456789V"

READADC:
MOV DPTR, #4000H
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
MOV A,#00H
MOVX @DPTR, A
ACALL DELAY_ADC
MOVX A, @DPTR
MOV R0,A
RET
DELAY_ADC:
MOV R4, #100
DJNZ R4, $
RET
GOTOXY:
CJNE R0,#1,HANG2
MOV A,#80H
BACK:
ADD A,R1
ACALL WRITECOM
RET
HANG2:
MOV A,#0C0H
SJMP BACK
CALADC:
MOV A,R0
MOV B,#51
DIV AB
MOV R0,A
MOV A,#5
MUL AB
MOV B,#51
DIV AB
MOV R1,A
MOV A,#5
MUL AB
MOV B,#51
DIV AB
MOV R2,A
MOV A,#5
MUL AB
MOV B,#51
DIV AB
CJNE A,#5,khac
khac:
JC NEXT
INC R2
NEXT:
MOV A,R1

MOV B,#10
MUL AB
BÀI TN 3
GIAO TIẾP LCD VÀ ADC
ADD A,R2
MOV B,#2
MUL AB
MOV R1,A
RET
END
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

You might also like