一、LCD12864简介
LCD12864是一种128x64像素的液晶显示屏,常用于电子设备中作为显示器。它通常采用ST7920或者类似的控制器,可以通过串行或并行接口与微控制器或其他设备通信。LCD12864显示屏可以显示单*图色**像和文本,通常用于嵌入式系统、电子仪器、3D打印机等领域。


二、管脚定义
以下是LCD12864的管脚定义:
|
管脚编号 |
功能 |
|
1 |
VSS(地) |
|
2 |
VDD(电源,5V) |
|
3 |
V0(液晶对比度调节) |
|
4 |
RS(寄存器选择,1:数据;2:命令寄存器) |
|
5 |
R/W(读/写选择,1:读;2:写) |
|
6 |
E(使能信号) |
|
7-14 |
DB0-DB7(数据位) |
|
15 |
CS1,片选信号,低有效,对应左半屏64x64点 |
|
16 |
CS2,片选信号,低有效,对应右半屏64x64点 |
|
17 |
RST(复位,低有效) |
|
18 |
VOUT(液晶偏压输出) |
|
19 |
LED-A(LED背光阳极) |
|
20 |
LED-K(LED背光阴极) |
请注意,这只是一种基本的表示方法,具体的管脚定义可能会因制造商或型号而有所不同。
三、命令
1. 功能能设定
|
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
1 |
DL |
X |
0/RE |
x |
x |
初始值: 001 DL X 100DL 位说明 : 8/4位 接口控制位,值=1:8位接口;值=0:4位接口;RE:指令集选择控制位,值1:扩充指令集;值0:基本指令集;
需要注意的是,同一指令的动作不能同时改变DL和RE,需要先改变DL再改变RE才能确保设置正确。
2. 清屏指令(0x01)
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
冰镇 DDRAM填充 ASCII 码的0x20(空格),并且设定DRAM的地址计数器(AC)为00H,更新设置进入设定点将I/D设为1,游标右移AC加1 。
3. 地址归位
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
X |
设定DDRAM的地址计数器(AC)到00H,并且将游标移到开头原点位置。
4. 进入设定点
初始值: 06H
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
I/D |
S |
I/D:值=1: 右移(DDRAM地址计数器AC加1);值=0;左移;S:值=1:整体左移;值=0:整体右移;
5. 显示状态开关
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
1 |
D |
C |
B |
初始值: 08H
D:值=1:整体显示开;值=0:整体显示关;C:值=1:游标显示开;值=0:游标显示关;B:值=1:游标位置显示反白打开;值=0:游标位置显示正常。
6. 设定CGRAM地址
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
0 |
1 |
AC 5 |
AC 4 |
AC 3 |
AC 2 |
AC 1 |
AC 0 |
设定CGRAM地址到地址计数器AC。
7. 设定DDRAM地址
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
0 |
0 |
1 |
AC 6 |
AC 5 |
AC 4 |
AC 3 |
AC 2 |
AC 1 |
AC 0 |
设定DRAM地址到地址计数器AC。
8. 写资料到RAM
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
1 |
0 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
写入资料到内部的RAM。 |
9. 读出RAM
|
RS |
RW |
位7 |
位6 |
位5 |
位4 |
位3 |
位2 |
位1 |
位0 |
|
1 |
1 |
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
|
从内部RAM读取资料。 |
四、DDRAM地址
图形显示坐标, 水平方向 X,以字节为单位;垂直方向 Y,以位为单位 。

|
行 |
X坐标1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
Line1 |
80H |
81H |
82H |
83H |
84H |
85H |
86H |
87H |
|
Line2 |
90H |
91H |
92H |
93H |
94H |
95H |
96H |
97H |
|
Line3 |
88H |
89H |
8AH |
8BH |
8CH |
8DH |
8EH |
8FH |
|
Line4 |
98H |
99H |
9AH |
9BH |
9CH |
9DH |
9EH |
9FH |
五、点亮实验
1. 硬件连接


2. 代码实现
(1)写命令
/**
* @brief 写命令
*/
void lcd12864_write_cmd(u8 cmd){
LCD12864_RS = 0;
LCD12864_RW = 0;
LCD12864_EN = 0;
LCD12864_DATAPORT = cmd;
delay_ms(1);
LCD12864_EN = 1;
delay_ms(1);
LCD12864_EN = 0;
}
(2)写数据
/**
* @brief 写数据
*/
void lcd12864_write_data(u8 dat){
LCD12864_RS = 1;
LCD12864_RW = 0;
LCD12864_EN = 0;
LCD12864_DATAPORT = dat;
delay_ms(1);
LCD12864_EN = 1;
delay_ms(1);
LCD12864_EN = 0;
}
(3)初始化
/**
* @brief 初始化
*/
void lcd12864_init(void){
LCD12864_PSB = 1;
// 功能设定,基本指令集,8位
lcd12864_write_cmd(0x30);
// 不使用光标, 不闪烁
lcd12864_write_cmd(0x0c);
// 不移动光标,不滚动
lcd12864_write_cmd(0x06);
// 清屏
lcd12864_write_cmd(0x01);
}
(4)清屏
/**
* @brief 清屏
*/
void lcd12864_clear(void){
lcd12864_write_cmd(0x01);
}
(5)显示字符串
/**
* @brief 显示字符串
*/
void lcd12864_write_string(u8 x, u8 y, u8 *str){
if(y<0)y=0;
if(x<0)x=0;
if(y>3)y=3;
x &= 0x0f;
switch(y){
case 0:
x |= 0x80;
break;
case 1:
x |= 0x90;
break;
case 2:
x |= 0x88;
break;
case 3:
x |= 0x98;
break;
}
lcd12864_write_cmd(x);
while(*str!='\0'){
lcd12864_write_data(*str);
str++;
}
}
(6)主程序
#include "led_utils.h"
#include "ired_utils.h"
#include "segment_display_utils.h"
#include "uart_utils.h"
#include "lcd12864_utils.h"
/**
* @brief 主函数
*/
void main()
{
// 关闭所有led
led_all_off();
// 速率 9600
uart_init(0xfa);
lcd12864_init();
lcd12864_clear();
lcd12864_write_string(0, 0, "你好,中国");
while(1)
{
}
}
本文代码开源地址:https://gitee.com/xundh/learn51