0°

(五)51进阶:GLCD 128×64与AT89S51微控制器连接

介绍

GLCD是一种显示设备,可用于嵌入式系统,用于显示数据/或图像/自定义字符。

通常,128×64图形LCD是像素矩阵。

每个像素由其X和Y地址访问。

我们可以通过使其值为HIGH(1)来简单地可视化任何像素。

因此,我们可以使用GLCD逐个像素地进行任何图形设计。

要熟悉GLCD引脚及其功能,请趣讨教搜索:GLCD 128×64。有相关的介绍。

(五)51进阶:GLCD 128x64与AT89S51微控制器连接

GLCD 128×64显示器的基本结构

开始给GLCD编程

让我们编写AT89S51微控制器在GLCD JHD12864E上打印文本字符的程序吧。

初始化

要初始化显示,我们需要执行以下步骤:

  1. 发送显示OFF命令,即0x3E;
  2. 发送Y地址,例如0x40(起始地址);
  3. 发送X地址(页面),例如0xB8(页面0);
  4. 发送Z地址(起始行),例如这里0xC0(从第0行开始);
  5. 现在发送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 */
}

命令写

要编写命令,请执行以下步骤

  1. 在数据引脚上发送命令。
  2. 使RS = 0(命令寄存器)和RW = 0(写操作)。
  3. 在最小启用引脚上进行从高到低的转换。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_ ();
}

接口图

(五)51进阶:GLCD 128x64与AT89S51微控制器连接

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) */
}


余下程序:

当前内容已被隐藏,您需要登录才能查看

输出结果

(五)51进阶:GLCD 128x64与AT89S51微控制器连接

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);
} 

余下程序:

当前内容已被隐藏,您需要登录才能查看

输出图像

(五)51进阶:GLCD 128x64与AT89S51微控制器连接

GLCD显示图像打印

GLCD上的动画

要在GLCD 128×64 JHD12864E显示屏上制作动画,请执行以下步骤,

  1. 拍摄两张或多张图像,使其序列产生运动错觉。
  2. 使用Image2GLCD应用程序将其转换为二进制图像数据。
  3. 然后按顺序将它们打印在GLCD上。它将创建动画。
  4. 请注意,在图像之间提供足够的延迟。

本节课项目工程文件和GLCD 128×64数据手册:

当前内容已被隐藏,您需要登录才能查看

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论