1. Trang chủ
  2. » Giáo Dục - Đào Tạo

Báo cáo môn học kỹ thuật vi điều khiển 1 interfacing lcd with pic16f877a

25 3 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Interfacing Lcd With Pic16f877a
Tác giả Nguyễn Hữu Khánh, Lê Hoàng Khánh
Người hướng dẫn TS. Nguyễn Kiều Tam
Trường học Trường Đại Học Tôn Đức Thắng
Chuyên ngành Kỹ Thuật Vi Điều Khiển 1
Thể loại Báo cáo
Năm xuất bản 2022
Thành phố Thành phố Hồ Chí Minh
Định dạng
Số trang 25
Dung lượng 1,9 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Lời cảm ơn Đầu tiên, chúng em xin gửi lờ i cảm ơn chân thành đến Trường Đại học Tôn Đức Thắngđã đưa môn học K ỹ Thuật Vi Điều Khiển 1vào trương trình giảng dạy.. Đặc biệt, chúng em xin

Trang 1

NGÀNH ĐIỆN TỬ - VIỄN THÔNG 

TRIỆU KHÁNH 420H0309

NGUYỄN HỮU KHÁNH 420H0308 

LÊ HOÀNG KHÁNH 420H0307

BÁO CÁO MÔN HỌC 

Kỹ Thuật Vi Điều Khiển 1 

 Người hướng dẫn  

TS Nguyễn Kiều Tam 

THÀNH PHỐ HỒ CHÍ MINH, Tháng 12 NĂM 2022

Trang 3

MỤC LỤC 

Lờ i cảm ơn 2

Interfacing LCD with PIC16F877A 3

1 Các linh kiện: 3

2 Mô tả linh kiện: 5

3 Mô tả mạch bằng phần mềm Proteus 8: 6

4 Mô tả code bằng phần mềm PIC C Compiler: 7

4.1 Tập tin file lcd.h 7

4.2 Tập tin file main.c 16

5 Mô tả nguyên lý hoạt động: 21

5.1 Mô phỏng lần 1: 21

5.2 Mô phỏng lần 2: 22

5.3 Mô phỏng lần 3: 23

Tài liệu tham khảo 23

Trang 4

Lời cảm ơn 

Đầu tiên, chúng em xin gửi lờ i cảm ơn chân thành đến Trường Đại học Tôn Đức

Thắngđã đưa môn học K ỹ Thuật Vi Điều Khiển 1vào trương trình giảng dạy Đặc

 biệt, chúng em xin gửi lờ i cảm ơn sâu sắc đến giảng viên bộ môn –  Thầy Nguyễn

Kiều Tamđã dạy dỗ, truyền đạt những kiến thức quý báu cho em trong suốt thờ i gian

học tậ p vừa qua Trong thờ i gian tham gia lớ  p học K ỹ Thuật Vi Điều Khiển 1 của

Thầy, chúngem đã có thêm cho mình nhiều kiến thức bổ ích, tinh thần học tậ p hiệu

quả, nghiêm túc Đây chắc chắn sẽ là những kiến thức quý báu, là hành trang để em

có thể vững bướ c sau này

Bộ môn K ỹ Thuật Vi Điều Khiển 1 là môn học thú vị, vô cùng bổ ích và có tính thực

tế cao Đảm bảo cung cấp đủ kiến thức, gắn liền vớ i nhu cầu thực tiễn của sinh viên.Tuy nhiên, do vốn kiến thức còn nhiều hạn chế và khả năng tiế p thu thực tế còn nhiều

 bỡ  ngỡ  Mặc dù chúngem đã cố gắng hết sức nhưng chắc chắn bài tiểu luận khó có

thể tránh khỏi những thiếu sót và nhiều chỗ còn chưa chính xác, kính mongThầy xem

xét và góp ý để bài tiểu luận của chúng emđượ c hoàn thiện hơn.

Chúng em xin chân thành cảm ơn! 

Trang 5

Interfacing LCD with PIC16F877A 

Trang 6

PIC16F877A

CRYSTAL

POT-HG

Trang 7

2 Mô tả linh kiện: 

- BUTTON: Một công tắc đơn cực là đơn giản Nó có một đầu ra và một đầu vào.Công tắc sẽ được đóng hoặc ngắt k ết nối hoàn toàn Chúng hoàn hảo cho việcchuyển đổi bật tắt Chúng cũng là một dạng công tắc tạm thờ i r ất phổ biến

- CAP: Tụ điện không phân cực là tụ điện không có cực âm hoặc dương Hai điện

cực của tụ điện không phân cực có thể đượ c cắm ngẫu nhiên vào mạch và sẽ không bị rò r ỉ

- CAP-POL: Tụ điện phân cực là những tụ điện có các cực dương và âm cụ thể.Trong khi sử dụng các tụ điện này trong các mạch điện, cần luôn chú ý r ằng

chúng đượ c k ết nối theo đúng cực

- CRYSTAL: Tinh thể thạch anh

- MINRES10K: Điện tr ở  

- POT-HG:Là điện tr ở  có thể chỉnh để thay đổi giá tr ị 

- PIC16F877A: là một Vi điều khiển PIC 40 chân và đượ c sử dụng hầu hết trongcác dự án vàứng dụng nhúng Nó cónăm cổng bắt đầu từ cổng A đến cổng E

 Nó có ba bộ định thời trong đó có 2 bộ định thờ i 8 bit và 1 bộ định thờ i là 16Bit

- LM016L: Nó có thể hiển thị 16 ký tự mỗi dòng và có 2 dòng như vậy Trongmàn hình LCD này, mỗi ký tự đượ c hiển thị trong ma tr ận pixel 5x7 Màn hình

ma tr ận điểm chữ số thông minh 16 x 2 có khả năng hiển thị 224 ký tự và biểu

tượ ng khác nhau Gồm 14 chân:

1   Chân nối đất cho LCD, khi thiết k ế mạch ta nối chân

này vớ i GND của mạch điều khiển

2   Chân cấ p nguồn cho LCD, khi thiết k ế mạch ta nối

chân này vớ i VCC=5V của mạch điều khiển

3   Chân này dùng để điều chỉnh độ tương phản của

LCD

Chân chọn thanh ghi (Register select) Nối chân RS

với logic “0” (GND) hoặc logic“1” (VCC) để chọnthanh ghi

+ Logic “0”: Bus DB0-DB7 sẽ  nối vớ i thanh ghi

lệnh IR của LCD (ở  chế độ “ghi”- write) hoặc nối

vớ i bộ đếm địa chỉ của LCD (ở  chế độ “đọc”- read)

+ Logic “1”: Bus DB0-DB7 sẽ nối vớ i thanh ghi dữ 

liệu DR bên trong LCD

Trang 8

Chân cho phép (Enable) Sau khi các tín hiệu đượ c

đặt lên bus DB0-DB7, các lệnh chỉ đượ c chấ p nhậnkhi có 1 xung cho phép của chân E

+Ở chế độ ghi: Dữ liệuở  bus sẽ đượ c LCD chuyểnvào (chấ p nhận) thanh ghi bên trong nó khi phát hiện

một xung (high-to-low transition) của tín hiệu chânE

+Ở chế độ đọc: Dữ liệu sẽ đượ c LCD xuất ra DB7 khi phát hiện cạnh lên (low-to-high transition)

DB0-ở  chân E và đượ c LCD giữ ở   bus đến khi nào chân

E xuống mức thấ p

Tám đườ ng của bus dữ liệu dùng để trao đổi thôngtin vớ i MPU Có 2 chế độ sử dụng 8 đườ ng bus này:+ Chế độ 8 bit: Dữ liệu đượ c truyền trên cả 8 đườ ng,

vớ i bit MSB là bit DB7

+ Chế độ 4 bit : Dữ liệu đượ c truyền trên 4 đườ ng

từ DB4 tớ i DB7, bit MSB là DB7

3 Mô tả mạch bằng phần mềm Proteus 8: 

Trang 9

