Tải bản đầy đủ (.doc) (23 trang)

Thiết kế mạch hiển thị chữ trên LCD 16x4 với các hình thức chữ chạy

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (783.67 KB, 23 trang )

BÀI TẬP LỚN
MÔN HỌC: CAD/CAM

1


PHẦN 1: VẼ MẠCH NGUYÊN LÝ, MẠCH IN, PHÂN TÍCH MẠCH
Bài 6:
1.Mạch nguyên lý:

2


Phân tích mạch nguyên lý:

- Dòng xoay chiều qua Diode cầu thành dòng một chiều. Cầu chì F1 bảo vệ
mạch khi quá tải. Tụ lọc C1 san phẳng dòng một chiều qua Diode cầu,
cung cấp nguồn một chiều cho mạch hoạt động.
- Biến áp T1 cùng với khối phần tử bên trái tạo thành mạch dao động nghẹt
hồi tiếp dương, với đầu hồi tiếp qua C3, R3. Tạo ra điện áp dao động xoay
chiều trên cuộn thứ cấp của T1.

3


- Đầu ra cuộn thứ cấp qua D2, D3 thành xung một chiều, sau khi qua các tụ
lọc C4, C5 tạo thành điện áp ra một chiều.
Đồng thời dòng ra một chiều được phân áp đưa vào khối hồi tiếp so quang
để ổn áp đầu ra.
- Nguyên tắc hoạt động: Dòng điện vào xoay chiều qua khối cầu Diode và
tụ lọc C1 thành dòng một chiều. R3 kết hợp với DZ1 ổn định điện áp định


thiên cho Q1 làm việc. Khi Q1 hoạt động sẽ đóng ngắt liên tục (tự dao
động), làm dòng qua cuộn L12 biến đổi liên tục nên xuất hiện dòng cảm
ứng qua cuộn thứ cấp L57 và cuộn hồi tiếp L34. Điện áp hồi tiếp dương
(thông qua cuộn dây L34 trong biến áp T1 kết hợp với C3, R3 ) đưa vào
chân B của Q1 để tạo điều kiện cho mạch dao động nghẹt hoạt động.
Dòng cảm ứng trên cuộn thứ cấp L57 qua 2 Diode D2, D3 và tụ các tụ lọc
C4, C5 sẽ nắn thành dòng điện một chiều. Đồng thời dòng điện sau khi
nắn bên thứ cấp sẽ đi qua mạch phân áp (R5, R9 và biến trở VR1, biến trở
này để chỉnh điện áp chuẩn cho việc lấy mẫu) để lấy mẫu điện áp đầu ra
4


đưa đến IC KA431 để dò sai. IC KA431 sẽ dò điện áp sai rồi đưa đến
Opto để truyền tính hiệu điện áp sau khi dò sai về chân B của Q1 để dao
động sau khi sửa sai.
- Giả sử điện áp đưa vào cầu Diode tăng cao sẽ làm cho Q1 tăng thông,
đồng nghĩa với việc điện áp ra bên thứ cấp biến áp T1 tăng lên, điện áp
bên thứ cấp tăng lên thì điện áp lấy mẫu ở mạch lấy mẫu tăng lên làm cho
điện áp dò sai qua IC KA431 tăng lên theo. Khi điện áp dò sai tăng lên
cộng với điện áp R4 cũng tăng lên (vì điện áp bên thứ cấp tăng lên) làm
cho con Opto dẫn mạnh lên. Khi Opto dẫn mạnh lên thì dòng điện qua CE
của transistor trong Opto tăng lên, mà cực C của transistor trong Opto nối
với cực B của Q1, vì thế nếu dòng qua CE trong Opto tăng lên sẽ làm cho
dòng điện phân cực cho Q1 giảm xuống. Dẫn đến Q1 giảm thông, Q1
giảm thông thì điện áp cuộn sơ cấp của biến áp T1 giảm, dẫn đến điện áp
cuộn thứ cấp của biến áp giảm xuống theo, làm điện áp đầu ra được ổn
định.
Với trường hợp điện áp đầu vào giảm, ta phân tích tương tự.
- Như vậy mạch điện có chức năng là một bộ nguồn sử dụng dao động
nghẹt, ổn áp với khối so quang.


