【51单片机系列】proteus中的LCD12864液晶屏

文章来源:《单片机C语言编程与Proteus仿真技术》。

点阵字符型LCD显示模块只能显示英文字符和简单的汉字,要想显示较为复杂的汉字或图形,就必须采用点阵图型LCD显示模块,比如12864点阵图型LCD显示模块。

文章目录

  • [一、 LCD12864点阵图型显示模块](#一、 LCD12864点阵图型显示模块)
  • 二、12864的指令
  • [三、 12864 LCD接口应用使用示例](#三、 12864 LCD接口应用使用示例)

一、 LCD12864点阵图型显示模块

12864点阵图型LCD显示模块内部控制器采用KS0108或HD61202。其引脚排列如下图所示:

各引脚功能功能如下表:

|----|------|---------------|-------|----------|---------------|
| 引脚 | 符号 | 功能 | 引脚 | 符号 | 功能 |
| 1 | /CS1 | 1=选择左边64x64点 | 7 | RW | 1=数据读取,0=数据写入 |
| 2 | /CS2 | 1=选择右边64x64点 | 8 | E | 使能信号,负跳变有效 |
| 3 | GND | 地 | 9~16 | DB0~DB7 | 数据信号 |
| 4 | VCC | +5V电源 | 17 | /RST | 复位,低电平有效 |
| 5 | V0 | 显示驱动电源0~5V | 18 | -Vout | LCD驱动负电源 |
| 6 | RS | 1=数据输入,0=命令输入 | 有些模块19、20引脚为空脚 |||

12864点阵图型LCD内部存储器DDRAM与显示屏上的显示内容具有对应关系,使用时只需要将显示内容写入到1286412864内部显示存储器DDRAM中,就能正确显示。

12864点阵图型LCD屏横向有128个点,纵向有64个点,分为左半屏和右半屏。

DDRAM与显示屏的对应关系如下表:

|-----|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|---------|
| /CS1=1(左半屏) |||||| /CS2=1(右半屏) ||||||
| Y= | 0 | 1 | ... | 62 | 63 | 0 | 1 | ... | 62 | 63 | 行号 |
| X=0 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | 0 ↓ 7 |
| X=1 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | 8 ↓ 15 |
| ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
| X=7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | DB0 ↓ DB7 | 56 ↓ 63 |

在12864点阵图型LCD屏上显示图形或汉字时,可以利用字模提取软件获得图形或汉字的点阵代码。

二、12864的指令

12864点阵图型LCD显示模块的指令功能比较简单,共有8条指令。

  1. 读忙标志

编码格式为:

RS R/W E D7 D6 D5 D4 D3 D2 D1 D0
0 1 1 BUSY 0 ON/OFF RESET 0 0 0 0

BUSY=1表示显示模块内部控制器忙,不能进行操作,只有BUSY=0时才允许操作。

ON/OFF=1表示显示关闭,ON/OFF=0表示显示打开。

RESET=1表示复位状态,RESET=0表示正常状态。

在BUSY和RESET状态下,除读忙标志指令外,其它指令均不对液晶显示模块产生作用。

  1. 写指令

编码格式为:

|----|-----|-----|----|----|----|----|----|----|----|----|
| RS | R/W | E | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 0 | 0 | 下降沿 | 指令 ||||||||

  1. 写数据

编码格式为:

|----|-----|-----|----|----|----|----|----|----|----|----|
| RS | R/W | E | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 1 | 0 | 下降沿 | 显示数据 ||||||||

  1. 显示开/关

编码格式为:

RS R/W D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 1 1 1 1 D 3E/3F

D=1表示显示RAM中的内容,D=0表示关闭显示。

  1. 显示起始行

编码格式为:

|----|-----|----|----|----|----|----|----|----|----|
| RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 0 | 0 | 1 | 1 | 显示起始行(0~63) ||||||

该指令规定显示屏上起始行对应DDRAM的行地址,有规律地改变现实起始行,可以实现现实滚屏的效果。

  1. 页面地址

编码格式为:

|----|-----|----|----|----|----|----|----|----|----|
| RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 0 | 0 | 1 | 0 | 1 | 1 | 1 | 页面(0~7) |||

DDRAM共64行,分8页,每页8行。

  1. 列地址

编码格式为:

|----|-----|----|----|----|----|----|----|----|----|
| RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 0 | 0 | 0 | 1 | 显示列地址(0~63) ||||||

列地址计数器在每一次读/写数据后自动加1,每次操作后明确起始列的地址。设置了页面地址和列地址,就唯一确定了DDRAM中的一个单元。这样单片机就可以用读/写指令读出该单元中的内容或向该单元写进一个字节数据。

  1. 读数据

编码格式为:

|----|-----|----|----|----|----|----|----|----|----|
| RS | R/W | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
| 1 | 1 | 显示数据 ||||||||

该指令将DDRAM对应单元中的内容读出,然后列地址计数器自动加1.需要注意的是,进行读操作之前,必须有一次空读操作,紧接着再读才会读出所要求单元中的数据。

三、 12864 LCD接口应用使用示例

单片机与12864图型LCD模块之间可以采用直接方式接口,也可以采用间接方式接口。

如下图,在proteus仿真电路图中采用间接方式实现51单片机与12864图型LCD模块的接口电路。LCD模块的/CS1、/CS2、RS、R/W和E信号分别由单片机的P2.0、P2.1、P2.2、P2.3和P2.4来控制,数据信号连接到单片机的P0口。由于间接控制方式需要通过单片机的端口引脚来操作液晶模块,在编写驱动程序时要特别注意时序的配合。

软件设计,判断12864是否忙,根据读忙标志指令判断,代码如下:

c 复制代码
// 判断是否忙
void IsBusy()
{
	do
	{
		EN=0; 
		RW=1;  // 读操作
		RS=0;  // 0表示命令输入
		EN=1;  // 产生一个负跳变
		EN=0;
	}while(BUSY);  // BUSY=1时表示显示模块内部控制器忙
}

其中定义全局变量:

c 复制代码
#define PORT	P0
sbit CS1=P2^0;
sbit CS2=P2^1;
sbit RS=P2^2;
sbit RW=P2^3;
sbit EN=P2^4;
sbit BUSY=P0^7;  // 忙标志

其它指令按照类似的方式编写。编写清屏函数,为显示做准备,首先清左半屏,打开显示;清右半屏,关闭显示。设置每个点不显示字符,即写显示数据为0x00。代码如下:

c 复制代码
// 清屏,为显示做准备
void Ready()
{
	uint i,j;
	ClearLeft();  // 清左半屏
	WriteCom(0x3F);  // 显示开
	ClearRight();  // 清右半屏
	WriteCom(0x3F);  // 显示开
	ClearLeft();
	for(i=0;i<8;i++)
	{
		SetPage(i);  // 设置显示起始页
		SetCol(0x00);  // 设置显示起始列为第一列
		for(j=0;j<64;j++)
		{
			WriteDat(0x00);  // 设置每行的数据为00
		}
	}
	
	ClearRight();
	for(i=0;i<8;i++)
	{
		SetPage(i);
		SetCol(0x00);
		for(j=0;j<64;j++)
		{
			WriteDat(0x00);  // 设置每行的数据为00
		}
	}
}

每个汉字设置为16*16点阵大小,代码如下:

c 复制代码
// 显示16*16的汉字,纵向取模,字节倒序
void Display(uchar *s, uchar page, uchar line)
{
	uchar i;
	SetPage(page);
	SetCol(line);
	for(i=0;i<16;i++)
	{
		WriteDat(*s);
		s++;
	}
	SetPage(page+1);
	SetCol(line);
	for(i=0;i<16;i++)
	{
		WriteDat(*s);
		s++;
	}
}

主函数中声明字符点阵数据,比如汉字"单片机",点阵数据如下:

c 复制代码
// 字符点阵数据
uchar code Disp[]=
{
 //单(0) 片(1) 机(2)
0x00,0x00,0xF8,0x49,0x4A,0x4C,0x48,0xF8,0x48,0x4C,0x4A,0x49,0xF8,0x00,0x00,0x00,
0x10,0x10,0x13,0x12,0x12,0x12,0x12,0xFF,0x12,0x12,0x12,0x12,0x13,0x10,0x10,0x00,/*"单",0*/

0x00,0x00,0x00,0xFE,0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x00,0x00,
0x00,0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,0x00,/*"片",1*/

0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00/*"机",2*/
};

主函数中调用函数Display,如下:

c 复制代码
void main()
{
	uchar page=0x03;
	Ready();
	ClearLeft();
	Display(Disp, page, 0);
	Display(Disp+32, page, 16);
	Display(Disp+32*2, page, 16*2);
	while(1);
}

仿真结果:

相关推荐
@@庆1 小时前
stm32 PWR电源控制(修改主频&睡眠模式&停机模式&待机模式)
stm32·单片机·嵌入式硬件
JT灬新一1 小时前
STM32巡回研讨会总结(2024)
stm32·单片机·嵌入式硬件
爱桥代码的程序媛2 小时前
鸿蒙OpenHarmony【轻量系统芯片移植案例】标准系统方案之瑞芯微RK3568移植案例
嵌入式硬件·harmonyos·鸿蒙·鸿蒙系统·移植·openharmony·鸿蒙开发
Whappy0012 小时前
51单片机-DA(数字转模拟)
单片机·嵌入式硬件·51单片机
鸽子汤1972 小时前
想高效开发?从文件系统开始着手。。。
嵌入式硬件·物联网·硬件工程
Whappy0012 小时前
51单片机-AD(模拟信号转数字信号)-实验()
单片机·嵌入式硬件·51单片机
redcocal12 小时前
地平线秋招
python·嵌入式硬件·算法·fpga开发·求职招聘
辰哥单片机设计15 小时前
门磁模块详解(防盗感应开关 STM32)
stm32·单片机·嵌入式硬件·传感器
夜间去看海15 小时前
基于51单片机的自动清洗系统(自动洗衣机)
嵌入式硬件·51单片机·proteus·洗衣机