4 Mô tả code bằng phần mềm PIC C Compiler: 

4.1. Tập tin file lcd.h 

#define _lcd_h_

#include <math.h>

#use delay(clock=4000000)

void lcd_init(void); // Hàm dùng để khởi động LCD.C

 byte lcd_read_byte(void); // Hàm xử ly doc thong tin (dang 8 bit) tu thong tindang 4 bit tu LCD.C

 byte lcd_read_nibble(void); // Hàm doc thong tin (dang 4 bit / nibble) tuLCD.C

void lcd_send_byte(byte address, byte n); // Hàm gui thong tin (byte) toi LCD.Ctai dia chi (address)

void lcd_send_nibble(byte n); // Hàm gui thong tin (dang 4 bit / nibble) sangLCD.C

void lcd_gotoxy(byte x, byte y); // Hàm thiet lap vi tri ghi tren LCD.C

char lcd_getc(byte x, byte y); // Hàm tra ve ky tu tai vi tri (x,y) tren LCD.C.void lcd_putc(char c); // Hàm se hien thi ky tu c tai vi tri ke tiep tren LCD.C.// Khai bao bien

// Dinh nghia cac thong so

#define LCD_RS_PIN PIN_B1 // Cac ket noi LCD.C voi vi dieu khien

#define LCD_RW_PIN PIN_B2

#define LCD_ENABLE_PIN PIN_B3

#define LCD_DATA4 PIN_B4

#define LCD_DATA5 PIN_B5

#define LCD_DATA6 PIN_B6

#define LCD_DATA7 PIN_B7

//!#define LCD_RS_PIN PIN_C0 // Cac ket noi LCD.C voi vi dieu khien

Trang 10

//!#define LCD_RW_PIN PIN_C1

//!#define LCD_ENABLE_PIN PIN_C2

//!#define LCD_DATA4 PIN_C3

//!#define LCD_DATA5 PIN_C4

//!#define LCD_DATA6 PIN_C5

//!#define LCD_DATA7 PIN_C6

/*

#define LCD_RS_PIN PIN_D1 // Cac ket noi LCD.C voi vi dieu khien

#define LCD_RW_PIN PIN_D2

#define LCD_ENABLE_PIN PIN_D3

#define LCD_DATA4 PIN_D4

#define LCD_DATA5 PIN_D5

#define LCD_DATA6 PIN_D6

#define LCD_DATA7 PIN_D7

*/

#define lcd_output_enable(x) output_bit(LCD_ENABLE_PIN, x) // Lenh dieukhien chan LCD_ENABLE_PIN

#define lcd_enable_tris() output_drive(LCD_ENABLE_PIN)

#define lcd_output_rs(x) output_bit(LCD_RS_PIN, x) // Lenh dieu khien chanLCD_RS_PIN

#define lcd_rs_tris() output_drive(LCD_RS_PIN)

#define lcd_output_rw(x) output_bit(LCD_RW_PIN, x) // Lenh dieu khien chanLCD_RW_PIN

Trang 11

#define lcd_line_one 0x00 // Dia chi RAM LCD.C cho hang thu 1.

#define lcd_line_two 0x40 // Dia chi RAM LCD.C cho hang thu 2

#define lcd_line_three 0x14

#define lcd_line_four 0x54

#define LCD_TYPE 0x02 // Thong tin cau hinh LCD.C: 0x00=5x7,

0x01=5x10, 0x02=2 lines

// Dinh nghia cac hang so

 byte const LCD_INIT_STRING[4] = {0x28 | (LCD_TYPE << 2), 0x0C, 0x01,0x06};

// Cac byte nay can thiet de gui toi LCD.C, dung de khoi dong cau hinh hoatdong cho LCD.C

// Byte 1: 0x20 | (LCD_TYPE << 2) - So bit du lieu giao tiep (DL), so dong hienthi (N), kieu ky tu (F)

// 0 0 1 DL N F x x (DL: Data Length, N: Number Line, F: Font)

// Truong hop 1: 0x20 - 4 bit / 1 dong / 5 x 7

