I. GIAO TIẾP VI ĐIỀU KHIỂN VỚI LCD
1. GIỚI THIỆU LCD
Giao tiếp với
led 7 đoạn có hạn chế vì chỉ hiển thị đƣợc các số từ 0 đến 9 hoặc số hex từ 0 đến
F
– không thể nào
hiển thị đƣợc các thông tin kí tự khác, nhƣng chúng sẽ đƣợc hiển thị đầy đủ
trên LCD.
LCD có rất nhiều
dạng phân biệt theo kích thƣớc từ vài kí tự đến hàng chục kí tự, từ 1 hàng đến
vài chục hàng.
LCD 16×2 có nghĩa là có 2 hàng, mỗi hàng
có 16 kí tự. LCD 20×4 có nghĩa là có 4
hàng, mỗi hàng
có 20 kí tự.
LCD 16×2 có
hình dáng như hình 5-54:
2. SƠ ĐỒ CHÂN CỦA LCD
LCD có nhiều loại
và số chân của chúng cũng khác
nhau nhƣng có 2 loại phổ biến là loại
14
chân và loại 16
chân, sự khác nhau là các chân nguồn cung cấp, còn các chân điều khiển thì
không
thay đổi, khi sử
dụng loại LCD nào thì phải t ra datasheet của chúng để biết rõ các chân.
Bảng 5-4: Các
chân của LCD:
Trong 14 chân của
LCD đƣợc chia ra làm 3 dạng tín hiệu nhƣ sau:
Các chân cấp
nguồn: Chân số 1 là chân nối mass (0V),
chân thứ 2 là Vdd nối với nguồn +5V.
Chân thứ 3 dùng
để chỉnh contrast thƣờng nối với biến trở.
Các chân điều
khiển: Chân số 4 là chân RS dùng để điều
khiển lựa chọn thanh ghi. Chân R/W
dùng để điều
khiển quá trình đọc và ghi. Chân E là chân cho phép dạng xung chốt.
Các chân dữ liệu
D7÷D0: Chân số 7 đến chân số 14 là 8 chân dùng để trao đổi dữ liệu giữa thiết bị
điều khiển và LCD.
3. CÁC LỆNH ĐIỀU KHIỂN LCD:
Để điều khiển
LCD thì có các IC chuyên dùng được tích hợp bên dưới LCD có mã số 447801
đến các IC
447809. Trong IC này có bộ nhớ RAM dùng để lưu trữ dữ liệu cần hiển thị và thực
hiện việc điều khiển LCD hiển thị.
Bảng 5-5: Các lệnh
điều khiển bao gồm các lệnh đƣợc liệt kê nhƣ sau:
Lệnh xoá màn
hình “Clear Display”: khi thực hiện lệnh này thì LCD sẽ bị xoá và bộ đếm địa
chỉ được xoá về
0.
Lệnh di chuyển
con trỏ về đầu màn hình “Cursor Home”: khi thực hiện lệnh này thì bộ đếm
địa chỉ đƣợc
xoá về 0, phần hiển thị trở về vị trí gốc đã bị dịch trước đó. Nội dung bộ nhớ
RAM hiển thị DDRAM không bị thay đổi.
Lệnh thiết lập
lối vào “Entry mode set”: lệnh này dùng để thiết lập lối vào cho các kí tự hiển
thị, bit ID = 1
thì con trỏ tự động tăng lên 1 mỗi khi có 1 byte dữ liệu ghi vào bộ hiển thị,
khi ID = 0 thì con trỏ sẽ không tăng: dữ liệu mới sẽ ghi đè lên dữ liệu
cũ. Bit S = 1 thì cho phép dịch chuyển
dữ liệu mỗi khi nhận 1 byte hiển thị.
Bảng 5-5
- Lệnh điều khiển
con trỏ hiển thị “Display Control”: lệnh này dùng để điều khiển con trỏ (cho hiển thị thì
bit D = 1, tắt hiển thị thì bit D = 0), tắt mở con trỏ (mở con trỏ thì bit C =
1, tắt con trỏ thì bit C = 0), và nhấp nháy con trỏ (cho nhấp nháy thì bit B =
1, tắt thì bit B = 0).
- Lệnh di chuyển
con trỏ “Cursor /Display Shift”: lệnh này dùng để điều khiển di chuyển con trỏ
hiển thị dịch chuyển (SC = 1 cho phép dịch chuyển, SC = 0 thì không cho phép),
hướng dịch chuyển(RL = 1 thì dịch
phải, RL = 0 thì dịch trái). Nội dung bộ nhớ DDRAM vẫn không đổi.
- Lệnh thiết lập
địa chỉ cho bộ nhớ RAM phát kí tự “Set CGRAM Addr”: lệnh này dùng để thiết lập địa chỉ cho
bộ nhớ RAM phát kí tự.
- Lệnh thiết lập
địa chỉ cho bộ nhớ RAM hiển thị “Set DDRAM Addr”: lệnh này dùng để thiết
lập địa chỉ cho
bộ nhớ RAM lưu trữ các dữ liệu hiển thị.
Hai lệnh cuối
cùng là lệnh đọc và lệnh ghi dữ liệu LCD.
Dạng sóng các
tín hiệu khi thực hiện ghi dữ liệu vào LCD như hình 6-30:
Nhìn vào dạng
sóng ta có thể thấy được trình tự điều khiển như sau:
- Điều khiển tín hiệu RS.
- Điều khiển tín hiệu R/W xuống mức thấp.
- Điều khiển tín hiệu E lên mức cao để cho
phép.
- Xuất dữ liệu D7†D0.
- Điều khiển tín hiệu E về mức thấp.
- Điều khiển tín hiệu R/W lên mức cao trở lại.
4. ĐỊA CHỈ CỦA TỪNG KÍ TỰ TRÊN LCD
LCD16x2 có 2
hàng mỗi hàng 16 kí tự.
Hàng thứ nhất:
kí tự tận cùng bên trái có địa chỉ là
0x80, kí tự kế là 0x81, kí tự cuối cùng
là
0x8F.
Hàng thứ hai: kí tự tận cùng bên trái có địa chỉ là 0xC0, kí tự kế là 0xC1, kí tự cuối cùng
là 0xCF.
Bảng 5-6: địa
chỉ của từng kí tự:
- Đây là ảnh mô phỏng protues.
- Đây là code chương trình.
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 8000000
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7
#include "LCD.h"
// CONFIG1
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF // RE3/MCLR pin function select bit (RE3/MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
// CONFIG2
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
void main(void)
{
char s[20];
unsigned int a;
TRISD = 0x00;
Lcd_Init();
while(1)
{
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String(" LCD 16X2 DEMO ");
Lcd_Set_Cursor(2,1);
Lcd_Write_String(" BY LAM 3 NGON ");
__delay_ms(2000);
Lcd_Clear();
Lcd_Set_Cursor(1,1);
Lcd_Write_String("HTTP://XCVN.BLOGSPOT.COM");
for(a=0;a<15;a++)
{
__delay_ms(300);
Lcd_Shift_Left();
}
for(a=0;a<15;a++)
{
__delay_ms(300);
Lcd_Shift_Right();
}
Lcd_Clear();
Lcd_Set_Cursor(2,1);
Lcd_Write_String(" THANKS YOU ");
__delay_ms(2000);
}
}
EmoticonEmoticon