Tài liệu này dành cho sinh viên, giáo viên khối ngành công nghệ thông tin tham khảo và có những bài học bổ ích hơn, bổ trợ cho việc tìm kiếm tài liệu, giáo án, giáo trình, bài giảng các môn học khối ngành công nghệ thông tin
Trang 1BÀI 9:
LẬP TRÌNH ðIỀU KHIỂN LCD 16x2
- Hiểu ñược cấu trúc và nguyên lý hoạt ñộng của LCD 16x2
- Nắm ñược phần cứng giao tiếp với vi ñiều khiển MCS51
- Viết ñược các chương trình ñơn giản ứng dụng LCD 16x2
- Hiểu và nắm ñược các chương trình con ñiều khiển LCD 16x2
- CONST (contrast): chỉnh ñộ tương phản (ñộ sáng của hình ảnh trên LCD)
- EN (Enable): cho phép ñọc/ghi dữ liệu Trong chế ñộ ñọc, EN tác ñộng bằng xung dương (cạnh lên) và trong chế ñộ ghi, EN tác ñộng bằng xung âm (cạnh xuống)
- RS (register selection): chọn thanh ghi lệnh (RS = 0) hoặc thanh ghi dữ liệu (RS = 1)
- R/W: ñọc (R/W = 1) hay ghi (R/W = 0)
- D7 – D4: bus dữ liệu (chế ñộ 8 bit: 4 bit cao, chế ñộ 4 bit: dùng cho truyền 4 bit cao và 4 bit thấp) Ngoài ra, bit D7 còn dùng làm ngõ ra cho cờ Busy
Hình 8-1 là sơ ñồ giao tiếp với MCU Trong ñó, Error! Reference source not
found.8-1 (a) là sơ ñồ giao tiếp 4 bit dữ liệu với MCU; Error! Reference source not found.8-1 (b) là sơ ñồ giao tiếp 8 bít
Trong sơ ñồ giao tiếp 4 bits thì người ta chỉ sử dụng 4 bits cao (DB4 ñến DB7) Khi
ñó, dữ liệu hoặc ñịa chỉ 8 bits ñược ñọc (hoặc ghi) 2 lần liên tiếp: lần ñầu ñọc 4 bits
cao, lần sau ñọc 4 bits thấp
- D3 – D0: 4 bit thấp trong chế ñộ 8 bit hay bỏ trống trong chế ñộ 4 bit
- A, K: anode và cathode ñèn nền của LCD
Trang 2Hình 8-1 – (a) Giao tiếp 4 bit (b) Giao tiếp 8 bit
a Các thành phần chức năng của LCD1602A:
- Cờ Busy (BF – Busy flag): Nếu BF = 1, LCD ñang trong quá trình thực thi một
lệnh Khi ñó, các lệnh gởi tiếp theo sẽ bị bỏ qua BF ñược ñọc tại chân D7 khi RS =
0 và R/W = 1 Do ñó, trước khi thực hiện một lệnh, cần kiểm tra BF trước, nếu BF
= 0 thì mới gởi lệnh
- DDRAM (Display Data RAM): chứa các ký tự sẽ hiển thị trên LCD, tối ña là
80x8 bit (80 ký tự) Khi hiển thị ở chế ñộ 1 dòng, ñịa chỉ của DDRAM có phạm vi
từ 00h ÷ 4Fh còn khi ở chế ñộ 2 dòng, ñịa chỉ DDRAM từ 00h ÷ 27h cho dòng 1 và 40h ÷ 67h cho dòng 2
- Bộ ñếm ñịa chỉ (AC - Address Counter): dùng ñể lưu ñịa chỉ hiện hành của
DDRAM và CGRAM, có thể thực hiện ñọc AC khi RS = 0 và R/W = 1
- CGROM (Character Genaration ROM): chứa các mô hình ký tự sẽ hiển thị trên
LCD, bao gồm 192 ký tự 5x7 theo bảng mã ASCII (nghĩa là khi DDRAM chứa giá trị 41h tương ứng với mã ASCII của ký tự ‘A’ thì trên LCD sẽ hiện ‘A’), trong ñó chỉ có các mã từ 00h – 0Fh sẽ không lấy theo mã ASCII mà lấy theo các ký tự ñã
ñịnh nghĩa trong CGRAM
- CGRAM (Character Genaration RAM): chứa các mô hình ký tự do người sử
dụng ñịnh nghĩa ñể hiển thị các ký tự không có sẵn trong CGROM
- CGRAM cho phép tạo tối ña 8 ký tự 5x8
MCU
RS R/W
E
DB4 – DB7
P1.1 P1.2 P1.3
P3
MCU
RS R/W
E
DB0 – DB7
P1.1 P1.2 P1.3
P3
Trang 3Bảng 8-1 Các ký tự ñịnh nghĩa trong CGRAM
Trang 4ðể ñịnh nghĩa một ký tự, thực hiện thay thế dấu ? bằng các giá trị 0 hay 1 tương ứng
và gởi vào CGRAM
Ví dụ: ðể ñịnh nghĩa chữ ð tại vị trí 1 trong CGRAM, ñịa chỉ và dữ liệu tương ứng là:
Trang 5Nghĩa là tại ñịa chỉ 00h của CGRAM chứa giá trị là 1Eh và tương tự cho ñến ñịa chỉ 07h
b Các chế ñộ truyền dữ liệu:
LCD1602A có 2 chế ñộ truyền dữ liệu: chế ñộ 8 bit (dùng cả D0 – D7) và chế ñộ 4 bit (không dùng D3 – D0, chỉ dùng D7 – D4) Trong trường hợp dùng chế ñộ 4 bit, dữ liệu 8 bit sẽ ñược truyền 2 lần: truyền 4 bit cao rồi tiếp tục truyền 4 bit thấp
Sau khi thực hiện truyền xong 8 bit, BF mới chuyển lên 1 Hai chế ñộ truyền này mô tả như hình 8-2 và hình 8-3
Trang 6Hình 8-3 ðịnh thời giao tiếp ở chế ñộ 4 bit
c Tập lệnh:
Bảng 8-2 - Tập lệnh của LCD1602A
Trang 7Ví dụ: I/D =1 là Increment
I/D = 0 là Decrement …
Trang 8Bảng 8-3 – Các lệnh thường dùng
d Sơ ñồ kết nối LCD 16x2 với MSC-51 trong hệ ET-LAB3A
Trang 9III Phần thực hành
Bài 1: Viết chương trình hiển thị chuỗi “DH CAN THO-KHOA CN” trên dòng 1 và
“BO MON DIEN TU – VIEN THONG” trên dòng 2 của LCD
a Chương trình mẫu gợi ý
; ðịnh nghĩa PORT ra LCD và ñiều khiển LCD
; Viết chương trình ở MOD 4 bit tất cả dùng ở PORT1
DATA EQU P1 ;Port LCD
EN bit P1.2 ;Enable LCD
WR bit P1.1 ;WR LCD
RS bit P1.0 ;RS Select LCD
ORG 0000H
MAIN: MOV SP,#256-32 ;Initial Stack 32 Byte
CALL DELAY ;initial delay
CALL INIT_LCD ;initial LCD
MOV A,#8 0H ;ðịa chỉ của vị trí ñầu dòng 1 trên LCD
CALL GOTOLCD ;Di chuyển con trỏ ñến 80H
MOV DPTR,#LINE1 ;Ghi chuỗi Hello World ra LCD tại vị trí 40H
LOOP: CLR A
MOVC A,@A+DPTR
CJNE A,#0FFH,PRINT ;Kết thúc việc hiển thị nếu gặp 0FFH
JMP NEXT
PRINT: CALL WRITE_DATA
INC DPTR
JMP LOOP
NEXT:
MOV A,#0C 0H ;ðịa chỉ của vị trí ñầu dòng 2 trên LCD
CALL GOTOLCD ;Di chuyển con trỏ ñến 0C0H
MOV DPTR,#LINE2 ;Ghi chuỗi Hello World ra LCD tại vị trí 40H
LOOP1: CLR A
MOVC A, @A+DPTR
CJNE A, #0FFH, PRINT1 ;Kết thúc việc hiển thị nếu gặp 0FFH
JMP EXIT
PRINT1: CALL WRITE_DATA
INC DPTR
JMP LOOP1
Trang 10EXIT:
JMP $
;*******************************************************
;* Write Instruction LCD *
;* Input : ACC (Command) *
;* Output : Data bus LCD *
;*******************************************************
WR_INS: MOV B,A
ANL A,#0F0H ;Giao tiếp 4 bits nên chỉ sử dụng 4 bits cao
MOV P1,A ;Ghi 4 bits cao lần ñầu
CALL EN_LCD ;Tạo xung E(nable)
MOV A,B ;Ghi 4 bits thấp lần sau
SWAP A
ANL A,#0F0H
MOV P1,A
CALL EN_LCD
RET
WRITE_DATA:
ANL A,#0F0H
SETB ACC.0
MOV P1,A
CALL EN_LCD
MOV A,B
SWAP A
ANL A,#0F0H
SETB ACC.0
MOV P1,A
CALL EN_LCD
RET
;ðoạn chương trình di chuyển ñến vị trí con trỏ
GOTOLCD: SETB ACC.7
CALL WRITE_INS
RET
;*******************************************************
;* ðoạn chương trình khởi tạo LCD *
;* Initial LCD *
;* 4-Bit Interface *
Trang 11;*******************************************************
INIT_LCD: CLR RS_LCD
MOV A,#33H ;Khởi tạo LCD (xem bảng 8-2)
CALL WR_INS
MOV A,#32H ;Chọn mode giao tiếp 4 bits
CALL WR_INS
MOV A,#28H ;Chọn giao tiếp 4 bits và hiển thị 2 lines (xem bảng 8-2)
CALL WR_INS ;Fonts ở chế ñộ 5x8 dots
MOV A,#01H ;Xoá display (xem tập lệnh bảng 8-3)
CALL WR_INS
MOV A,#02H ;ðưa con trỏ về ñầu dòng
CALL WR_INS
MOV A,#0FH ;Nhấp nháy con trỏ
CALL WR_INS
RET
;*******************************************************
;* Enable Pin E LCD *
;* Active Chip select *
;*******************************************************
EN_LCD: SETB E_LCD ;Enable LCD
CALL BUSY ;Busy delay time
CLR E_LCD ;Disable LCD
CALL BUSY
RET
;*******************************************************
;* Delay time for Busy *
;* Wait LCD Ready *
;*******************************************************
BUSY: PUSH 07H
PUSH 06H
MOV R6,#0B0H
BUSY1: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,BUSY1
POP 06H
POP 07H
RET
;*******************************************************
;* Delay Time *
;*******************************************************
DELAY: PUSH 07H
PUSH 06H
Trang 12DEL1: MOV R6,#0FFH
DEL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL2
POP 06H
POP 07H
RET
; -
LINE1: DB 'KHOA DIEN – DIEN TU', 0FFH
LINE2: DB 'BO MON DIEN TU – VIEN THONG', 0FFH
END
b Yêu cầu
- Chạy chương trình trên kiểm tra và cho nhận xét
- Hãy cho biết ý nghĩa của các chương trình con: BUSY, EN_LCD, INTI_LCD, WR_DATA VÀ WR_INS
- Tai sao cuối LINE1 và LINE2 có giá trin 0FFh ? Có thể thay giá trị này bằng một giá trị khác ñược không ? Hãy tìm những chỗ có thể thay thế giá trị 0FFh này Chạy chương trình kiểm chứng
- Lệnh SETB ACC.7 trong ñoạn GOTOLCD có ý nghĩa gì? (xem bảng 8-2)
- Sửa lại chương trình ñể hiển thị chuỗi LINE1 và LINE2 ở giữa LCD ?
- Sửa lại chương trình sao cho LINE1 và LINE2 dịch trái, dịch phải
- Sửa lại chương trình sao cho LINE1 dịch trái và LINE2 dịch phải và ngược lại
- Có thể sửa chương trình lại ñể cho LCD 16x2 hoạt ñộng ở chế ñộ truyền 8 bit ñược không? Tại sao? Nếu ñược hãy thử thay ñổi và kiểm chứng
- Phải sửa lại ñoạn lệnh INIT_LCD như thế nào ñể LCD hiển thị ở chế ñộ 1
line và font ở chế ñộ 5x10 dots (xem bảng 8-2)
- Sửa chương trình sao cho hiển thị ký tự A trên 1 dòng duy nhất
Bài 2: Chương trình sau ñây sẽ ñếm và hiển thị số ra LCD từ 0 ñến 9 rồi dừng Chú ý
con trỏ sẽ tự ñộng dịch phải sau khi in 1 số ñếm ra LCD Do ñó, ñể số ñếm sau sẽ hiển thị ñè lên số ñếm trước thì ta phải dịch ngược con trỏ 1 ñơn vị sau mỗi lần hiển thị số
ñếm
a Chương trình gợi ý mẫu:
DATA EQU P1 ;Port LCD
EN bit P1.2 ;Enable LCD
WR bit P1.1 ;WR LCD
Trang 13RS bit P1.0 ;RS Select LCD
ORG 0000H
MAIN: MOV SP,#256-32 ;Initial Stack 32 Byte
CALL DELAY ;initial delay
CALL INIT_LCD ;initial LCD
;ðây là ñoạn lệnh ñếm và hiển thị ra màn hình LCD
MOV R1,#0FFH
LOOP: INC R1
CLR A ; mov a, #00h
CALL GOTOLCD ; Dời con trỏ về ñầu dòng 1
MOV A,R1
ADD A,#30H
CALL WRITE_DATA ;Hiển thị số ñếm ra LCD
CALL DELAY
CALL DELAY
CALL DELAY
CJNE R1,#9H,LOOP ;Dừng hiển thị khi ñếm ñến 9
JMP $
;*******************************************************
;* Write Instruction LCD *
;* Input : ACC (Command) *
;* Output : Data bus LCD *
;*******************************************************
WR_INS: MOV B,A
ANL A,#0F0H ;Giao tiếp 4 bits nên chỉ sử dụng 4 bits cao
MOV P1,A ;Ghi 4 bits cao lần ñầu
CALL EN_LCD ;Tạo xung E(nable)
MOV A,B ;Ghi 4 bits thấp lần sau
SWAP A
ANL A,#0F0H
MOV P1,A
CALL EN_LCD
RET
WRITE_DATA:
ANL A,#0F0H
SETB ACC.0
MOV P1,A
CALL EN_LCD
MOV A,B
Trang 14SWAP A
ANL A,#0F0H
SETB ACC.0
MOV P1,A
CALL EN_LCD
RET
;ðoạn chương trình di chuyển ñến vị trí con trỏ
CALL WRITE_INS
RET
;*******************************************************
;* ðoạn chương trình khởi tạo LCD *
;* Initial LCD *
;* 4-Bit Interface *
;*******************************************************
INIT_LCD: CLR RS_LCD
MOV A,#33H ;Khởi tạo LCD (xem bảng 8-2)
CALL WR_INS
MOV A,#32H ;Chọn mode giao tiếp 4 bits
CALL WR_INS
MOV A,#28H ;Chọn giao tiếp 4 bits và hiển thị 2 lines (xem bảng 8-2) CALL WR_INS ;Fonts ở chế ñộ 5x8 dots
MOV A,#01H ;Xoá display (xem tập lệnh bảng 8-3)
CALL WR_INS
MOV A,#02H ;ðưa con trỏ về ñầu dòng
CALL WR_INS
MOV A,#0FH ;Nhấp nháy con trỏ
CALL WR_INS
RET
;*******************************************************
;* Enable Pin E LCD *
;* Active Chip select *
;*******************************************************
EN_LCD: SETB E_LCD ;Enable LCD
CALL BUSY ;Busy delay time
CLR E_LCD ;Disable LCD
CALL BUSY
RET
;*******************************************************
;* Delay time for Busy *
;* Wait LCD Ready *
;*******************************************************
BUSY: PUSH 07H
Trang 15PUSH 06H
MOV R6,#0B0H
BUSY1: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,BUSY1
POP 06H
POP 07H
RET
;*******************************************************
;* Delay Time *
;*******************************************************
DELAY: PUSH 07H
PUSH 06H
DEL1: MOV R6,#0FFH
DEL2: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,DEL2
POP 06H
POP 07H
RET
END
b Yêu cầu
- Quan sát số ñếm hiển thị trên LCD khi cho chạy chương trình? Chú ý: nếu số
ñếm hiểu thị quá nhanh, học viên hãy tăng số lần gọi DELAY sau khi hiển thị
số ñếm
- Tại sao phải cộng số ñếm với 30H trước khi cho hiển thị?
- Sửa lại chương trình trên ñể số ñếm hiển thị ñến 25?
- Sửa lại chương trình cho hiển thị ñồng hồ giờ phút giây tương ñối hiển thị trên LCD
- Sửa chương trình sao cho khi ấn SW1 = Px.2 thì tăng giá trị hiển thị trên LCD
là 1, còn khi ấn SW2 = Px.3 thì giảm giá trị hiển thị trên LCD xuống một Khi chạy chương trình thi LCD hiển thị 0000
-Hết -