// Truong hop 2: 0x24 - 4 bit / 1 dong / 5 x 10

// Truong hop 3: 0x28 - 4 bit / 2 dong / 5 x 7

// Byte 2: 0x0C - Dieu khien hien thi (Bat hien thi, tat con tro, tat nhap nhay contro)

// 0 0 0 0 1 D C B (D: Display, C: Cursor, B: Blink)

// Byte 3: 0x01 - Xoa hien thi va tra con tro ve dau dong

// Byte 4: 0x06 - Dat che do dau vao (Che do tang dia chi, tat dich chuyen hienthi)

// 0 0 0 0 0 1 I/D S (I/D: Increment/Decrement, S: Shift)

// Byte 5: - Doi con tro / hien thi

// 0 0 0 1 S/C R/L x x (S/C: Screen/Cursor, R/L: Right/Left)

// ***************************************************

Trang 12

void lcd_init(void) // Hàm dung de khoi dong LCD.C.

lcd_output_rs(0); // RS = 0 - Databus = Bus lenh

lcd_output_rw(0); // RW = 0 - Ghi thong tin vao LCD.C

lcd_output_enable(0); // EN = 0 - Cam truy xuat LCD.C

delay_ms(15); // Tao thoi gian tre 15ms (Thoi gian de LCD tu reset khi moi duoccap nguon)

for(i=1;i<=3;i++) // Doan lenh khoi dong LCD.C o che do 8 bit duoc thuc hien

3 lan lien tiep

{ // tai thoi diem ban dau (de dam bao cho LCD.C hoat dong on dinhtrong

lcd_send_nibble(0x03); // truong hop khi cung cap nguon cho LCD.C ma dien

Trang 13

} // Do co BF (Busy Flag) chua kiem tra duoc trong thoi diem nay, nen phai

// thuc hien 3 lan (xem luu do khoi dong LCD.C cua nha san xuat)

lcd_send_nibble(0x02); // Doan lenh khoi dong LCD.C o che do 4 bit Tu lucnay thi 4 bit cao duoc ghi

// ra truoc tien, sau do la 4 bit thap

Trang 14

// Tien hanh doc 4 bit cao cua thong tin tu LCD.C.

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

lcd_output_enable(1); // EN = 1 - Cho phep truy xuat LCD.C

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

high = lcd_read_nibble(); // Cat tam 4 bit du lieu (4 bit cao)

lcd_output_enable(0); // EN = 0 - Cam truy xuat LCD.C

// Tien hanh doc 4 bit thap cua thong tin tu LCD.C

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

lcd_output_enable(1); // EN = 1 - Cho phep truy xuat LCD.C

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

low = lcd_read_nibble(); // Cat tam 4 bit du lieu (4 bit thap)

lcd_output_enable(0); // EN = 0 - Cam truy xuat LCD.C

output_drive(LCD_DATA4); // Thiet lap chan port o che do ngo ra

Trang 15

n |= input(LCD_DATA4); // Doc lan luot cac bit tu bus du lieu.

{ // address = 0: Lenh / 1: Du lieu

// byte = Thong tin can gui (8 bit)

// Khai bao bien

// Dinh nghia ham

lcd_output_rs(0); // RS = 0 - Databus = Bus lenh

while(bit_test(lcd_read_byte(),7)); // Cho Busy Flag = 0 (LCD.C da xu ly xong).lcd_output_rs(address); // RS = address - Databus = Bus lenh/du lieu

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

lcd_output_rw(0); // RW = 0 - Ghi thong tin vao LCD.C

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

lcd_output_enable(0); // EN = 0 - Cam truy xuat LCD.C

lcd_send_nibble(n >> 4); // Goi ham truyen 4 bit cao sang LCD.C

lcd_send_nibble(n & 0x0F); // Goi ham truyen 4 bit thap sang LCD.C

}

Trang 16

// Dinh nghia ham.

output_bit(LCD_DATA4, bit_test(n, 0)); // Xuat lan luot cac bit len bus du lieu.output_bit(LCD_DATA5, bit_test(n, 1));