5


2.Mạch in:
Sơ đồ mạch in trên Altium:

6


Mặt in lớp Bottom:

7


Mạch in dạng 3D:

8


PHẦN 2: THIẾT KẾ, MÔ PHỎNG MẠCH ĐIỆN TỬ
Bài 6:
Thiết kế mạch hiển thị chữ trên LCD 16x4 với các hình thức chữ chạy.
1.Sơ đồ mô phỏng trên Proteus:

2.Thiết kế:
- Sử dụng vi điều khiển PIC16F877A để điều khiển LCD16x4 ở chế độ 4bit với
các hình thức chữ chạy.
- Nhóm thiết kế 5 hình thức chạy chữ: chữ chạy trái, chữ chạy phải, chữ xếp từ
trái sang, chữ xếp từ phải sang và chữ chạy đung đưa. Một Button dùng để

chuyển qua lại giữa các hình thức chạy chữ.

9


a) Vi điều khiển PIC16F877A

PIC (Programmable Intelligent Computer - Máy tính khả trình thông
minh) là một họ vi điều khiển RISC (Reduced Instruction Set Computer - hay vi
điều khiển có tập lệnh rút gọn) được sản xuất bởi công ty Microchip
Technology.
PIC16F877A là vi điều khiển thuộc họ PIC16Fxxx với tập lệnh gồm 35
lệnh có độ dài 14bit. Mỗi lệnh đều được thực thi trong một chu kỳ xung clock.
Tốc độ hoạt động tối đa cho phép là 20MHz với một chu kỳ lệnh là 200ns. Bộ
nhớ chương trình 8Kx14bit, bộ nhớ dữ liệu 368x8byte RAM và bộ nhớ dữ liệu
EEPROM với dung lượng 256x8byte. Số Port I/O là 5 với 33 pin I/O. Có 8 kênh
chuyển đổi A/D.

10


 Các đặc tính ngoại vi bao gồm các khối chức năng:
- Timer0: Bộ đếm 8bit với bộ chia tần số.
- Timer1: Bộ đếm 16bit với bộ chia tần số. Có thể thực hiện chức năng đếm
dựa vào xung clock ngoài.
- Timer2: Bộ đếm 8 bit với bộ chia tần số, bộ Postcler.
- Hai bộ Capture/so sánh/điều chế độ rộng xung.
- Các chuẩn giao tiếp nối tiếp SSP, SPI và I2C.
- Chuẩn giao tiếp nối tiếp UART với 9bit địa chỉ.
- Cổng giao tiếp song song PSP với các chân điều khiển RD, WR

 Các đặc tính của vi điều khiển:
- Bộ nhớ Flash với khả năng ghi xóa được 100.000 lần.
- Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần.
- Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
- Khả năng tự nạp chương trình với sự điều khiển của phần mềm.
- Nạp được chương chình ngay trên mạch điện ICSP.
- Watchdog Timer với bộ dao động trong.
- Chức năng bảo mật chương trình.
- Chế độ Sleep.
- Có thể hoạt động với nhiều dạng Oscillator khác nhau.
Trong thiết kế, Port C của vi điều khiển được dùng để kết nối với LCD 16x4.
Chân RB0/INT được nối với một Button để sử dụng chức năng ngắt ngoài
INT_EXT để chuyển đổi các kiểu chạy chữ.

11


b) LCD 16x4

Chức năng các chân của LCD:
Chân Ký hiệu
1
2
3
4

5

Mô tả


