Tài liệu hướng dẫn thực tập Vi điều khiển MSC-51 - Bà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
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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 3 Bảng 8-1 Các ký tự ñịnh nghĩa trong CGRAM Bài 9: Lập trình ñiều khiển LCD Trang IX- 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à: Bài 9: Lập trình ñiều khiển LCD Trang IX- 5 Nghĩ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 Hình 8-2 ðịnh thời giao tiếp ở chế ñộ 8 bit Bài 9: Lập trình ñiều khiển LCD Trang IX- 6 Hì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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 7 Ví dụ: I/D =1 là Increment I/D = 0 là Decrement … Bài 9: Lập trình ñiều khiển LCD Trang IX- 8 Bả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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 9 III. 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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 10 EXIT: 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: MOV B,A 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 * Bài 9: Lập trình ñiều khiển LCD Trang IX- 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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 12 DEL1: 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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 13 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 ;ðâ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: MOV B,A ANL A,#0F0H SETB ACC.0 MOV P1,A CALL EN_LCD MOV A,B Bài 9: Lập trình ñiều khiển LCD Trang IX- 14 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 * ;******************************************************* 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 Bài 9: Lập trình ñiều khiển LCD Trang IX- 15 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 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-----
File đính kèm:
- Tài liệu hướng dẫn thực tập Vi điều khiển MSC-51 - Bài 9 Lập trình điều khiển LCD 16x2.pdf