BÀI 20 : LCD PIC16F887 XC8

4:57:00 AM
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:
lcd 16x02
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:
 chức năng 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 lệnh điều khiển lcd
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ự:
bảng địa chỉ lcd
- Đây là ảnh mô phỏng protues.

lcd pic16f887 xc8

- Đâ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);
  }
}
- Link download project Click here

Share this

Related Posts

Previous
Next Post »