Vss 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
VDD 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
VEE Điều chỉnh độ tương phản của LCD.
RS Chân chọn thanh ghi (Register select). Nối chân RS với logic “0”
(GND) hoặc logic “1” (VCC) để chọn thanh 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.
R/W Chân chọn chế độ đọc/ghi (Read/Write). Nối chân R/W với logic
“0” để LCD hoạt động ở chế độ ghi, hoặc nối với logic “1” để
LCD ở chế độ đọc.
12


6

E

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ận khi có 1 xung cho phép
của chân E.
+ Ở chế độ ghi: Dữ liệu ở bus sẽ được LCD chuyển và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ân E.
+ Ở chế độ đọc: Dữ liệu sẽ được LCD xuất ra DB0-DB7 khi phát
hiện cạnh lên (low-to-high transition) ở chân E và được LCD giữ

ở bus đến khi nào chân E xuống mức thấp.
7 - 14 DB0 - Tám đường của bus dữ liệu dùng để trao đổi thông tin với MPU.
DB7 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
15
Nguồn dương cho đèn nền
16

-

GND cho đèn nền

Tập lệnh của LCD:
Tên lệnh
Clear
Display

Hoạt động
Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx =

0

0

0


0

0

0

0

1

Lệnh Clear Display (xóa hiển thị) sẽ ghi một khoảng trống-blank (mã hiện kí
tự 20H) vào tất cả ô nhớ trong DDRAM, sau đó trả bộ đếm địa AC=0, trả lại
kiểu hiển thị gốc nếu nó bị thay đổi. Nghĩa là : Tắt hiển thị, con trỏ dời về
góc trái (hàng đầu tiên), chế độ tăng AC.
Return
home

Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx =

0

0

0

0

0


0

1

*

Lệnh Return home trả bộ đếm địa chỉ AC về 0, trả lại kiểu hiển thị gốc nếu
nó bị thay đổi. Nội dung của DDRAM không thay đổi.
Entry
mode set

Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx = 0

0

0

13

0

0

1

[I/D] [S]


I/D : Tăng (I/D=1) hoặc giảm (I/D=0) bộ đếm địa chỉ hiển thị AC 1 đơn vị

mỗi khi có hành động ghi hoặc đọc vùng DDRAM. Vị trí con trỏ cũng di
chuyển theo sự tăng giảm này.
S : Khi S=1 toàn bộ nội dung hiển thị bị dịch sang phải (I/D=0) hoặc sang
trái (I/D=1) mỗi khi có hành động ghi vùng DDRAM. Khi S=0: không dịch
nội dung hiển thị. Nội dung hiển thị không dịch khi đọc DDRAM hoặc
đọc/ghi vùng CGRAM.
Display

Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

on/off
control

DBx =

0

0

0

0

1

[D] [C]

[B]

D: Hiển thị màn hình khi D=1 và ngược lại. Khi tắt hiển thị, nội dung

DDRAM không thay đổi.
C: Hiển thị con trỏ khi C=1 và ngược lại.
B: Nhấp nháy kí tự tại vị trí con trỏ khi B=1 và ngược lại.
Chu kì nhấp nháy khoảng 409,6ms khi mạch dao động nội LCD là 250kHz.

Cursor

Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

or
display
shift

DBx =

0

0

0

1

[S/C] [R/L] *

*

Lệnh Cursor or display shift dịch chuyển con trỏ hay dữ liệu hiển thị
sang trái mà không cần hành động ghi/đọc dữ liệu. Khi hiển thị kiểu 2
dòng, con trỏ sẽ nhảy xuống dòng dưới khi dịch qua vị trí thứ 40 của

hàng đầu tiên. Dữ liệu hàng đầu và hàng 2 dịch cùng một lúc. Chi tiết
sử dụng xem bảng bên dưới:
S/C

R/L

Hoạt động

0

0

Dịch vị trí con trỏ sang trái (Nghĩa là giảm AC một đơn vị).

0

1

Dịch vị trí con trỏ sang phải (Tăng AC lên 1 đơn vị).

1

0

Dịch toàn bộ nội dung hiển thị sang trái, con trỏ cũng dịch
theo.

1

1


