Thứ Năm, 29 tháng 11, 2018

Giao tiếp GLCD 128x64

Giới thiệu

GLCD là một thiết bị hiển thị có thể được sử dụng trong các hệ thống nhúng để hiển thị dữ liệu và / hoặc hình ảnh / ký tự tùy chỉnh.
  • Về cơ bản, LCD đồ họa 128x64 là ma trận pixel.
  • Mỗi pixel được truy cập theo địa chỉ X và Y của chúng.
  • Chúng ta chỉ có thể hình dung bất kỳ pixel nào bằng cách làm cho giá trị của nó HIGH (1).
Do đó, chúng ta có thể tạo bất kỳ pixel thiết kế đồ họa nào bằng pixel bằng GLCD.
Cấu trúc cơ bản của màn hình GLCD 128x64
Lập trình GLCD

Hãy chương trình vi điều khiển PIC18F4550 để in ký tự chữ trên GLCD JHD12864E.
Khởi tạo
Để khởi tạo màn hình, chúng ta cần thực hiện các bước dưới đây,
  • Gửi lệnh OFF hiển thị tức là 0x3E
  • Gửi địa chỉ Y, ví dụ tại đây 0x40 (Địa chỉ xuất phát).
  • Gửi địa chỉ X (Trang) ví dụ ở đây 0xB8 (Trang0).
  • Gửi địa chỉ Z (Dòng bắt đầu), ví dụ ở đây 0xC0 (từ dòng 0).
  • Bây giờ gửi lệnh Hiển thị ON tức là 0x3F
Hàm GLCD_Init
Đối số đầu vào: Nó không có đối số đầu vào.
Kiểu trả về: Nó không trả về bất kỳ kiểu dữ liệu nào.
void GLCD_Init()  /* GLCD Initialization function */
{
    Ctrl_dir = 0;    /* Make Control pin as output */
    Data_dir = 0;    /* Make Data pin as output */
    OSCCON = 0x72;    /* Internal 8MHz OSC Frequency */
    RST = 1;     /* Make reset pin High */
    CS1 = 1; CS2 = 1;    /* Select Left half of display */
    MSdelay(20);
    GLCD_Command(0x3E);  /* Display OFF */
    GLCD_Command(0x40);  /* Set Y address (column=0) */
    GLCD_Command(0xB8);  /* Set x address (page=0) */
    GLCD_Command(0xC0);  /* Set z address (start line=0) */
    GLCD_Command(0x3F);  /* Display ON */
}

Viết lệnh
Để viết lệnh thực hiện các bước dưới đây
  • Gửi lệnh trên chân dữ liệu.
  • Thực hiện RS = 0 (Command Register) và RW = 0 (Write Operation).
  • Thực hiện chuyển đổi Cao sang Thấp trên Bật pin trong thời gian tối thiểu 1 chúng tôi.
