文章目录
- [1. 引言](#1. 引言)
- [2. 基础概念](#2. 基础概念)
- [3. 外观和显示](#3. 外观和显示)
-
- [3.1 外观和引脚](#3.1 外观和引脚)
- [3.2 点阵显示原理](#3.2 点阵显示原理)
- [4. 指令(查询使用不要死记)](#4. 指令(查询使用不要死记))
- [5. 编程](#5. 编程)
-
- [5.1 文字信息显示](#5.1 文字信息显示)
-
- [5.1 参考代码](#5.1 参考代码)
- [5.2 运行效果](#5.2 运行效果)
- [5.1 图像信息显示](#5.1 图像信息显示)
-
- [5.1 参考代码](#5.1 参考代码)
- [5.2 运行效果](#5.2 运行效果)
- [6. 工具](#6. 工具)
-
- [6.1PCtoLCD(取字模1) 使用方式](#6.1PCtoLCD(取字模1) 使用方式)
- [6.1转码221(取字模2) 使用方式](#6.1转码221(取字模2) 使用方式)
- [7. 总结](#7. 总结)
1. 引言
之前我们学了led灯(可以理解为一个点),然后后面学习了数码显示(可以理解我8条线组成的led灯组,能展示数字0~9和部分字母),上一次我们学习了LCD1602(可以理解为一个面,能展示数字和字母,有字库)。这次我们学习LCD12864(面更大,可展示全面的数字和字母,无字库)
2. 基础概念
点阵式液晶显示器LCD12864有两种:
- 以KS0108 为主控芯片,不带字库 ,显示的字符或图形是由不同的点阵组成,点阵的获得可以借助于取模软件
- 另外一种是ST7920为主控信息,带字符ASCII码和中文的点阵质控。
本文介绍的是KS0108为主控芯片的LCD12864的试用方法。
3. 外观和显示
3.1 外观和引脚

引脚功能:
| 引脚号 | 引脚符号 | 功能 |
|---|---|---|
| 第1脚 | CS1 | 左半屏选择信号,低电平有效。 |
| 第2脚 | CS2 | 右半屏选择信号,低电平有效。 |
| 第3脚 | GND | 电源地。 |
| 第4脚 | VCC | 电源正极。 |
| 第5脚 | V0 | 对比度调整输入端。 |
| 第6脚 | RS | 数据/命令选择端,高电平选择数据寄存器,低电平选择命令寄存器。 |
| 第7脚 | R/-W | 读/写选择端,高电平读操作,低电平写操作。 |
| 第8脚 | E | 使能端当E端高电平时读取液晶模块的信息,当E端由高电平跳变成低电平时,液晶模块执行写操作。 |
| 第9~16脚 | D0~D7 | 为8位双向数据线。 |
| 第17脚 | RST | 复位端,低电平复位,高电平正常工作。 |
| 第18脚 | VOUT | LCD驱动负压输出端。 |
| 第19脚 | BLA | 背光源正极。 |
| 第20脚 | BLK | 背光源负极。 |
重点:RS 、R/-W、E 这三个引脚控制读写,控制命令或数据
3.2 点阵显示原理

- 两个控制模块,分别控制左半屏 和右半屏 ,每屏为64×64点阵。
- 每屏纵向8点为一页,从上到下分成8页,页号0 ~ 7。横向64个点,分成64列,列号0~63。
- 显示时以"页"为单位,每一页从0列到63列,一列8位,对应一个字节,上方为低位,下方为高位。
- 每屏总共8×64个字节,两屏总共2×8×64=1K个字节,对应内部的显示存储器。

字符或汉字转换成对应的点阵代码称为取模。取模可借助于取模软件,KS0108控制LCD12864的点阵显示方式在取模软件中称为列行式。对于8×16点阵的西文字符和16×16点阵的中文汉字,在LCD12864中实际占用2个"页";操作时一般先写上面一页,再写下面一页,每一页从0列写到7(或者15)列,这样就完成一个字符(或者汉字)的显示。
字符"A" 和"杨"的点阵代码,取模方式选择列行式,数据格式采用C51格式。
c
//A(0) 杨(1)
{0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20},/*"A",0*/
{0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0x42,0xE2,0x52,0x4A,0xC6,0x42,0x40,0xC0,0x00
0x04,0x03,0x00,0xFF,0x00,0x23,0x10,0x8C,0x43,0x20,0x18,0x47,0x80,0x40,0x3F,0x00},/*"杨",1*/
4. 指令(查询使用不要死记)
KS0108控制器 LCD12864 指令集 (图形点阵)
| 序号 | 指令功能 | 指令码 (二进制) | 说明 |
|---|---|---|---|
| 1 | 显示开关 | 0000 1111 1 D |
控制整体显示的开/关。D=1为开显示(0x3F),D=0为关显示(0x3E)。不影响DDRAM中的数据。 |
| 2 | 设置显示起始行 | 11XX XXXX |
设置显示屏顶部对应的DDRAM行地址,取值范围0~63。例如0xC0表示从第0行开始显示。可用于实现屏幕滚动效果。 |
| 3 | 设置页地址 | 10111 XXX |
设置当前操作的页地址(X地址),取值范围0~7,对应显示屏的8个页(每页8行)。基础指令码为0xB8,加页号即可(如第2页为0xBA)。 |
| 4 | 设置列地址 | 01XX XXXX |
设置当前操作的列地址(Y地址),取值范围0~63。基础指令码为0x40,加列偏移即可。每次读写数据后,列地址会自动加1。 |
| 5 | 读状态字 | 0 1 BF 0 ON/OFF RST 0 0 0 0 |
读取控制器内部状态。BF=1表示忙,此时不能进行除读状态外的其他操作;ON/OFF表示显示状态;RST表示复位状态。 |
| 6 | 写显示数据 | 1 0 D7 ... D0 |
将8位显示数据写入当前页地址和列地址所指向的DDRAM单元。写入后列地址自动加1。 |
| 7 | 读显示数据 | 1 1 D7 ... D0 |
从当前页地址和列地址所指向的DDRAM单元读出8位数据。读取后列地址自动加1。注意:进行有效读操作前,需先进行一次空读操作。 |
5. 编程
5.1 文字信息显示
【例】使用LCD12864的第一行显示自己名字,第二行显示自己的学号,第三行显示电话号码,第四行显示班级,要求:居中对齐,用C51编写相应程序。在Proteus中完成设计与仿真。
5.1 参考代码
c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
# define lcdrow 0xc0
# define lcdpage 0xb8
# define lcdcolumn 0x40
# define c_page_max 0x08
# define c_column_max 0x40
# define bus P0
sbit rst = P2^0;
sbit e = P2^1;
sbit rw = P2^2;
sbit rs = P2^3;
sbit cs1 = P2^4;
sbit cs2 = P2^5;
void delayms(uint);
void delayus10(void);
void select(uchar);
void send_cmd(uchar);
void send_data(uchar);
void clear_screen(void);
void initial(void);
void display_zf(uchar,uchar,uchar,uchar);
void dispaly_hz(uchar,uchar,uchar,uchar);
uchar code table_zf[]={
//2(0) 4(1) 0(2) 6(3) 0(4) 1(5) 6(6) 1(7) 8(8) 6(9) 8(10) 3(11)
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",0*/
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",1*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",2*/
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",3*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",4*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",5*/
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",6*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",7*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",8*/
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"6",9*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",10*/
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"3",11*/
// 1(0) 5(1) 0(2) 2(3) 3(4) 6(5) 0(6) 8(7) 9(8) 1(9) 9(10)
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",12*/
0x00,0xF8,0x88,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x20,0x20,0x20,0x11,0x0E,0x00,/*"5",13*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",14*/
0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,/*"*",15*/
0x00,0x30,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x18,0x20,0x21,0x21,0x22,0x1C,0x00,/*"*",16*/
0x00,0xE0,0x10,0x88,0x88,0x90,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x20,0x1F,0x00,/*"*",17*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"*",18*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*"8",19*/
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",20*/
0x00,0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,/*"1",21*/
0x00,0xF0,0x08,0x08,0x08,0x10,0xE0,0x00,0x00,0x01,0x12,0x22,0x22,0x11,0x0F,0x00,/*"9",22*/
// 2(0) 4(1) 0(2) X(3)
0x00,0x70,0x08,0x08,0x08,0x08,0xF0,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*"2",23*/
0x00,0x00,0x80,0x40,0x30,0xF8,0x00,0x00,0x00,0x06,0x05,0x24,0x24,0x3F,0x24,0x24,/*"4",24*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*"0",25*/
0x08,0x18,0x68,0x80,0x80,0x68,0x18,0x08,0x20,0x30,0x2C,0x03,0x03,0x2C,0x30,0x20,/*"X",26*/
0x10,0x60,0x02,0x8C,0x00,0x08,0xF9,0x4E,//0xC8,0x20,0x58,0x4F,0x48,0xC8,0x08,0x00,
0x04,0x04,0x7E,0x81,0x40,0x30,0x0F,0x40,//0x7F,0x00,0x44,0x84,0x7F,0x04,0x04,0x00,/*"游(左边)",27*/
0xC8,0x20,0x58,0x4F,0x48,0xC8,0x08,0x00,0x7F,0x00,0x44,0x84,0x7F,0x04,0x04,0x00,/*"游(右边)",28*/
0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x10,//0x10,0xFF,0x10,0x10,0x11,0x16,0x10,0x00,
0x00,0x20,0x60,0x20,0x3F,0x10,0x10,0x10,//0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00/*"式(左边)",29*/
//0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x10,
0x10,0xFF,0x10,0x10,0x11,0x16,0x10,0x00,
//0x00,0x20,0x60,0x20,0x3F,0x10,0x10,0x10,
0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00/*"式(右边)",30*/
};
uchar code table_hz[]={
0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,0x00,
0x00,0x44,0x42,0x49,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x41,0x40,0x00,0x00,/*"星",0*/
0x10,0x60,0x02,0x8C,0x00,0x08,0xF9,0x4E,0xC8,0x20,0x58,0x4F,0x48,0xC8,0x08,0x00,
0x04,0x04,0x7E,0x81,0x40,0x30,0x0F,0x40,0x7F,0x00,0x44,0x84,0x7F,0x04,0x04,0x00,/*"游",1*/
0x00,0x3E,0x22,0xE2,0x22,0x3E,0x00,0x10,0x88,0x57,0x24,0x54,0x8C,0x00,0x00,0x00,
0x40,0x7E,0x40,0x3F,0x22,0x22,0x00,0x01,0xFE,0x42,0x42,0x42,0xFE,0x01,0x01,0x00,/*"路",2*/
0x80,0x80,0xEE,0x88,0x88,0x88,0xE8,0x8F,0x08,0x88,0x78,0x48,0x4E,0x40,0xC0,0x00,
0x00,0x00,0x7F,0x24,0x24,0x24,0x7F,0x00,0x81,0x40,0x30,0x0F,0x30,0x41,0x80,0x00,/*"嵌",3*/
0x00,0x00,0x00,0x00,0x00,0x01,0xE2,0x1C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x80,0x00,/*"入",4*/
0x10,0x10,0x90,0x90,0x90,0x90,0x90,0x10,0x10,0xFF,0x10,0x10,0x11,0x16,0x10,0x00,
0x00,0x20,0x60,0x20,0x3F,0x10,0x10,0x10,0x00,0x03,0x0C,0x10,0x20,0x40,0xF8,0x00/*"式",5*/
};
void delayus10(void)
{
uchar i =5;
while(--i);
}
void delayms(uint j)
{
uchar i = 250;
for(;j>0;j--)
{
while(--i);
i = 249;
while(--i);
i = 250;
}
}
void select(uchar cs)
{
if(cs==0){cs1=0;cs2=0;}
else if(cs==1){cs1=0;cs2=1;}
else{cs1=1;cs2=0;}
}
void send_cmd(uchar cmd)
{
rs=0;rw=0;bus=cmd;delayus10();e=0;e=1;e=0;
}
void send_data(uchar dat)
{
rs=1;rw=0;bus=dat;delayus10();e=0;e=1;e=0;
}
void clear_screen(void)
{
uchar c_page,c_column;
select(0);
for(c_page=0;c_page<c_page_max;c_page++)
{
send_cmd(c_page+lcdpage);
send_cmd(lcdcolumn);
for(c_column=0;c_column<c_column_max;c_column++)
{
send_data(0x00);
}
}
}
void initial(void)
{
rst=0;delayms(10);rst=1;
select(0);
clear_screen();
send_cmd(lcdrow);
send_cmd(lcdcolumn);
send_cmd(lcdpage);
send_cmd(0x3f);
}
void display_zf(uchar c_page,uchar c_column,uchar num,uchar offset)
{
uchar c1,c2,c3;
for(c1=0;c1<num;c1++)
{
for(c2=0;c2<2;c2++)
{
for(c3=0;c3<8;c3++)
{
send_cmd(lcdpage+c_page+c2);
send_cmd(lcdcolumn+c_column+c1*8+c3);
send_data(table_zf[(c1+offset)*16+c2*8+c3]);
//delayms(100);
}
}
}
}
void display_zf2(uchar c_page,uchar c_column,uchar num,uchar offset,uchar LR)
{
uchar c1,c2,c3;
for(c1=0;c1<num;c1++)
{
for(c2=0;c2<2;c2++)
{
for(c3=0;c3<4;c3++)
{
send_cmd(lcdpage+c_page+c2);
send_cmd(lcdcolumn+c_column+c1*8+c3);
send_data(table_zf[(c1+offset)*16+c2*8+c3+LR*4]);
//delayms(100);
}
}
}
}
void display_hz(uchar c_page,uchar c_column,uchar num,uchar offset)
{
uchar c1,c2,c3;
for(c1=0;c1<num;c1++)
{
for(c2=0;c2<2;c2++)
{
for(c3=0;c3<16;c3++)
{
send_cmd(lcdpage+c_page+c2);
send_cmd(lcdcolumn+c_column+c1*16+c3);
send_data(table_hz[(c1+offset)*32+c2*16+c3]);
//delayms(100);
}
}
}
}
void main()
{
initial();
select(1);
display_hz(0,40,1,0);
display_zf(0,56,1,27);
display_zf(2,16,6,0);
display_zf(4,20,5,12);
display_zf2(4,60,1,17,0);
display_hz(6,24,2,3);
display_zf(6,56,1,29);
select(2);
display_zf(0,0,1,28);
display_hz(0,8,1,2);
display_zf(2,0,6,6);
display_zf2(4,0,1,17,1);
display_zf(4,4,5,18);
display_zf(6,0,1,30);
display_zf(6,8,4,23);
while(1);
}
5.2 运行效果

5.1 图像信息显示
【例】使用LCD12864显示自己的签名,要求显示128*64像素,用C51编写相应程序。在Proteus中完成设计与仿真。
5.1 参考代码
c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
# define lcdrow 0xc0
# define lcdpage 0xb8
# define lcdcolumn 0x40
# define c_page_max 0x08
# define c_column_max 0x40
# define bus P0
sbit rst = P2^0;
sbit e = P2^1;
sbit rw = P2^2;
sbit rs = P2^3;
sbit cs1 = P2^4;
sbit cs2 = P2^5;
void delayms(uint);
void delayus10(void);
void select(uchar);
void send_cmd(uchar);
void send_data(uchar);
void clear_screen(void);
void initial(void);
void display_zf(uchar,uchar,uchar,uchar);
void dispaly_hz(uchar,uchar,uchar,uchar);
uchar code table_tu[]={
/*-- 调入了一幅图像:C:\Users\86150\Desktop\星游路.bmp --*/
/*-- 宽度x高度=128x64 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
0xC0,0x60,0x60,0x20,0x20,0x60,0x60,0x60,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xE0,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x60,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,
0xD0,0xF8,0xF0,0x60,0xE0,0xF0,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x1C,0xF8,0x7F,0x61,
0xF0,0x98,0xD8,0xB8,0x80,0x00,0xF8,0x1E,0x07,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,0x0C,0x98,0xF8,0x70,0x00,0x20,0x20,
0x30,0x31,0x31,0xFF,0xFF,0xBA,0x98,0x88,0x80,0x80,0x80,0xC0,0x78,0x3C,0x0F,0x47,
0x76,0x36,0x36,0xB6,0xF6,0x76,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x06,0x0E,0xF8,0xF1,0xE0,0xF0,0xF0,0x78,0x3F,0x05,0x04,0x04,0x0E,0x0E,
0x8F,0xCF,0x78,0x38,0x1F,0x1F,0x30,0x30,0x30,0x60,0x60,0xE0,0xC0,0xC0,0xC0,0x80,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0xE0,0x00,0x00,0x03,
0x83,0x89,0x8D,0xF9,0xE1,0xC3,0xC3,0xC1,0xE0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x05,0x8D,0xEC,0x38,0x10,0x80,0xF0,0x08,
0x00,0x00,0xF8,0x3F,0x03,0x01,0x01,0x01,0x83,0xFF,0x07,0x00,0x80,0xC0,0xC0,0x60,
0x60,0x60,0x6F,0xFF,0xF0,0x60,0x60,0x60,0x60,0xE0,0xC0,0xE0,0xE0,0x20,0x00,0x00,
0x00,0x20,0x60,0xC0,0x00,0x00,0x00,0x63,0xFF,0xFC,0xAE,0xEE,0x76,0x38,0x1C,0x0E,
0x11,0xF0,0x98,0x04,0x04,0x06,0x06,0x06,0x06,0xCE,0xFC,0x00,0x00,0x01,0x01,0x01,
0x03,0x06,0x06,0x0C,0x0C,0x0C,0x18,0x18,0x18,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0x60,0x30,0x1C,0x0F,0x01,0x01,0x31,
0x59,0xC9,0xC8,0xFF,0xBF,0x3C,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x38,0xE0,0xC0,0xF8,0x0F,0x80,0xE0,
0x78,0x1E,0x07,0xC0,0x80,0x00,0x00,0x00,0xFF,0xFF,0x0F,0x11,0x01,0x20,0x00,0x40,
0x80,0x80,0x80,0x83,0x8F,0xFC,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x80,0xC0,0xFF,0x78,0x30,0x18,0x0C,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x0F,0x3F,0x20,0x00,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x60,0x30,0x30,0x30,0x10,0x10,0x1C,0x1A,0x0B,
0x09,0x0D,0x0D,0x0F,0x0F,0x0C,0x0C,0x06,0x06,0x06,0x06,0x06,0x0E,0x0E,0x0C,0x0C,
0x0C,0x0C,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x01,0x01,
0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x06,0x0F,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,
0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x03,0x03,0x01,0x01,0x01,0x03,0x03,0x03,0x03,0x07,0x03,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
void delayus10(void)
{
uchar i =5;
while(--i);
}
void delayms(uint j)
{
uchar i = 250;
for(;j>0;j--)
{
while(--i);
i = 249;
while(--i);
i = 250;
}
}
void select(uchar cs)
{
if(cs==0){cs1=0;cs2=0;}
else if(cs==1){cs1=0;cs2=1;}
else{cs1=1;cs2=0;}
}
void send_cmd(uchar cmd)
{
rs=0;rw=0;bus=cmd;delayus10();e=0;e=1;e=0;
}
void send_data(uchar dat)
{
rs=1;rw=0;bus=dat;delayus10();e=0;e=1;e=0;
}
void clear_screen(void)
{
uchar c_page,c_column;
select(0);
for(c_page=0;c_page<c_page_max;c_page++)
{
send_cmd(c_page+lcdpage);
send_cmd(lcdcolumn);
for(c_column=0;c_column<c_column_max;c_column++)
{
send_data(0x00);
}
}
}
void initial(void)
{
rst=0;delayms(10);rst=1;
select(0);
clear_screen();
send_cmd(lcdrow);
send_cmd(lcdcolumn);
send_cmd(lcdpage);
send_cmd(0x3f);
}
void display_tu()
{
uint i,j;
send_cmd(lcdpage);
send_cmd(lcdcolumn);
for(i=0;i<8;i++)
{
for(j=0;j<128;j++)
{
if(j<64)
{
select(1);
send_cmd(lcdpage+i);
send_cmd(lcdcolumn+j);
send_data(table_tu[i*128+j]);delayms(10);
}else
{
select(2);
send_cmd(lcdpage+i);
send_cmd(lcdcolumn+j-64);
send_data(table_tu[i*128+j]);delayms(10);
}
}
}
}
void main()
{
initial();
display_tu();
while(1);
}
5.2 运行效果

6. 工具
- 仿真软件 proteus
- 开发软件 Keil
- 取字模1 点击下载
- 取字模2 点击下载(可取图片点阵图)
6.1PCtoLCD(取字模1) 使用方式
- 下载后是一个zip文件,对zip文件进行解压得到解压文件

- 双击执行文件

- 打开取模软件后,输入需要取模的文字,例如'星游路' ,点击'生成字模'(默认是A51模式,即汇编语言模式)

- 修改模式,点击'选项',选择C51格式,点击确定,重新点击生成字模(就得到了C51格式的字模)

6.1转码221(取字模2) 使用方式
字模2更多的是当成图片来取点阵图。我们就以手写'星游路'为例。
- 在白纸上写下你要取模的图形。

- 使用电脑自带的画图工具,进行大小调整。(1. 截取要调整的文字,2,点击调整大小。3,目标是调整128*64 。先给水128.垂直暂不调整)

- 拖拽画板到128 *64

- 文件另存为单色图


- 点击确定

- 得到单色图(也可以是网上的卡通图片转单色图)

- 双击取模软件

- 点击'新建图像', 输入 128 和64 。


- 上传单色图

- 生成字模

7. 总结
通过本文的学习,你已经掌握了 LCD12864 从硬件接线、显示原理到软件编程的完整流程。
希望本文能帮助你顺利入门 LCD12864 的开发,欢迎在评论区交流遇到的问题与心得。