26-51单片机-LCD12864液晶显示实验

一 主要涉及到的知识点:

1.1LCD12864 介绍:

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 分为带字库和不带字库两种。

LCD12864 带字库屏共有 20 个引脚,管脚功能如下:

1.2 LCD12864 带字库的指令;

1.2.1 功能设定:

1.2.2 清屏指令:

1.2.3 进入设定点:

1.2.4 显示状态开关设置:

同 LCD1602 一样,LCD12864 内部也含有 DDRAM,与其对应的地址如下:

第一行:0X80-OX87;(一个汉字占用 2 个字节,共 8 个汉字)

第二行:0X90-0X97;

第三行:0X88-0X8F;

第四行:0X98-0X9F;

1.3 LCD12864的设置:

1.3.1 LCD12864写命令函数定义:

1.3.2 LCD12864读数据函数定义:

1.3.3 LCD12864初始化函数定义:

1.3.4 LCD12864清屏函数定义:

1.3.5 LCD12864显示字符串函数定义:

二 源代码:

2.1 代码文件详情:

2.2 main.c文件:

#include "public.h"

#include "lcd12864.h"

//主函数

int main()

{

lcd12864_init(); //初始化lcd12864

lcd12864_show_string(0,0,"李衡加油好嘛!");

lcd12864_show_string(0,1,"找个好工作!");

lcd12864_show_string(0,2,"朱朱还在等你!");

lcd12864_show_string(0,3,"加油加油加油!!");

while(1)

{

}

return 0;

}

2.3 public.c文件:

#include "public.h"

//延时函数定义delay_10us,当time_num_us=1时,相当于10us.

void delay_10us(u16 time_num_us)

{

while(time_num_us--);

}

//延时函数定义delay_ms,当time_num_us=1时,相当于1ms.

void delay_ms(u16 time_num_us)

{

u8 i = 0;

u8 j = 0;

for(i = 0; i < time_num_us; i++)

for(j = 101; j > 0; j++);

}

2.4 public.h文件:

#ifndef _public_H

#define _public_H

#include "reg52.h"

//对系统默认的数据类型进行重定义

typedef unsigned char u8;

typedef unsigned int u16;

typedef unsigned long u32;

void delay_10us(u16 time_num_us);

void delay_ms(u16 time_num_us);

#endif

2.5 lcd12864.c文件:

#include "lcd12864.h"

//LCD12864写命令函数定义

void lcd12864_write_cmd(u8 cmd)

{

LCD12864_RS = 0; //选择命令

LCD12864_RW = 0; //选择写

LCD12864_EN = 0;

LCD128604_PORT = cmd; //准备命令

delay_ms(1);

LCD12864_EN = 1; //使能脚E线上升沿写入

delay_ms(1);

LCD12864_EN = 0; //使能脚负跳变实现完成写入

}

//LCD12864读数据函数定义

void lcd12864_write_data(u8 dat)

{

LCD12864_RS = 1; //选择命令

LCD12864_RW = 0; //选择写

LCD12864_EN = 0;

LCD128604_PORT = dat; //准备命令

delay_ms(1);

LCD12864_EN = 1; //使能脚E线上升沿写入

delay_ms(1);

LCD12864_EN = 0; //使能脚负跳变实现完成写入

}

//LCD12864初始化函数定义

void lcd12864_init(void)

{

LCD12864_PSB = 1; //选择8为或者4位并口方式

lcd12864_write_cmd(0x01);//清屏

lcd12864_write_cmd(0x30);//功能设定,选择8为接口,基本指令集

lcd12864_write_cmd(0x06);//进入设定点,游标右移1

lcd12864_write_cmd(0x0c);//显示状态开关设置,整体显示开

}

//LCD12864清屏函数定义

void lcd12864_clear_screen(void)

{

lcd12864_write_cmd(0x01);//清屏

}

//LCD12864显示字符串函数定义

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++;

}

}

2.6 lcd12864.h文件:

#ifndef _lcd12864_H

#define _lcd12864_H

#include "public.h"

sbit LCD12864_EN = P2^7;

sbit LCD12864_RS = P2^6;

sbit LCD12864_RW = P2^5;

sbit LCD12864_PSB = P3^2;

#define LCD128604_PORT P0

void lcd12864_init(void);

void lcd12864_clear_screen(void);

void lcd12864_show_string(u8 x,u8 y,u8 *str);

#endif

相关推荐
2303_Alpha2 天前
SpringBoot
笔记·学习
萘柰奈2 天前
Unity学习----【进阶】TextMeshPro学习(三)--进阶知识点(TMP基础设置,材质球相关,两个辅助工具类)
学习·unity
沐矢羽2 天前
Tomcat PUT方法任意写文件漏洞学习
学习·tomcat
好奇龙猫2 天前
日语学习-日语知识点小记-进阶-JLPT-N1阶段蓝宝书,共120语法(10):91-100语法+考え方13
学习
F137298015572 天前
WD5030A 芯片,12V降5V,输出电流12A,电路设计
stm32·单片机·嵌入式硬件·汽车·51单片机
向阳花开_miemie2 天前
Android音频学习(十八)——混音流程
学习·音视频
小莞尔2 天前
【51单片机】【protues仿真】基于51单片机的篮球计时计分器系统
c语言·stm32·单片机·嵌入式硬件·51单片机
李永奉2 天前
51单片机-使用IIC通信协议实现EEPROM模块教程
单片机·嵌入式硬件·51单片机
工大一只猿2 天前
51单片机学习
嵌入式硬件·学习·51单片机
小莞尔2 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机