Dịch toàn bộ nội dung hiển thị sang phải, con trỏ cũng dịch
theo.

Function Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

14


set

DBx =

0

0

1

[DL] [N]

[F]

*

*

DL: Khi DL=1, LCD giao tiếp với MPU bằng giao thức 8 bit (từ bit DB7
đến DB0). Ngược lại, giao thức giao tiếp là 4 bit (từ bit DB7 đến bit DB0).
Khi chọn giao thức 4 bit, dữ liệu được truyền/nhận 2 lần liên tiếp. với 4 bit

cao gởi/nhận trước, 4 bit thấp gởi/nhận sau.
N : Thiết lập số hàng hiển thị. Khi N=0 : hiển thị 1 hàng, N=1: hiển thị 2
hàng.
F : Thiết lập kiểu kí tự. Khi F=0: kiểu kí tự 5x8 điểm ảnh, F=1: kiểu kí tự
5x10 điểm ảnh.
Set
CGRAM

Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
DBx = 0

1 [ACG][ACG][ACG][ACG][ACG][ACG]

address

Lệnh này ghi vào AC địa chỉ của CGRAM. Kí hiệu [ACG] chỉ 1 bit của
chuỗi dữ liệu 6 bit. Ngay sau lệnh này là lệnh đọc/ghi dữ liệu từ CGRAM tại
địa chỉ đã được chỉ định.

Set

Mã lệnh : DBx = DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

DDRAM
address

DBx =

1


[AD] [AD] [AD] [AD] [AD] [AD] [AD]

Lệnh này ghi vào AC địa chỉ của DDRAM, dùng khi cần thiết lập tọa độ hiển
thị mong muốn. Ngay sau lệnh này là lệnh đọc/ghi dữ liệu từ DDRAM tại
địa chỉ đã được chỉ định.

15


Địa chỉ của LCD 16x4:

 Địa chỉ khi gửi lệnh của hàng đầu tiên là 80h->8Fh
Hàng thứ hai là C0h->CFh
Hàng thứ ba là 90h->9Fh
Hàng thứ tư là D0h->DFh
(Hàng 1 và hàng 3 nối tiếp địa chỉ nhau, hàng 2 và hàng 4 nối tiếp địa chỉ
nhau)

16


3.Code chương trình:
#include <main.h>
#include <lcd.h>

int8 string[17]={"NHOM6_XLTH1"}; // Khai bao cac bien
int8 strleng=0;
int8 mode,i,j,k,l,m,n,ms;

void chuchayphai()