Hàm GLCD_Command
Đối số đầu vào: Nó có đối số đầu vào của Command.
Kiểu trả về: Nó không trả về bất kỳ kiểu dữ liệu nào.
void GLCD_Command(char cmd) /* GLCD Command function */
{
    LCD_data = cmd;  /* Copy command on data pin */
    RS = 0;   /* Make RS LOW for command register*/
    EN = 1;   /* Make HIGH-LOW transition on Enable*/
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

Viết dữ liệu
Để ghi dữ liệu làm các lệnh dưới đây
  • Gửi dữ liệu trên các ghim dữ liệu.
  • Tạo RS = 1 (Đăng ký dữ liệu) và RW = 0 (Thao tác ghi).
  • Thực hiện chuyển đổi Cao sang Thấp trên Bật pin trong khoảng thời gian tối thiểu 1us.
Hàm GLCD_Data
Đối số đầu vào: Nó có đối số đầu vào Dữ liệu.
Kiểu trả về: Nó không trả về bất kỳ kiểu dữ liệu nào.
void GLCD_Char(char data) /* GLCD Data function */
{
    LCD_data = data;  /* Copy Data on data pin */
    RS = 1;   /* Make RS HIGH for data register */
    EN = 1;     /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

Sơ đồ giao thoa

LCD đồ họa giao tiếp với PIC18F4550

Chương trình in văn bản

/*
 * GLCD128x64 interface with PIC18F4550
 * 
 */

#include <pic18f4550.h>
#include "Configuration_header_file.h"
#include "Font_Header.h"

void GLCD_Init();
void GLCD_Command(char);
void GLCD_Char(char);
void GLCD_String(char page_no, char *str);
void GLCD_Clear();
void MSdelay(unsigned int);

#define RS   LATB0
#define EN   LATB1
#define CS1   LATB2
#define CS2   LATB3
#define RST   LATB4
#define LCD_data  LATD
#define Ctrl_dir  TRISB
#define Data_dir  TRISD


void main() 
{
    GLCD_Init(); /* GLCD Initialize function */
    GLCD_Clear(); /* GLCD Display clear function */
    GLCD_String(4,"PIC Microcontroller");  /* Print string on 4th page of GLCD */
    while(1);
}

void GLCD_Init() /* GLCD Initialization function */
{
    Ctrl_dir = 0; /* Make Control pin as output */
    Data_dir = 0; /* Make Data pin as output */
    OSCCON = 0x72; /* Internal 8MHz OSC Frequency */
    RST = 1;  /* Make reset pin High */
 CS1 = 1; CS2 = 1;/* Select Left half of display */
    MSdelay(20);
    GLCD_Command(0x3E); /* Display OFF */
    GLCD_Command(0x40); /* Set Y address (column=0) */
    GLCD_Command(0xB8); /* Set x address (page=0) */
    GLCD_Command(0xC0); /* Set z address (start line=0) */
    GLCD_Command(0x3F); /* Display ON */
}

void GLCD_Command(char cmd)/* GLCD Command function */
{
    LCD_data = cmd; /* Copy command on data pin */
    RS = 0;  /* Make RS LOW for command register*/
    EN = 1;  /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

void GLCD_Char(char data)/* GLCD Data function */
{
    LCD_data = data; /* Copy Data on data pin */
    RS = 1;  /* Make RS HIGH for data register */
    EN = 1;  /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

void GLCD_String(char page_no, char *str)/* GLCD string write function */
{
 unsigned int i,column,Page=((0xB8)+page_no),Y_address=0; 
 float Page_inc=0.5;             
 CS1 = 1; CS2 = 0; /* Select Left half of display */
 GLCD_Command(Page);
 for(i=0;str[i]!=0;i++) /* Print char in string till null */
 {
       if (Y_address>(1024-(((page_no)*128)+5)))
          break;
        if (str[i]!=32)
        {
            for (column=1;column<=5;column++)
            {
                if ((Y_address+column)==(128*((int)(Page_inc+0.5))))
                {
                    if (column==5)
                        break;
                    GLCD_Command(0x40);
                    Y_address = Y_address+column;
                    CS1 = ~CS1; CS2 = ~CS2;
                    GLCD_Command((Page+Page_inc));
                    Page_inc=Page_inc+0.5;
                }
            }
        }
        if (Y_address>(1024-(((page_no)*128)+5)))
            break;
        if((font[((str[i]-32)*5)+4])==0 || str[i]==32)
        {
            for(column=0;column<5;column++)
            {
                GLCD_Char(font[str[i]-32][column]);
                if((Y_address+1)%64==0)
                {
                    CS1 = ~CS1; CS2 = ~CS2;
                    GLCD_Command((Page+Page_inc));
                    Page_inc=Page_inc+0.5;
                }
                Y_address++;
            }
        }
        else
        {
            for(column=0;column<5;column++)
            {
                GLCD_Char(font[str[i]-32][column]);
                if((Y_address+1)%64==0)
                {
                    CS1 = ~CS1; CS2 = ~CS2;
                    GLCD_Command((Page+Page_inc));
                    Page_inc=Page_inc+0.5;
                }
                Y_address++;
            }
            GLCD_Char(0);
            Y_address++;
            if((Y_address)%64==0)
            {
                CS1 = ~CS1; CS2 = ~CS2;
                GLCD_Command((Page+Page_inc));
                Page_inc=Page_inc+0.5;
            }
        }
    }
 GLCD_Command(0x40);
}

void GLCD_Clear()
{
 int i,j;
 CS1 = 1; CS2 = 1;
 for(i=0;i<8;i++)
 {
  GLCD_Command((0xB8)+i);
  for(j=0;j<64;j++)
  {
   GLCD_Char(0);
  }
 }
 GLCD_Command(0x40);
 GLCD_Command(0xB8);
}

/*****************************Delay Function*****************************/

void MSdelay(unsigned int val)
{
     unsigned int i,j;
        for(i=0;i<=val;i++)
            for(j=0;j<165;j++);
}
Hình ảnh đầu ra

Lập trình PIC18F4550 để hiển thị hình ảnh trên GLCD
Chúng tôi đang sử dụng cùng một chức năng được sử dụng để hiển thị văn bản ngoại trừ GLCD_String, mà chúng tôi đã sửa đổi ở đây để in dữ liệu hình ảnh trên GLCD.

Chương trình in ảnh

/*
 * GLCD128x64 interface with PIC18F4550
 */

#include <pic18f4550.h>
#include "Configuration_header_file.h"
#include "Image.h"

void GLCD_Init();
void GLCD_Command(char);
void GLCD_Char(char);
void GLCD_String(char *str);
void GLCD_Clear();
void MSdelay(unsigned int);

#define RS LATB0
#define EN LATB1
#define CS1 LATB2
#define CS2 LATB3
#define RST LATB4
#define LCD_data LATD
#define Ctrl_dir TRISB
#define Data_dir TRISD


void main() 
{
    GLCD_Init(); /* GLCD Initialize function */
    GLCD_Clear(); /* GLCD Display clear function */
    GLCD_String(img); /* Print string on 0th page of GLCD */
    while(1);
}

void GLCD_Init() /* GLCD Initialization function */
{
    Ctrl_dir = 0; /* Make Control pin direction as output */
    Data_dir = 0; /* Make Data pin direction as output */
    OSCCON = 0x72; /* Internal 8MHz OSC Frequency */
    RST = 1;  /* Make reset pin High */
 CS1 = 1; CS2 = 1;/* Select first Left half of display */
    MSdelay(20);
    GLCD_Command(0x3E); /* Display OFF */
    GLCD_Command(0x40); /* Set Y address (column=0) */
    GLCD_Command(0xB8); /* Set x address (page=0) */
    GLCD_Command(0xC0); /* Set z address (start line=0) */
    GLCD_Command(0x3F); /* Display ON */
}

void GLCD_Command(char cmd)/* GLCD Command function */
{
    LCD_data = cmd; /* Copy command on data pin */
    RS = 0;  /* Make RS LOW for command register */
    EN = 1;  /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

void GLCD_Char(char data)/* GLCD Data function */
{
    LCD_data = data; /* Copy Data on data pin */
    RS = 1;  /* Make RS HIGH for data register */
    EN = 1;  /* Make HIGH-LOW transition on Enable */
    NOP();
    NOP();
    EN = 0;
    NOP();
    NOP();
}

void GLCD_String(char *str)/* GLCD string write function */
{
 int column,page,page_add=0xB8,k=0;
 float page_inc=0.5;
 CS1 = 1; CS2 = 0; /* Select left half of display */
 for(page=0;page<16;page++)  /* Print 16 pages(8 page of each half)*/
 {
  for(column=0;column<64;column++)
   {
    GLCD_Char(str[column+k]);
   }
   CS1 = ~CS1; CS2 = ~CS2;
   GLCD_Command((page_add+page_inc));
   page_inc=page_inc+0.5;
   k=k+64;  /* Increment pointer */
 }
 GLCD_Command(0x40); /* Set Y address (column=0) */
 GLCD_Command(0xB8); /* Set x address (page=0) */
}

void GLCD_Clear()
{
 int i,j;
 CS1 = 1; CS2 = 1; /* Select both left & right half of display */
 for(i=0;i<8;i++)
 {
  GLCD_Command((0xB8)+i); /* Increment page after 64 column */
  for(j=0;j<64;j++)
  {
   GLCD_Char(0); /* Write zeros to all 64 column */
  }
 }
 GLCD_Command(0x40); /* Set Y address (column=0) */
 GLCD_Command(0xB8); /* Set x address (page=0) */
}
/****************************Delay Function********************************/
void MSdelay(unsigned int val)
{
     unsigned int i,j;
        for(i=0;i<=val;i++)
            for(j=0;j<165;j++);
}
Hình ảnh đầu ra

Hoạt ảnh

Để tạo hoạt ảnh trên màn hình GLCD 128x64 JHD12864E, hãy thực hiện các bước dưới đây,
  • Chụp hai hoặc nhiều hình ảnh theo cách mà trình tự của chúng sẽ tạo ra ảo tưởng về chuyển động.
  • Chuyển đổi nó sang dữ liệu hình ảnh nhị phân bằng ứng dụng Image2GLCD.
  • Và in chúng trên GLCD theo chuỗi. Nó sẽ tạo ra hình ảnh động.
  • Lưu ý rằng cung cấp đủ độ trễ giữa các hình ảnh.
Code
Tập tin đính kèm




Không có nhận xét nào:

Đăng nhận xét