目录
介绍
GLCD是一种显示设备,可用于嵌入式系统,用于显示数据/或图像/自定义字符。
通常,128×64图形LCD是像素矩阵。
每个像素由其X和Y地址访问。
我们可以通过使其值为HIGH(1)来简单地可视化任何像素。
因此,我们可以使用GLCD逐个像素地进行任何图形设计。
要熟悉GLCD引脚及其功能,请趣讨教搜索:GLCD 128×64。有相关的介绍。
GLCD 128×64显示器的基本结构
开始给GLCD编程
让我们编写AT89S51微控制器在GLCD JHD12864E上打印文本字符的程序吧。
初始化
要初始化显示,我们需要执行以下步骤:
- 发送显示OFF命令,即0x3E;
- 发送Y地址,例如0x40(起始地址);
- 发送X地址(页面),例如0xB8(页面0);
- 发送Z地址(起始行),例如这里0xC0(从第0行开始);
- 现在发送Display ON命令,即0x3F。
GLCD_Init函数
输入参数:它没有输入参数。
返回类型:它不返回任何数据类型。
void GLCD_Init() /* GLCD initialize function */
{
CS1 = 1; CS2 = 1; /* Select left & right half of display */
RST = 1; /* Keep reset pin high */
delay(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 */
}
命令写
要编写命令,请执行以下步骤
- 在数据引脚上发送命令。
- 使RS = 0(命令寄存器)和RW = 0(写操作)。
- 在最小启用引脚上进行从高到低的转换。1我们期间。
GLCD_Command函数
输入参数:它有Command的输入参数。
返回类型:它不返回任何数据类型。
void GLCD_Command(char Command) /* GLCD command function */
{
Data_Port = Command; /* Copy command on data pin */
RS = 0; /* Make RS LOW to select command register */
RW = 0; /* Make RW LOW to select write operation */
E = 1; /* Make HIGH to LOW transition on Enable */
_nop_ ();
E = 0;
_nop_ ();
}
数据写入
要写入数据,请执行以下命令
- 在数据引脚上发送数据。
- 使RS = 1(数据寄存器)和RW = 0(写操作)。
- 在min 1 us周期的使能引脚上进行从高到低的转换。
GLCD_Data函数
输入参数:它有输入参数Data。
返回类型:它不返回任何数据类型。
void GLCD_Data(char Data) /* GLCD data function */
{
Data_Port = Data; /* Copy data on data pin */
RS = 1; /* Make RS HIGH to select data register */
RW = 0; /* Make RW LOW to select write operation */
E = 1; /* Make HIGH to LOW transition on Enable */
_nop_ ();
E = 0;
_nop_ ();
}
接口图
GLCD 128×64接口,带8051
文本显示程序
/*
*
8051 GLCD 128x64 Text character font
https://www.qutaojiao.com
*
*/
#include <reg51.h> /* Include reg51 header file */
#include <intrins.h> /* Include intrinsic header file */
#include "Font_Header.h" /* Include font header file */
#define Data_Port P3 /* Define data port for GLCD */
sbit RS = P2^0; /* Set control bits pins */
sbit RW = P2^1;
sbit E = P2^2;
sbit CS1 = P2^3;
sbit CS2 = P2^4;
sbit RST = P2^5;
void delay(k) /* Delay of msec with xtal = 11.0592MHz */
{
int i,j;
for (i=0;i<k;i++)
for (j=0;j<112;j++);
}
void GLCD_Command(char Command) /* GLCD command function */
{
Data_Port = Command; /* Copy command on data pin */
RS = 0; /* Make RS LOW to select command register */
RW = 0; /* Make RW LOW to select write operation */
E = 1; /* Make HIGH to LOW transition on Enable */
_nop_ ();
E = 0;
_nop_ ();
}
void GLCD_Data(char Data) /* GLCD data function */
{
Data_Port = Data; /* Copy data on data pin */
RS = 1; /* Make RS HIGH to select data register */
RW = 0; /* Make RW LOW to select write operation */
E = 1; /* Make HIGH to LOW transition on Enable */
_nop_ ();
E = 0;
_nop_ ();
}
void GLCD_Init() /* GLCD initialize function */
{
CS1 = 1; CS2 = 1; /* Select left & right half of display */
RST = 1; /* Keep reset pin high */
delay(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_ClearAll() /* GLCD all display clear function */
{
int i,j;
CS1 = 1; CS2 = 1; /* Select left & right half of display */
for(i=0;i<8;i++)
{
GLCD_Command((0xB8)+i); /* Increment page */
for(j=0;j<64;j++)
{
GLCD_Data(0); /* Write zeros to all 64 column */
}
}
GLCD_Command(0x40); /* Set Y address (column=0) */
GLCD_Command(0xB8); /* Set x address (page=0) */
}
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;
GLCD_Command(Page);
for(i=0;str[i]!=0;i++)
{
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_Data(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_Data(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_Data(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); /* Set Y address (column=0) */
}
余下程序:
输出结果
GLCD显示文本打印
编写程序让8051在GLCD上显示图像
我们使用相同的功能来显示除GLCD_String函数之外的文本,GLCD_String函数在此修改为在GLCD上打印图像数据。
- 这里我们使用AT89S51微控制器与GLCD连接。它具有有限的128字节RAM。
- 二进制图像的总大小为128×64像素。所以我们需要一个1024字节[(128 * 64)/ 8 = 1024字节]的数组来将图像存储在微控制器中。
- 现在的问题是,我们无法在RAM(数据存储器)中定义大小为1024的数组,因为它只有128字节。我们必须将它保存在ROM(代码存储器)中。要在代码存储器中定义任何变量,我们必须使用“code”关键字。
例如
unsigned char[ ]= "ABCDEFG"; /* array defined in Data memory (RAM) */
code unsigned char[ ]= "ABCDEFG"; /* array defined in Code memory (ROM) */
但是,代码存储器中定义的数组将需要更多时间来访问,8051使用“movc A,A + DPTR”指令,这通常需要更多的机器周期来执行。
- Image数组在Image.h文件中定义。
图像打印程序
/*
*
8051 128x64 graphic LCD
https://www.qutaojiao.com
*/
#include <reg51.h> /* Include reg51 header file */
#include <intrins.h> /* Include intrinsic header file */
#include "Image.h" /* Include image header file */
#define Data_Port P3 /* Define data port for GLCD */
sbit RS = P2^0; /* Set control bits pins */
sbit RW = P2^1;
sbit E = P2^2;
sbit CS1 = P2^3;
sbit CS2 = P2^4;
sbit RST = P2^5;
void delay(k) /* Delay of msec with xtal = 11.0592MHz */
{
int i,j;
for (i=0;i<k;i++)
for (j=0;j<112;j++);
}
void GLCD_Command(char Command) /* GLCD command function */
{
Data_Port = Command; /* Copy command on data pin */
RS = 0; /* Make RS LOW to select command register */
RW = 0; /* Make RW LOW to select write operation */
E = 1; /* Make HIGH to LOW transition on Enable */
_nop_ ();
E = 0;
_nop_ ();
}
void GLCD_Data(char Data) /* GLCD data function */
{
Data_Port = Data; /* Copy data on data pin */
RS = 1; /* Make RS HIGH to select data register */
RW = 0; /* Make RW LOW to select write operation */
E = 1; /* Make HIGH to LOW transition on Enable */
_nop_ ();
E = 0;
_nop_ ();
}
void GLCD_Init() /* GLCD initialize function */
{
CS1 = 1; CS2 = 1; /* Select left & right half of display */
RST = 1; /* Keep reset pin high */
delay(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_ClearAll() /* GLCD all display clear function */
int i,j;
CS1 = 1; CS2 = 1; /* Select left & right half of display */
for(i=0;i<8;i++)
{
GLCD_Command((0xB8)+i); /* Increment page */
for(j=0;j<64;j++)
{
GLCD_Data(0); /* Write zeros to all 64 column */
}
}
GLCD_Command(0x40); /* Set Y address (column=0) */
GLCD_Command(0xB8); /* Set x address (page=0) */
}
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;
for(page=0;page<16;page++)
{
for(column=0;column<64;column++)
{
GLCD_Data(str[column+k]);
}
CS1 = ~CS1; CS2 = ~CS2;
GLCD_Command((page_add+page_inc));
page_inc=page_inc+0.5;
k=k+64;
}
GLCD_Command(0x40);
GLCD_Command(0xB8);
}
余下程序:
输出图像
GLCD显示图像打印
GLCD上的动画
要在GLCD 128×64 JHD12864E显示屏上制作动画,请执行以下步骤,
- 拍摄两张或多张图像,使其序列产生运动错觉。
- 使用Image2GLCD应用程序将其转换为二进制图像数据。
- 然后按顺序将它们打印在GLCD上。它将创建动画。
- 请注意,在图像之间提供足够的延迟。
本节课项目工程文件和GLCD 128×64数据手册: