Báo cáo Thí nghiệm Vi xử lý - Nguyễn Trọng Tuấn
BÀI TẬP: Hiển thị dòng chữ ‘Hello’ lên màn hình LCD bắt đầu ở vị trí góc trái màn
hình.
ORG 2000H
EN BIT P3.4 ; đặt nhãn cho bit P3.4 (ứng với chân EN trên LCD)
RS BIT P3.5 ; đặt nhãn cho bit P3.5 (ứng với chân RS trên LCD)
MAIN:
CALL START ; gọi chương trình con START chứa các lệnh khởi tạo chương trình truy
xuất LCD
BÀI TẬP: Hiển thị dòng chữ ‘Hello’ lên màn hình LCD bắt đầu ở vị trí góc trái màn hình. ORG 2000H EN BIT P3.4 ; đặt nhãn cho bit P3.4 (ứng với chân EN trên LCD) RS BIT P3.5 ; đặt nhãn cho bit P3.5 (ứng với chân RS trên LCD) MAIN: CALL START ; gọi chương trình con START chứa các lệnh khởi tạo chương trình truy xuất LCD MOV R1,#5 ; số kí tự cần xuất lên LCD được gán giá trị cho R1 MOV A,#0 ; thanh ghi A kết hợp với con trỏ DPTR để truy xuất lần lượt các kí tự cần hiển thị lên LCD PUSH ACC ; cất giá trị thanh ghi ACC vào vùng stack pointer trước khi gọi chương trình con LOOP: ; vòng lặp CALL TRABANG ; gọi chương trình con để truy xuất lần lượt các kí tự trong bảng TABLE định vị trí sẵn trong vùng ROM nội CALL WRITE_TEXT ; gọi chương trình con hiển thị kí tự lên LCD POP ACC ; lấy lại giá trị thanh ghi ACC cất vào vùng stack pointer để tiếp tục quá trình truy xuất kí tự tiếp theo INC A ; tăng giá trị thanh ghi ACC lên 1 PUSH ACC ; cất lại giá trị thanh ghi ACC vào vùng stack pointer trước khi quay lại vòng lặp để gọi chương trình con truy xuất DJNZ R1, LOOP ; quay lại vòng lặp để gọi chương trình con truy xuất nếu chưa hiển thị hết kí tự cuối cùng trong chuỗi kí tự cần hiển thị SJMP $ ; nhảy tại chỗ khi hiển thị xong START : ; đoạn chương trình con chứa các lệnh khởi tạo chương trình MOV A,#01H ; lệnh xóa màn hình CALL INIT_LCD ; gọi chương trình để thực thi lệnh xóa màn hình MOV A,#38H ; lệnh qui định cách thức giao tiếp giữa LCD với 8051 bằng bus dữ liệu 8 bits CALL INIT_LCD MOV A,#0CH ; lệnh bật LCD ON , không hiển thị Cursor lên màn hình LCD CALL INIT_LCD MOV A,#06H ; lệnh đặt cấu hình cho LCD sao cho mỗi khi gửi đến LCD một kí tự thì Cursor tự động chuyển sang phải CALL INIT_LCD MOV A,#80H; lệnh để đặt Cursor ở dòng đầu tiên góc trái trên LCD khi bắt đầu gửi kí tự CALL INIT_LCD RET INIT_LCD: ; đoạn chương trình xuất lệnh từ 8051 gửi xuống LCD thực hiện MOV DPTR,#8000H ; vị trí ngoại vi LCD trên sơ đồ giải mã địa chỉ của 8051 LCALL WAIT_LCD ; gọi chương trình đợi cho LCD thực hiện xong các lệnh trước đó ; sau khi LCD thực hiện xong các lệnh trước đó thì ta phải cấu hình cho các chân RS, EN trên LCD. Khi ta gửi một ra LCD thì tín hiệu trên chân RS phải ở mức thấp đồng thời khi có một xung kích cạnh xuống trên chân EN, dữ liệu trong thanh liệu ghi A sẽ đưa xuống LCD để thực hiện như một lệnh CLR RS MOVX @DPTR,A SETB EN CLR EN RET WRITE_TEXT: ; đoạn chương trình xuất kí tự từ vùng ROM nội của 8051 gửi xuống hiển thị ra LCD MOV DPTR,#8000H LCALL WAIT_LCD ; đợi cho LCD thực hiện xong những lệnh trước đó ; sau khi thực hiện xong các lệnh thì bắt đầu truyền gửi kí tự xuống LCD. Trước tiên ta phải để tín hiệu trên chân RS của LCD lên mức 1 và sau khi có một xung kích cạnh xuống trên chân EN thì dữ liệu trên thanh ghi A sẽ được xuất ra LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET TRABANG: MOV DPTR,#TABLE MOVC A,@A+DPTR RET WAIT_LCD: ; đoạn chương trình tạo trễ dùng Timer MOV TMOD ,#01H MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0 ,$ CLR TF0 CLR TR0 RET TABLE: DB 'Hello' END BÀI TẬP LÀM THÊM : Xuất tên các thành viên trong nhóm lên màn hình LCD trong đó cho chạy qua lại chuỗi kí tự đó trên LCD. Ta thực hiên tương tự như bài hiện chữ ‘Hello’ lên LCD ở quá trình xuất kí tự lên màn hình. Còn về quá trình điều khiển cho các kí tự chạy qua lại trên màn hình LCD thì ta bổ sung thêm đoạn code sau: CLR C ; tạo một biến điều chỉnh quá trình dịch trái phải thông qua cờ C LOOP4: MOV R3,#6 ; cho dịch dòng kí tự qua lại 6 khoảng cách JC NHAY ; vì ban đầu dòng kí tự đang ở mép trái màn hình nên ta cần cho dịch qua phải, cờ C=0, chương trình nhảy đến đoạn chương trình dịch phải chuỗi kí tự MOV A,#1CH ; ghi vào thanh A giá trị để dịch phải kí tự SJMP TT; nhảy đến đoạn chương trình thực hiện NHAY: MOV A,#18H; ghi vào thanh A giá trị để dịch trái kí tự TT: CALL INIT_LCD ; gọi chương trình truy xuất lệnh DJNZ R3,$-2 ; quay lại gọi chương trình truy xuất lệnh nếu chưa dịch đủ số khoảng cách qui định trong thanh ghi R3 CPL C ; đảo ngược cờ C, đồng nghĩa với việc thực hiển quá trình dịch chuyển ngược lại với quá trình trước đó SJMP LOOP4 ; quay lại chương trình dịch chuyển Ngoài ra chương trình còn có thêm các lệnh để dịch chuyển Cursor về vị trí tùy quy định ở hàng 2 ( như trong bài tập là MOV A,#0C2H) Chương trình chính : ORG 2000H RS BIT P3.5 EN BIT P3.4 MOV A,#01H CALL INIT_LCD MAIN: MOV DPTR,#8000H MOV A,#38H CALL INIT_LCD MOV A,#0CH CALL INIT_LCD MOV A,#06H CALL INIT_LCD MOV A,#01H CALL INIT_LCD MOV A,#80H CALL INIT_LCD MOV R1,#9 MOV A,#0 PUSH ACC LOOP: CALL TRABANG CALL WRITE_TEXT POP ACC INC A PUSH ACC DJNZ R1,LOOP MOV A,#0C2H CALL INIT_LCD MOV R1,#5 LOOP2: CALL TRABANG CALL WRITE_TEXT POP ACC INC A PUSH ACC DJNZ R1,LOOP2 CLR C LOOP4: MOV R3,#6 JC NHAY MOV A,#1CH SJMP TT NHAY: MOV A,#18H TT: CALL INIT_LCD DJNZ R3,$-2 CPL C SJMP LOOP4 SJMP $ INIT_LCD: MOV DPTR,#8000H LCALL WAIT_LCD CLR RS MOVX @DPTR,A SETB EN CLR EN RET WRITE_TEXT: MOV DPTR,#8000H LCALL WAIT_LCD SETB RS MOVX @DPTR,A SETB EN CLR EN RET TRABANG: MOV DPTR,#TABLE MOVC A,@A+DPTR RET WAIT_LCD: MOV TMOD ,#01H MOV R2,#3 LOOPA: MOV TH0,#HIGH(-50000) MOV TL0,#LOW(-50000) SETB TR0 JNB TF0 ,$ CLR TF0 CLR TR0 DJNZ R2,LOOPA RET TABLE: DB 'TUAN TUAN TUNG' END
File đính kèm:
- bao_cao_thi_nghiem_vi_xu_ly_nguyen_trong_tuan.pdf
- Bia.pdf