output_bit(LCD_DATA6, bit_test(n, 2));

output_bit(LCD_DATA7, bit_test(n, 3));

delay_cycles(1); // Tao tre 1 chu ky (t=1us voi fosc=4MHz)

lcd_output_enable(1); // Tao xung ghi thong tin vao LCD.C

delay_us(2); // Tao tre 2 chu ky (t=2us voi fosc=4MHz)

lcd_output_enable(0); // Tao xung ghi thong tin vao LCD - EN = 1->0 (High toLow)

Trang 17

else if(y==2) // Neu vi tri truy xuat thuoc hang 1.

address=lcd_line_two; // Nap dia chi RAM cua hang 1

// (x-1) vi LCD.C qui uoc cot dau tien co dia chi la 0

lcd_send_byte(0,0x80|address); // Goi ham truyen thong tin (lenh) sang LCD.C.} // Lenh: Thiet lap dia chi DDRAM cua LCD.C (addresss)

// Dinh nghia ham

lcd_gotoxy(x,y); // Xac dinh toa do LCD.C can truy xuat

while(bit_test(lcd_read_byte(),7)); // Cho Busy Flag = 0 (LCD.C da xu ly xong).lcd_output_rs(1); // RS = 1 - Databus = Bus du lieu

value = lcd_read_byte(); // Doc ve tu LCD.C

lcd_output_rs(0); // RS = 0 - Databus = Bus lenh

return(value); // Tra ve ma ky tu tai toa do yeu cau

Trang 18

// ***************************************************

void lcd_putc(char c) // Ham se hien thi ky tu c tai vi tri ke tiep tren LCD.C.{

// Khai bao bien

// Dinh nghia ham

switch (c)

{

case '\f': // Chuc nang xoa hien thi

lcd_send_byte(0,0x01); // Goi ham truyen thong tin (lenh) sang LCD.C.delay_ms(2); // Lenh: Xoa hien thi tren man hinh LCD.C (0x01)

 break;

case '\n': // Chuc nang bat dau hang thu 2

lcd_gotoxy(1,0x02); // Goi ham truyen thong tin (du lieu) sang LCD.C. break;

case '\b': // Chuc nang lui ve 1 vi tri

lcd_send_byte(0,0x10); // Goi ham truyen thong tin (lenh) sang LCD.C. break; // Lenh: Doi con tro sang trai (0x10)

default: // Chuc nang hien thi ky tu c tai vi tri ke tiep tren LCD.C

lcd_send_byte(1,c); // Goi ham truyen thong tin (du lieu) sang LCD.C. break;

}

}

4.2. Tập tin file main.c 

#include <16F877A.h> ////// Khai báo con PIC bạn sử dụng

Trang 19

#use delay(crystal=4000000) /////// Khai báo tần số dao động cấ p cho PIC

#include <lcd.h>

#define BUTTON_1 input(PIN_A0)

#define BUTTON_2 input(PIN_A1)

//================KHAI BAO BIEN TOAN CUC===================char Mang1[]={" Bao Cao Mon Hoc "};

//===============CHUONG TRINH CON=========================void _DichTrai(void);

void _DichPhai(void);

void _DieuKhien(void);

void _Delay(unsigned int16 Time);

//===============CHUONG TRINH NGAT========================//=================CHUONG TRINH CHINH======================void main()

{

lcd_init(); //khoi dong lcd

lcd_putc('\f'); //xoa trang man hinh lcd

Trang 20

//===============VIET CHUONG TRINH CON=====================void _DichTrai(void)

Trang 22

void _Delay(unsigned int16 Time)

Trang 23

5 Mô tả nguyên lý hoạt động: 

 5.1.  Mô phỏng lần 1: 

- Khởi động chochương trìnhchạy bấm cục BUTTON 1để chữ chạy từ bên

 phải qua bên trái

Trang 24

 5.2.  Mô phỏng lần 2: 

- Sau đó khi mình bấm cục BUTTON 2 thì chữ sẽ chạy từ bên trái về lại bên

 phải

Ngày đăng: 23/10/2023, 10:28

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w