Vi xử lý, ví dụ như con chip intel hay ADM trong các máy tính thông thường,nó
không có RAM,ROM,cổng IO và các thiết bị ngoại vi on chip. Còn vi điều khiển chứa
một bộ vi xử lý,RAM,ROM,cổng IO và có thể chứa các thiết bị ngoại vi. Trong bài thực
hành này chúng ta chỉ nghiên cứu về vi điều khiển.
72 trang |
Chia sẻ: lvbuiluyen | Lượt xem: 3993 | Lượt tải: 5
Bạn đang xem trước 20 trang tài liệu Môn vi xử lý - Đề tài Led Cube 8x8x8, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Nhóm 1– Đ3dtvt
TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA ĐIỆN TỬ - VIỄN THÔNG
BÁO CÁO
THỰC TẬP MÔN VI XỬ LÝ
Đề tài : Led Cube 8x8x8
Giáo viên hướng dẫn: Hoàng Văn Đông
Sinh viên : NHÓM 1
Đinh Việt An
Phạm Văn Đông
Vũ Chung Kiên
Lớp : D3_DTVT
Nhóm 1– Đ3dtvt
Giới Thiệu Chung
1. Sự khác nhau giữa vi xử lý và vi điều khiển
Vi xử lý, ví dụ như con chip intel hay ADM trong các máy tính thông thường,nó
không có RAM,ROM,cổng IO và các thiết bị ngoại vi on chip. Còn vi điều khiển chứa
một bộ vi xử lý,RAM,ROM,cổng IO và có thể chứa các thiết bị ngoại vi. Trong bài thực
hành này chúng ta chỉ nghiên cứu về vi điều khiển.
2. Giới thiệu về dòng AT89C51
AT89C51 là một bộ vi xử lý 8 bit,loại CMOS,có tốc độ cao và công suất thấp với
bộ nhớ Flash có thể lập trình được.Nó được sản xuất với công nghệ bộ nhớ không bay
hơi mật độ cao của hãng Atmel, và tương thích với họ MCS-51TM về chân ra và tập lệnh.
Sơ đồ khối của AT89C51
Nhóm 1– Đ3dtvt
AT89C51 có các đặc trưng cơ bản sau : 4Kbyte Flash,128 byte RAM, 32 đường xuất
nhập,hai bộ định thời/đếm 16 bit,một cấu trúc ngắt hai ưu tiên và 5nguyên nhân ngắt,một post
nối tiếp song công,mạch dao động và tạo xung clock trên chip. AT89C51 được thiết kế với logic
tĩnh cho hoạt động có tần số giảm xuống 0 và hỗ trợ hai chế độ tiết kiệm năng lượng được lựa
chọn bằng phần mềm.Chế độ nghỉ dừng CPU trong khi vẫn cho phép RAM,các bộ dịnh
thời/đếm,port nối tiếp và hệ thống ngắt tiếp tục hoạt động. Chế độ nguồn giảm duy trì nội dung
của RAM nhưng không cho mạch dao động cung cấp xung clock nhằm vô hiệu hóa các hoạt
động khác của chip cho đến khi có reset cứng tiếp theo.
Trong họ AT89C51 ta đi nghiên cứu vi điều khiển 8051
3. Giới thiệu chung về 8051
a. Sơ đồ chân:
Là IC đóng vỏ dạng DIP có 40 chân,mỗi chân có một ký hiệu tên và chức năng như sau: chân 40
: nối với nguồn VCC (+5v); chân 20: nối với Mass GND; chân 29(PSEN)(program store
enable):là tín hiệu điều khiển xuất ra của 8051, nó cho phép chọn bộ nhớ ngoài và được nối
chung với chân OE(OutOut Enable) của EPROM ngoài để cho phép đọc các byte của chương
trình; chân 30(ALE: Adress Latch Enable): là tín hiệu điều khiển xuất ra của 8051 nó cho phép
phân kênh của bus địa chỉ và bus dữ liệu của port 0;chân 31(EA:Eteranl Acess): được đưa xuống
thấp cho phép chọn bộ nhớ ngoài.Đối với 8051 thi EA=5V chọn ROM nội, EA=0V chọn ROM
ngoại. 32 chân còn lại chia làm 4 cổng vào ra:
P0 từ chân 39 - 32 tương ứng là các chân P0_0 - P0_7
P1 từ chân 1 - 8 tương ứng là các chân P1_0 - P1_7
P2 từ chân 21 - 28 tương ứng là các chân P2_0 - P2_7
P3 từ chân 10 - 17 tương ứng là các chân P3_0 - P3_7
Riêng công 3 có 2 chức năng ở mỗi chân như hình vẽ:
P3.0 – RxD : chân nhận dữ liệu nối tiếp khi giao tiếp RS232(Cổng COM ).
P3.1 _ TxD : phân truyền dữ liệu nối tiếp khi giao tiếp RS232.
P3.2 _ INTO : interrupt 0 , ngắt ngoài 0.
P3.3 _ INT1: interrupt 1, ngắt ngoài 1.
P3.4 _T0 : Timer0 , đầu vào timer0.
P3.5_T1 : Timer1, đầu vào timer 1.
P3.6_ WR: Write, điều khiển ghi dữ liệu.
Nhóm 1– Đ3dtvt
P3.7 _RD: Read , điều khiển đọc dữ liệu.
Chân 18,19 nối với thạch anh tạo thành mạch dao động cho vi điều khiển.
Nhóm 1– Đ3dtvt
BÀI 1 : ĐIỀU KHIỂN IO VỚI LED ĐƠN
1. Lắp mạch
2. Nguyên lý hoạt động
Led nối từ chân vi điều khiển xuống đất vậy nếu chân vi điều khiển là 5V đèn sẽ
sáng,0V đèn tắt.
3. Lập trình
Trước hết điều khiển 1 LED,để điều khiển 1 LED ta chỉ việc gán chân nối đất của
LED đó với 0 hoặc 1 thì điện áp ở chân đó sẽ là 0V hoặc 5V tương ứng với điện áp đèn
sẽ sang hoặc tắt.Làm tương tự với các chân còn lại của vi điều khiển ta sẽ có một dãy các
đèn LED sang theo ý muốn. Ở đây ta sẽ điều khiển 8 LED.
CODE:
#include //khai bao thu vien//
#define bat 0 // dinh nghia bat den led//
#define tat 1 //dinh nghia tat den led//
//khai bao bien toan cuc
sbit led1= P2^0; //khai bao led1 kieu bit chan P2_0//
sbit led2= P2^1;
sbit led3= P2^2;
sbit led4= P2^3;
sbit led5= P2^4;
sbit led6= P2^5;
sbit led7= P2^6;
sbit led8= P2^7;
//*khai bao ham tre//
Nhóm 1– Đ3dtvt
void tre (long time)
{
long n;
for (n=0;n<time;n++);
}
//ham chinh//
void main (void)
{
while (1) //lap vo han//
{
led1=bat; //bat led 1 //
tre(1000); //tre mot khoang thoi gian//
led1=tat; //tat led 1//
tre(1000); //tre mot khoang thoi gian//
led2=bat;
tre(1000);
led2=tat;
tre(1000);
led3=bat;
tre(1000);
led3=tat;
tre(1000);
led4=bat;
tre(1000);
led4=tat;
tre(1000);
led5=bat;
tre(1000);
led5=tat;
tre(1000);
led6=bat;
tre(1000);
led6=tat;
tre(1000);
led7=bat;
tre(1000);
led7=tat;
tre(1000);
led8=bat;
Nhóm 1– Đ3dtvt
tre(1000);
led8=tat;
tre(1000);
led1=bat;
tre(1000);
led2=bat;
tre(1000);
led3=bat;
tre(1000);
led4=bat;
tre(1000);
led5=bat;
tre(1000);
led6=bat;
tre(1000);
led7=bat;
tre(1000);
led8=bat;
tre(1000);
led8=bat;
tre(1000);
led8=tat;
tre(1000);
led7=bat;
tre(1000);
led7=tat;
tre(1000);
led6=bat;
tre(1000);
led6=tat;
tre(1000);
led5=bat;
tre(1000);
led5=tat;
tre(1000);
led4=bat;
tre(1000);
led4=tat;
tre(1000);
Nhóm 1– Đ3dtvt
led3=bat;
tre(1000);
led3=tat;
tre(1000);
led2=bat;
tre(1000);
led2=tat;
tre(1000);
led1=bat;
tre(1000);
led1=tat;
tre(1000);
}
}
Sau khi chạy chương trình,kiểm tra lỗi va mô phỏng trên protus ta sẽ có mạch sau:
Tuy nhiên,với cách điều khiển từng chân của vi điều khiển như ở trên thì rất tốn
công,thay cách điều khiển từng chân như thông thường ta có thể xuất giá trị ra cả cổng.
Nguyên tắc thực hiện của cách này như sau: 1 cổng có 8 bit tổ hợp của 8 bit có
28=256 trạng thái.Khi đưa ra cổng 1 giá trị a thập phân (0-255) thì số a sẽ được đổi sang
hệ nhị phân rồi đưa ra các bit(chân) của cổng. Ví dụ : nếu có lệnh P1=1;vì 1(10)=0000
0001(2)nên chân P1_0(bit 0) sẽ bằng 1(5V) các chân còn lại đều bằng 0V. Chúng ta có thể
đưa ra cổng 1 giá trị hexa từ 0 tới ff tương ứng với 0 tới 255. Ví dụ P1=1 tương đương
Nhóm 1– Đ3dtvt
với P1=0x01; P1=10 tương đương với P1=0x0A.Như vậy chương trình xuất ra cả cổng
tương đương với chương trình điều khiển 8 LED từng chân như sau:
#include
/************************************/
void tre(int time)
{
int n;// khai bao bien cuc bo
for(n=0;n<time;n++); //lap time lan
}
/*******************************************/
void main()
{
while(1)
{
P2=0xFF;tre(5000);
P2=0xFE;tre(5000);
P2=0xFD;tre(5000);
P2=0xFB;tre(5000);
P2=0xF7;tre(5000);
P2=0xEF;tre(5000);
P2=0xDF;tre(5000);
P2=0xBF;tre(5000);
P2=0x7F;tre(5000);
P2=0x7f;tre(10000);
P2=0xBF;tre(10000);
P2=0xDF;tre(10000);
P2=0xEF;tre(10000);
P2=0xF7;tre(10000);
P2=0xFB;tre(10000);
P2=0xFD;tre(10000);
P2=0xFE;tre(10000);
P2=0x7e;tre(5000);
P2=0xBD;tre(5000);
P2=0xDB;tre(5000);
P2=0xE7;tre(5000);
P2=0xE7;tre(5000);
P2=0xDB;tre(5000);
P2=0xBD;tre(5000);
P2=0x7e;tre(5000);
}
Nhóm 1– Đ3dtvt
BÀI 2 : ĐIỀU KHIỂN LED 7 THANH DÙNG ANOT CHUNG
1. Led 7 đoạn
Led 7 đoạn có 2 loại la anot chung và katot chung,nó được cấu tạo chỉ là 8 con led đấu
chung 1 đầu anot hoặc katot.Led 7 đoạn có tất cả 10 chân được ký hiệu như hình vẽ
Mạch led sử dụng led anot chung như sau:
2. Nguyên lý hoạt động
Nhóm 1– Đ3dtvt
Khi cắm nguồn vào mạch tất cả các chân của các cổng IO của vi điều khiển 5V(nếu
cổng 0 không lắp điện trở treo thì sẽ là 0V). Nhìn sơ đồ mạch không có sự chênh lệch điện
áp nên không có đèn nào sáng. Ta muốn led nào sáng ta chỉ việc đưa ra điện áp 0V ở chân vi
điều khiển nối với thanh đó.
Thanh hiện Thanh tắt Giá trị(P2)
Để hiển thị số 1: B,C các thanh còn lại 1111 1001
Để hiển thị số 2: A,B,D,E,G các thanh còn lại 1010 0100
….
Để hiển thị số 8: Tât cả các thanh không thanh nào 1000 0000
Ngoài led 7 thanh còn có thể hiển thị 1 chữ số.ví dụ :
Hiển thị chữ A: thanh hiện A,B,C,E,F,G;thanh tắt D;giá trị của P2 :1000 1000
3. Lập trình
- Cách 1 : giống như bài thứ nhất, lập trình dễ hiểu không cần tính toán nhưng phải
viết copy,past và chỉnh sửa nhiều
- Cách 2 : cũng giống như ở bài trên chúng ta điều khiển từng cổng không theo từng
chân như ở cách 1,tuy nhiên phải tính toán nhiều.
Ở đây chúng ta sẽ làm theo cách 2,ta có code sau:
#include // dinh nghia
//khai bao bien toan cuc
unsigned char i;
unsigned char so_dem[] =
{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
//so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
unsigned char so_dem2[] = {0x00
,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
//so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
//chuong trinh con
void taotre(long time )
{
int n;
for(n=0;n<time;n++);
}
//chuong trinh chinh
void main(void)
{
unsigned char j=0; //khai bao bien
P1 = 0x00;
while(1) //tao vong lap 99
{
for(i=0;i<10;i++) //chay dem
{
P1 = (so_dem2[i]|so_dem[j]); //khai bao hang don vi
taotre(7000); //tao tre
if(i==9)
{
Nhóm 1– Đ3dtvt
j++;
P1=(so_dem[j]|so_dem2[i]); //khai bao hang chuc
if(j==10) //cho hang
chuc den 9 roi ve 0
j=0;
}
}
}
}
Sau khi chạy chương trình và kiểm tra lỗi thì kết quả hiển thị trên protus như sau :
Nhóm 1– Đ3dtvt
BÀI 3 : ĐỌC BÀN PHÍM
(Đọc ma trận phím)
1. Nhiệm vụ : quyét bàn phím 16 phím (4x4),xem phím nào được bấm,các phím được đánh
số từ 0 đến 15 rồi hiển thị ra led 7 thanh.
2. Sơ đồ bàn phím :
3. Nguyên lý quét :
- Vì sao mạch phím đấu theo ma trận? vì nếu để đọc 16 nút bấm thông thường thì cần
phải đấu với 16 chân vi điều khiển. Còn nếu đấu theo ma trận thì ta chỉ cần 8 chân vi
điều khiển cũng có thể điều khiển được 16 phím bấm
- Có hai cách quét phím theo cột và theo hàng. Ở đây, chúng ta chọn cách quét phím
theo hàng.
- Bước 1: Ta đưa chân P3.0 nối hàng 1 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 1 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 2 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 3 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 4 được bấm thì cột 4_P3.7 sẽ có
giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Bước 2: Ta đưa chân P3.1 nối hàng 2 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 5 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 6 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 7 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 8 được bấm thì cột 4_P3.7 sẽ có
giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
Nhóm 1– Đ3dtvt
- Bước 3: Ta đưa chân P3.2 nối hàng 3 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 8 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 9 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 10 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 11 được bấm thì cột 4_P3.7 sẽ
có giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Bước 4: Ta đưa chân P3.3 nối hàng 4 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 12 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 13 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 14 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 15 được bấm thì cột 4_P3.7 sẽ
có giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Ta sẽ dung câu lệnh IF để kiểm tra.
4. Lập trình
CODE :
#include
unsigned char Ma[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8
2};
unsigned char stt=0,a;
sbit H_1 =P3^4;
sbit H_2 =P3^5;
sbit H_3 =P3^6;
sbit H_4 =P3^7;
sbit C_1 =P3^3;
sbit C_2 =P3^2;
sbit C_3 =P3^1;
sbit C_4 =P3^0;
void scan(void);
void delay( unsigned long time )
{
long i;
for(i=0;i<time;i++)
{;}
}
void scan()
{
H_1=1;
H_2=1;
H_3=1;
H_4=1;
C_1=0;
C_2=0;
C_3=0;
C_4=0;
if((!H_1)|(!H_2)|(!H_3)| (!H_4))
{
delay(100);
Nhóm 1– Đ3dtvt
if (!H_1)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_1 = 0;
if(!C_1) stt = 1;
else if (!C_2) stt = 2;
else if (!C_3) stt = 3;
else if (!C_4) stt = 4;
}
if (!H_2)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_2 = 0;
if(!C_1) stt = 5;
else if (!C_2) stt = 6;
else if (!C_3) stt = 7;
else if (!C_4) stt = 8;
}
if(!H_3)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_3 = 0;
if(!C_1) stt = 9;
else if (!C_2) stt = 10;
else if (!C_3) stt = 11;
else if (!C_4) stt = 12;
}
if(!H_4)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_4 = 0;
if(!C_1) stt = 13;
else if (!C_2) stt = 14;
Nhóm 1– Đ3dtvt
else if (!C_3) stt = 15;
else if (!C_4) stt = 16;
}
}
}
void main()
{
while(1)
{
scan();
P2=Ma[stt];
a=stt/10;
P0=Ma[a];
}
}
Sau khi chạy và kiểm tra lỗi ta có mạch chạy mô phỏng sau :
Nhóm 1– Đ3dtvt
BÀI 4 : ĐIỀU KHIỂN LCD 16X2
1. Nhiệm vụ : Điều khiển hiển thị LCD 16x2 dòng chữ : “Nhom 18-d3dtvt” và hiển thị thời
gian
2. Giới thiệu về LCD:
LCD 16x2 hiển thị được hai hàng mỗi hàng hiển thị được 16 ký tự.(LCD có 14 chân
được hiển thị như hình vẽ :
Thông số của LCD :
+Kích thước hiển thị : 16 ký tự x 2 dòng
+Màu hiển thị: đen/trắng
+Chế độ giao tiếp : 8 bít và 4 bít
+Cỡ chữ hiển thị : 5x7 hoặc 5x10
Cấu trúc của LCD :
LCD có tổng số 14 chân chia làm 3 nhóm:
Nhóm 1: (3 chân) Cấp nguồn VDD, VSS : cấp 5V, 0V
VEE: thay đổi điện áp để thay đổi độ tương phản
Nhãm 2: (8 chân) Vào ra thông tin với VĐK : Từ chân D0-D7
Nhãm 3 : (3 chân) Điều khiển việc vào ra thông tin : E,RS,R/W
E :(bật /tắt ) (cho phép/ không cho phép trao đổi thông tin với VĐK )
RS :(loại thông tin trao đổi)Thông tin trao đổi là lệnh điều khiển hay là
dữ liệu để hiển thị
R/W : (hướng truyền của thông tin) đọc trạng thái từ LCD hay thông tin cho VĐK để
Nhóm 1– Đ3dtvt
LCD hiển thị.
Cụ thể tên gọi và bảng chức năng của các chân được viết trong bảng sau :
Interface Pin Connections
Chân
số
Ký
hiệu Tên Mô tả chức năng
1 VSS Cấp nguồn 0V (GND)
2 VDD Cấp nguồn Nối với dương nguồn (+4.5V~+5.5V)
3 VEE Contrast
Điều chỉnh điện áp chân này sẽ tăng giảm độ tương
phản của LCD. cho nên nó thường được nối với biến
trở.
4 RS Chọn thanh ghi Nếu RS=0 : LCD nhận lệnh từ VĐK Nếu RS=1: LCD nhận dữ liệu từ VĐK để hiển thị
5 RW Read/Write Chọn chức năng ghi/ đọc
RS=1 : chọn chức năng đọc dữ liệu từ LCD vào VĐK
RS=0 : chọn chức năng ghi dữ liệu từ VĐKvào LCD để hiển thị
6 E Read Write enable
Cho phép/ ko cho phép LCD trao đổi thông tin với
VĐK.
Chờ khi E chuyển từ 10 thì tín hiệu ở các chân D0-
D7 mới được đưa vào LCD.
7 D0
Data bus 0-7
8 chân này được nối với
VĐK để vào/ra thông tin
8 D1
9 D2
10 D3
11 D4
12 D5
13 D6
14 D7
Nhóm 1– Đ3dtvt
Từ những đặc điểm và chức năng đã được đề cập ở trên ta có sơ đồ VDK sau :
3. Nguyên tắc hoạt động
Các chân Vcc Vee Vss : cấp dương nguồn -5V và đất tương ứng thì VEE dùng để điều
khiển chế độ tương phản của LCD.
Chân chọn thanh ghi RS(regiter select):Có hai thanh ghi trong LCD,chân RS được
dùng để chọn thanh ghi,như sau : nếu RS=0 thi thanh ghi mà lệnh được chọn để cho phép
người dùng gửi 1 lệnh chẳng hạn như xóa màn hình,đưa con trỏ về đầu dòng…nếu RS=1
thì thanh ghi dữ liệu được chọn cho phép người dùng gửi dữ liệu cần hiển thị trên LCD.
Chân đọc/ghi (R/W):Đầu vào đọc/ghi cho phép người dùng ghi thông tin trên LCD
khi RW=0 hoặc đọc thông tin từ nó khi RW=1.
Chân cho phép E(Enable):chân cho phép E được sử dụng bởi LCD để chốt dữ liệu
của nó.Khi dữ liệu được cấp đến chân dữ liệu thì một xung mức cao xuống thấp phải được
áp đến chân này để LCD chốt dữ liệu trên các chân dữ liệu.Xung này phải rộng tối thiểu
450ns.
Chân D0-D7: đây là 8 chân dữ liệu 8bit được dùng để gửi nội dung lên LCD hoặc
đọc nội dung của các thanh ghi trong LCD.Để hiển thị các chữ cái và các con số chúng ta
Nhóm 1– Đ3dtvt
sử dụng mã ASCII của các chữ cái từ A-Z,a-f và các con số từ 0-9 đến các chân này khi
RS=1.
Cũng có các mã lệnh được gửi đến LCD để xóa màn hình hoặc đưa con trỏ về đầu
dòng hoặc nhấp nháy con trỏ.
*Chú ý: Chúng ta có thể sử dụng RS=0 để kiểm tra bit bận để xem LCD có sẵn sàng
nhận thông tin.Cờ bận là bít D7 và có thể được đọc thi R/W=1 và RS=0 như sau:
Nếu R/W=1, RS=0, D7=1(cờ bận) thì LCD bận thì LCD bận bởi các công việc bên
trong và sẽ không nhận bất kỳ thông tin mới nào.Khi D7=0 thì LCD sẵn sàng nhận thông
tin mới.Lưu ý chúng ta nên kiểm tra cờ bận trước khi ghi bất kỳ dữ liệu nào lên LCD.
Sau đây là bảng mã lệnh của LCD:
Mã(Hex) Lệnh đến thanh ghi của LCD
1 Xóa màn hình hiển thị
2 Trở về đầu dòng
3 Giảm con trỏ (dịch con trỏ sang bên trái)
4 Tăng con trỏ (dịch con trỏ sang bên phải)
5 Dịch hiển thị sang phải
6 Dịch hiển thị sang trái
7 Tắt con trỏ,tắt hiển thị
8 Tắt hiển thị,bật con trỏ
A Bật hiển thị,tắt con trỏ
C Bật hiển thị,nhấp nháy con trỏ
E Tắt con trỏ,nhấp nháy con trỏ
F Dịch vị trí con trỏ sang trái
10 Dịch vi trí con trỏ sang phải
14
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển thị sang phải
80 Ép con trỏ về đầu dòng thứ nhất
C0 Ép con trỏ về đầu dòng thứ 2
38 Hai dòng và ma trận 5x7
Điều khiển LCD qua các bước sau:
- Bước 0: chẩn bị phần cứng.dùng tuốc vít xoay biến trở 5k điều chỉnh độ tương phản của
LCD.Xoay cho đến khi các ô vuông (các điểm ảnh)của LCD hiện lên thì xoay ngược biến trở lại
1 chút.
-Bước 1: Khởi tạo cho LCD.
-Bước 2: Gán giá trị cho các bit điều khiển các chân RS,R/W,EN cho phù hợp với các chế
độ.Hiển thị ký tự lên LCD hay thực hiện 1 lệnh của LCD.
-Bước 3: Xuất byte dữ liệu ra cổng điều khiển 8 bit dữ liệu của LCD.
-Bước 4: Kiểm tra cờ bận xem LCD sẵn sàng nhận dữ liệu mới chưa
-Bước 5: Quay vòng lại bước 1.
4. Lập trình
Nhóm 1– Đ3dtvt
Code :
#include
#include
//------------Khoi tao bien va cac gia tri gan-------------//
sbit RS_LCD = P2^5;
sbit RW_LCD = P2^6;
sbit E_LCD = P2^7;
//---------------Sau day la cac chuong trinh con------------//
unsigned char min,sec,hour,x0,x1;
//ngat do bo dinh thoi 0
void timer0_isr() interrupt 1
{
x0++;
if (x0==100)
{
x0 = 0;
x1++ ;
if (x1 == 100)
{
x1 = 0;
sec ++;
if (sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
}
//--------------Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban---------------//
void delay()
{
unsigned int i;
for(i=0;i<125;i++);
Nhóm 1– Đ3dtvt
}
//--------------Ham kiem tra co ban (busy_flag)--------------??
void kt_ban()
{
unsigned char x;
P0 = 0xff;
RS_LCD = 0;
RW_LCD = 1;
do
{
E_LCD = 1;
delay();
E_LCD = 0;
x=P0;
x=x&0x80;
}
while(x!=0x80);
}
//---------------Ham ghi lenh giao tiep voi LCD---------------//
void ghi_lenh(unsigned char lenh)
{
kt_ban();
P0 = lenh;
RS_LCD = 0; // Chon thanh ghi lenh
RW_LCD = 0; // Chon che do ghi du lieu tu 8051 vao LCD
E_LCD = 1;
delay();
E_LCD = 0;
}//------------*******-----------------//
//-----------Ham ghi ky tu ra LCD------------//
void ghi_kytu(unsigned char kytu)
{
kt_ban();
P0 = kytu;
RS_LCD = 1; // Chon thanh ghi du lieu
RW_LCD = 0; //che do ghi
E_LCD =1;
delay(); //xung cho phep chot du lieu >450ns
E_LCD = 0;
}
//-----------Ham ghi chuoi ky tu ra LCD------------//
void ghi_chuoi(char *str)
{
while(*str)
{
Nhóm 1– Đ3dtvt
// delay(50);
ghi_kytu(*str);
str++;
}
}
//-----------Ham khoi tao LCD------------//
void setting_LCD()
{
ghi_lenh(0x38);
ghi_lenh(0x01); // Xoa man hinh
ghi_lenh(0x0f); // Co dich h