{
for(m=0;m<=3;m++) // Lap lai cho 4 hang
{
for(i=0;i<=(16-strleng);i++) // Tu mep trai den mep phai man hinh
{
setcursor(m,i);
wrtstring(string);
delay_ms(ms);
lcd_clear();
}

k=strleng;

// Doan chuyen tiep giua 2 hang

for(i=(16-strleng+1);i<=15;i++)
{
setcursor(m,i);
for (j=0;jsetcursor((m+1)%4,0);
for (l=k-1;ldelay_ms(ms);

17


k--;
lcd_clear();
}
}

}

void chuchaytrai()
{
for(m=0;m<=3;m++) // Lap lai cho 4 hang
{
for(i=(16-strleng+1);i>0;i--) // Tu mep phai den mep trai man hinh
{
setcursor(m,i-1);
wrtstring(string);
delay_ms(ms);
lcd_clear();
}

k=1;

// Doan chuyen tiep giua 2 hang

for(i=15;i>=(16-strleng+1);i--)
{
setcursor((m+1)%4,i);
for (j=0;j<16-i;j++) { wrtchar(string[j]); }
setcursor(m,0);
for (l=k;ldelay_ms(ms);
k++;
lcd_clear();

18



}
}
}

void xepchu_phai()
{
for(m=0;m<=3;m++) // Lap lai cho 4 hang
{
k=0; // Day tung chu vao tu trai sang phai
for(j=strleng;j>0;j--)
{
for(i=0;i<=(strleng+(16-strleng)/2)-1-k;i++)
{
lcd_clear();
for(l=(strleng+(16-strleng)/2)-1-k;l<=(strleng+(16-strleng)/2)-1;l++)
{ setcursor(m,l+1); wrtchar(string[l-((16-strleng)/2)+1]); }
setcursor(m,i); wrtchar(string[j-1]); delay_ms(ms/2);
}
k++;
}
delay_ms(ms*14);

k=0; // Day tung chu ra tu trai sang phai
for(j=strleng;j>0;j--)
{
for(i=(strleng+(16-strleng)/2)-1-k;i<=15;i++)
{
lcd_clear();


19


for(l=(16-strleng)/2-1;l<(strleng+(16-strleng)/2)-1-k;l++)
{ setcursor(m,l); wrtchar(string[l-(16-strleng)/2]); }
setcursor(m,i); wrtchar(string[j-1]); delay_ms(ms/2);
}
k++;
}
lcd_clear();
delay_ms(ms*14);
}
}

void xepchu_trai()
{
for(m=0;m<=3;m++) // Lap lai cho 4 hang
{
k=0; // Day tung chu vao tu phai sang trai
for(j=0;j{
for(i=15;i>=((16-strleng)/2)+k;i--)
{
lcd_clear();
for(l=((16-strleng)/2)-1;l<=((16-strleng)/2)-1+k;l++)
{ setcursor(m,l); wrtchar(string[l-((16-strleng)/2)]); }
setcursor(m,i); wrtchar(string[j]); delay_ms(ms/2);
}
k++;
}

delay_ms(ms*14);

20


k=0; // Day tung chu ra tu phai sang trai
for(j=0;j{
for(i=((16-strleng)/2)+1+k;i>0;i--)
{
lcd_clear();
for(l=(strleng+(16-strleng)/2);l>=((16-strleng)/2)+1+k;l--)
{ setcursor(m,l); wrtchar(string[l-(16-strleng)/2]); }
setcursor(m,i-1); wrtchar(string[j]); delay_ms(ms/2);
}
k++;
}
lcd_clear();
delay_ms(ms*14);
}
}

void chudungdua()
{
for(i=0;i<=16-strleng;i++) // Chay tu mep trai sang mep phai
{
lcd_clear();
for(k=0;k<=3;k++)
{
if((i+k)>(16-strleng)) l=16-strleng-((i+k)-(16-strleng));

else l=i+k;
setcursor(k,l);

21


wrtstring(string);
}
delay_ms(ms*2);
}

for(i=16-strleng-1;i>0;i--) // Chay tu mep phai sang mep trai
{
lcd_clear();
for(k=0;k<=3;k++)
{
if(i-k==255) l=1;
else if(i-k==254) l=2;
else l=i-k;
setcursor(k,l);
wrtstring(string);
}
delay_ms(ms*2);
}
}

#INT_EXT // Ham thuc hien chuong trinh phuc vu ngat
void change_mode()
{
mode++; ms=0; if (mode==5) mode=0; // Tang mode khi button duoc an

}

void main() // Chuong trinh chinh
{

22


mode=0; // Khoi dau voi mode 0
set_tris_b(0xff); // Cong B o che do vao
ENABLE_INTERRUPTS(INT_EXT); // Cho phep ngat ngoai EXT
ENABLE_INTERRUPTS(GLOBAL); // Cho phep ngat toan cuc
lcd_init(); // Khoi dong LCD
i=0; // Tinh chieu dai cua chuoi ky tu
while(string[i]) {strleng++; i++;}
while(1) // Lap lai lien tuc
{
ms=70; // Gia tri delay giua moi lan hien thi
switch (mode) // Chon che do dua vao bien mode
{
case 0: chuchaytrai(); break;
case 1: chuchayphai(); break;
case 2: xepchu_trai(); break;
case 3: xepchu_phai(); break;
case 4: chudungdua(); break;
}
}
}

23




×