51单片机 | LCD12864 液晶显示实验
文章目录
- 一、LCD12864 介绍
- 1.带字库 LCD12864
- 2.不带字库 LCD12864
- 二、硬件设计
- 三、软件设计
- 1.LCD12864 显示函数
- 2.主函数
- 四、实验现象
上一章我们学习了如何在 LCD1602
显示字符数据,我们知道 LCD1602
是字符型显示器,它不能显示汉字图形等。对于需要显示汉字或图形的项目中, LCD1602
无法实现,因此本章就来介绍一个可以实现字符、汉字、图形等显示的液晶屏– LCD12864
。 LCD12864
分为 带字库和不带字库两种。我们开发板上集成了一个 LCD12864
液晶显示器接口,它可兼容带字库和不带字库两种屏,将 LCD12864
液晶对应插入即可。本章要实现的功能是:系统运行时, LCD12864
上显示汉字字符信息。
一、LCD12864 介绍
LCD12864
液晶屏结构上与 LCD1602
一样,只是在行列数与显示像素上区别很大。LCD12864
,以下简称 12864,注意区分 LCD1602
和LCD12864
。12864 是 64行 128 列,当然也有可能会设计成 64 列 128 行,这里的行列不像 1602 那样,1602 是按照八行四列标准英文字符格式,以一行十六个字符,两列字符命名,而 12864 是以 128 列像素,64 行像素,也就是有 128*64
个像素点组成。就好比是 128 列 64 行的点阵。需要一行一列的去显示像素点。
通常显示一个汉字需要 16*16
个像素点,所以LCD12864
一行最多能显示 8 个汉字,最多能显示 4 行。通常显示一个字符需要 8*8
个像素点,所以 LCD12864
一行最多能显示 16 个字符,最多能显示 8 行。当然这是不依靠后期取模的显示情况,如果通过取模软件取模,然后将 LCD12864
按照 128*64
个像素点来显示,显示的内容就可能超过之前的,就拿字符来说,可以选择小号字体,通过取模软件将字符数据取出,然后将这些数据通过在对应的像素点上点亮或熄灭实现不同字体的显示。图像的显示原理也是这样。
常用的 12864
分为带字库和不带字库两种。
1.带字库 LCD12864
上图左侧为带字库 12864
显示字符和汉字,右侧为图形模式显示。注意:这里图形模式虽然显示了字符和汉字,但是并不是使用字库里的,显示的方法也是多样化的。
对于带字库 LCD12864
,最常见的标志就是在屏幕背后,会有存放字库的芯片。如下图所示:
LCD12864
带字库屏共有 20
个引脚,管脚功能如下:
LCD12864
的指令相对 LCD1602
要多一些,但常用指令基本上一样,下面来看下 LCD12864
带字库常用的指令。
- 功能设定:
0x30
- 清屏指令:
0x01
- 进入设定点:
0x06
- 显示状态开关设置:
0x0c
同 LCD1602
一样,LCD12864
内部也含有DDRAM
,与其对应的地址如下:
从上图可知,LCD12864
能直接显示的地址范围如下:
第一行:0X80-OX87;(一个汉字占用 2 个字节,共 8 个汉字)
第二行:0X90-0X97;
第三行:0X88-0X8F;
第四行:0X98-0X9F;
LCD12864
与 LCD1602
有太多的相似之处,包括通信时序,简直是一模一样,所以编写 LCD12864
的驱动程序时,可完全照搬 LCD1602
的。
2.不带字库 LCD12864
这种不带字库的 LCD12864
背面没有芯片,一般为转接板,将 12864
显示屏转接到开发板。这种显示屏的操作就像带字库的 12864
操作图片形式一样。 所有的显示都需要取模,取模方法和点阵取模一样。不带字库的 LCD12864
,从外形上看其体积比带字库 LCD12864
要小很多,因此也常称之为 MiniLCD12864
。
对于 MiniLCD12864
,要想显示汉字或其他字符需通过取字模方式来实现。要让其显示首先还得初始化,这个和 LCD1602
原理类似,即通过对其内部一些特殊寄存器设置实现特定功能。MiniLCD12864
内部驱动芯片有的是 ST7565P
。
本章实验,我们以简单易用的带字库 LCD12864
为例进行讲解,对于MiniLCD12864
等用到时再做辅助学习,不同品牌的 MiniLCD12864
,驱动芯片也不一样,所以没有带字库的 LCD12864
通用。
二、硬件设计
本实验使用到硬件资源如下:
- 带字库
LCD12864
液晶
开发板上集成了一个LCD12864
液晶接口,下面我们来看下开发板上LCD12864
液晶接口电路,如下图所示:
从上图中可知,该接口是LCD12864
与TFTLCD
彩屏共用的,LCD12864
占用下面20
个管脚,MiniLCD12864
是16
脚,而带字库的LCD12864
通常是20
脚。这样可以兼容带字库的LCD12864
和不带字库的LCD12864
。至于TFTLCD
后面章节会介绍。该电路中LCD12864
的8
位数据口LCD_D0-LCD_D7
与单片机的P0.0-P0.7
管脚连接,LCD12864
的RS
、RW
、E
脚与单片机的P2.6
、P2.5
、P2.7
管脚连接,LCD12864
的PSB
脚与单片机的P3.2
管脚连接,LCD12864
的RESET
复位脚直接连在VCC
上。当使用LCD12864
时,其他设备就不要占用这些管脚,即使要用也只能分时复用。
三、软件设计
本节所要实现的功能是:LCD12864
上显示汉字字符信息。
程序框架如下:
编写公共文件
打开public.c
,代码如下:#include "public.h"/* 函 数 名 : delay_10us 函数功能 : 延时函数,ten_us=1 时,大约延时 10us 输 入 : ten_us 输 出 : 无 */ void delay_10us(u16 ten_us) {while(ten_us--); }/* 函 数 名 : delay_ms 函数功能 : ms 延时函数,ms=1 时,大约延时 1ms 输 入 : ten_us 输 出 : 无 */ void delay_ms(u16 ms) {u16 i,j;for (i=ms;i>0;i--){for (j=110;j>0;j--);} }
其头文件
public.h
为/* 头文件作用如下:包含头文件,定义全局变量,声明函数 */ #ifndef _public_H #define _public_H#include "reg52.h"//对系统默认数据类型进行重定义 typedef unsigned char u8; typedef unsigned int u16;//函数声明 void delay_10us(u16 ten_us); void delay_ms(u16 ms);#endif
编写 LCD12864 显示函数
编写主函数
1.LCD12864 显示函数
打开 lcd12864.c
,代码如下:
#include "lcd12864.h"/*
* 函 数 名 : lcd12864_write_cmd
* 函数功能 : LCD12864 写命令
* 输 入 : cmd:指令
* 输 出 : 无
*/
void lcd12864_write_cmd(u8 cmd)
{LCD12864_RS=0;//选择命令LCD12864_RW=0;//选择写LCD12864_E=0;LCD12864_DATAPORT=cmd;//准备命令delay_ms(1);LCD12864_E=1;//使能脚 E 先上升沿写入delay_ms(1);LCD12864_E=0;//使能脚 E 后负跳变完成写入
}/*
* 函 数 名 : lcd12864_write_data
* 函数功能 : LCD12864 写数据
* 输 入 : dat:数据
* 输 出 : 无
*/
void lcd12864_write_data(u8 dat)
{LCD12864_RS=1;//选择数据LCD12864_RW=0;//选择写LCD12864_E=0;LCD12864_DATAPORT=dat;//准备数据delay_ms(1);LCD12864_E=1;//使能脚 E 先上升沿写入delay_ms(1);LCD12864_E=0;//使能脚 E 后负跳变完成写入
}/*
* 函 数 名 : lcd12864_init
* 函数功能 : LCD12864 初始化
* 输 入 : 无
* 输 出 : 无
*/
void lcd12864_init(void)
{LCD12864_PSB=1;//选择 8 位或 4 位并口方式lcd12864_write_cmd(0x30);//数据总线 8 位,基本指令操作lcd12864_write_cmd(0x0c);//整体显示关,游标显示关,游标正常显示lcd12864_write_cmd(0x06);//写入新数据后光标右移,显示屏不移动lcd12864_write_cmd(0x01);//清屏
}/*
* 函 数 名 : lcd12864_clear
* 函数功能 : LCD12864 清屏
* 输 入 : 无
* 输 出 : 无
*/
void lcd12864_clear(void)
{lcd12864_write_cmd(0x01);
}/*
* 函 数 名 : lcd12864_show_string
* 函数功能 : LCD12864 显示字符串
* 输 入 : x,y:显示坐标,x=0~7,y=0~3;str:显示字符串数据
* 输 出 : 无
*/
void lcd12864_show_string(u8 x,u8 y,u8 *str)
{if(y<=0)y=0;if(y>3)y=3;x&=0x0f; //限制 x,y 不能大于显示范围switch(y){case 0: x|=0x80;break;//第 1 行地址+x 的偏移case 1: x|=0x90;break;//第 2 行地址+x 的偏移case 2: x|=0x88;break;//第 3 行地址+x 的偏移case 3: x|=0x98;break;//第 4 行地址+x 的偏移}lcd12864_write_cmd(x);while(*str!='\0'){lcd12864_write_data(*str);str++;}}
这里的代码与上一节LCD1602液晶显示实验非常相似。其头文件lcd12864.h
如下:
#ifndef _lcd12864_H
#define _lcd12864_H#include "public.h"//定义LCD12864控制管脚
sbit LCD12864_RS = P2^6; //数据命令选择
sbit LCD12864_RW = P2^5; //读写选择
sbit LCD12864_E = P2^7; //使能管脚
sbit LCD12864_PSB = P3^2; //用来设置8位并行口还是4位并行口//宏定义数据端口
#define LCD12864_DATAPORT P0//声明函数void lcd12864_init(void);
void lcd12864_clear(void);
void lcd12864_show_string(u8 x,u8 y,u8 *str);#endif
2.主函数
打开 main.c
文件,代码如下:
/*
实验名称:LCD12864 液晶显示实验(带字库)
接线说明:
实验现象:下载程序后,LCD12864 上显示汉字字符信息
注意事项:
*/
#include "public.h"
#include "lcd12864.h"/*
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*/
void main(void)
{lcd12864_init();//LCD12864 初始化lcd12864_show_string(0,0,"Hello World!");//第 1 行字符串显示lcd12864_show_string(0,1,"大家好!");//第 2 行字符串显示lcd12864_show_string(0,2,"欢迎使用 51 开发板");//第 3 行字符串显示lcd12864_show_string(0,3,"好好学习天天向上");//第 4 行字符串显示while (1){}}
四、实验现象
使用 USB
线将开发板和电脑连接成功后(电脑能识别开发板上 CH340
串口),把编译后产生的.hex
文件烧入到芯片内,实现现象如下:LCD12864
上显示汉字字符信息。
注意:带字库 LCD12864
液晶要正确插入到 LCD12864
接口位置,插反或差错都会导致显示不正常。如果出现显示看不清,可调节 LCD12864
液晶屏幕背面的可调电位器(一般无需操作)。如果 LCD12864
无法显示,可重启电源或复位。
51单片机 | LCD12864 液晶显示实验相关推荐
- 51单片机+LCD12864液晶显示的俄罗斯方块游戏,Proteus仿真、AD原理图、代码、论文等
设计要求 (1)利用51单片机,设计一款俄罗斯方块游戏,完成硬件电路的开发和程序的编写调试: (2)采用LCD12864液晶作为游戏运行界面: (3)利用按键输入灵活控制方块的移动与变形: (4)能够 ...
- 51单片机学习:LCD12864液晶显示实验(带字库)
实验名称:LCD12864液晶显示实验(带字库) 接线说明: 实验现象:下载程序后,LCD12864上显示汉字字符信息 注意事项: ...
- 【Proteus仿真】51单片机红外无线通信实验
[Proteus仿真]51单片机红外无线通信实验 Proteus仿真 使用说明 接收端的单片机加载接收端的Hex文件,发射端加载发射端的Hex文件,仿真过程中,接收端响应有点慢,当长时间无数据发送时, ...
- 51单片机的仿真实验——1602显示屏显示万年历与温度
实验内容: 1:数字钟设计 2:基于DS18B20的温度测量模块设计 问题描述: 之前笔者写过一篇用数码管显示日历与温度的实验记录(51单片机的仿真实验--数码管显示日历与温度).但是数码管在仿真软件 ...
- 51单片机+LCD12864的万年历Proteus仿真
51单片机+LCD12864的万年历Proteus仿真 Proteus仿真效果 按键说明:递增按键的范围是根据设置的属性变化而变化,如果是年就是0-99,超出范围归0,如果是月份就是0-12超出范围归 ...
- 自学51单片机 - 矩阵按键实验
自学51单片机 - 矩阵按键实验 1.开发板原理图 2.程序 2.1 行列式扫描法 2.2 线翻转扫描法 3.结果 1.开发板原理图 2.程序 2.1 行列式扫描法 /**************** ...
- 51单片机+LCD12864驱动显示汉字模板+Proteus仿真
51单片机+LCD12864驱动显示汉字模板+Proteus仿真 Proteus仿真效果 汉字显示方法 汉字通过取模软件取模. 取模软件:pctolcd2002 取模方式: 工程文件架构 主程序代码 ...
- 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...
基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...
- 51单片机中断系统实验
51单片机中断系统实验 一.实验内容 INT0端接单次脉冲发生器.按一次脉冲产生一次中断,CPU使P1.0状态发生一次反转,P1.0接LED灯,以查看信号反转. 根据实验内容编写一个程序,并在实验系统 ...
最新文章
- 牛客练习赛85 数学家的迷题 (带修莫队/线段树)
- 探索7.x, 全面解析Activity启动框架 (1)
- 从Java中的length和length()开始
- FFmpeg Filter基本使用
- 无法联系上证书的吊销服务器,CA服务器搭建问题,日志分析---吊销功能无法检查证书的吊销...
- Centos eclipse打开文件自动退出
- 【转】TestNG常用注解
- 文件的HANDLE转化为FILE*!!!
- 因证书问题,Xcode 真机调试时经常遇到的问题
- VS2015+Opencv3.2配置(一次配好)
- LaTeX Package cleveref: cleveref must be loaded after hyperref!. 的解决方案
- RDP报表工具的环境搭建
- 使用Clonezilla复制硬盘
- 软件测试-按开发阶段划分
- vue安装node-sass错误
- 计算机视觉工具、代码合集
- Maven –如何跳过单元测试
- 《死亡搁浅》:在“联结”的世界里,是 “个人”在游戏中
- 基于springboot的人事管理系统【毕业设计,源码,论文】
- 2010中13寸MacbookPro光驱位安装SSD记录