使用方法
对P20、P21、P12、P0四个引脚的调用
P20、P21、P12三个引脚为功能选择
P0为显示命令与显示内容
确保LCD1602处于非忙状态
忙状态
在LCD1602模块的使用中,"忙状态"(Busy Status)是指LCD模块正在处理之前的命令,并且暂时无法接收新的命令或数据。这是由于LCD模块在执行某些操作(如清屏、回车、光标移动等)时需要一定的时间来完成,在此期间,模块会设置一个内部的忙标志位。为了确保LCD模块能够正确接收和执行命令,通常需要在发送新命令之前检查LCD是否处于忙状态,并等待它变为非忙状态。
以下是如何检查和处理LCD忙状态的步骤:
检查忙标志位LCD1602模块的状态寄存器中包含一个忙标志位(通常为状态字节的最高位,即第7位)当LCD忙时,该位为1;
当LCD准备好接收新命令时,该位为0。2. 读取状态寄存器要检查忙标志位,需要从LCD的状态寄存器中读取状态字节。
这通常涉及以下步骤:
设置RS为高电平1
设置RW为高电平1
设置E为高电平,然后等待LCD的响应
从数据总线(D0-D7)读取状态字节。
检查状态字节的最高位(忙标志位)。
指令编码
指令编码结构
指令码:用于控制LCD的功能
数据:用于向LCD发送显示内容
计算方法
1.功能指令
用于配置LCD的基本工作模式
指令编码格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 1 DL N F 0 0
DL:数据接口位数(DL=1表示8位数据接口,DL=0表示4位数据接口)
N:显示行数(N=1表示两行显示,N=0表示一行显示)
F:字符大小(F=1表示5×10点阵,F=0表示5×8点阵)
2.显示开关控制指令
用于控制LCD的显示状态
指令编码格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 1 D C B
D:显示开关(D=1表示显示开启,D=0表示显示关闭)
C:光标显示(C=1表示光标显示,C=0表示光标隐藏)
B:光标闪烁(B=1表示光标闪烁,B=0表示光标不闪烁)
3.输入模式设置指令
用于控制光标移动方向和显示移动
指令编码格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 1 I/D S
I/D:光标移动方向(I/D=1表示光标右移,I/D=0表示光标左移)
S:显示移动(S=1表示显示移动,S=0表示显示不移动)
4.清屏指令
用于清除LCD显示内容
指令编码格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 1
5.光标或显示移动指令
用于控制光标或显示内容的移动
指令编码格式:
D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 1 S/C R/L 0 0
S/C:选择移动对象(S/C=0表示移动光标,S/C=1表示移动显示)
R/L:移动方向(R/L=0表示左移,R/L=1表示右移)
6.DDRAM地址设置指令
用于指定显示内容的起始位置
指令编码格式:
D7 D6 D5 D4 D3 D2 D1 D0
1 A6 A5 A4 A3 A2 A1 A0
7.步骤
计算指令编码时,需要根据指令的功能需求,将对应的位设置为特定的值,然后将这些位组合成一个8位的二进制数
具体步骤如下:
1. 确定指令的功能需求:根据需要实现的功能(如清屏、设置显示模式等),确定需要设置的位
2. 设置对应的位:根据指令编码的格式,将对应的位设置为特定的值
3. 组合成8位二进制数:将设置好的位组合成一个8位的二进制数
4. 转换为十六进制数:将8位二进制数转换为十六进制数,便于编程使用
代码
#include <STC15F2K60S2.h>
#define LCD_DATA P0 // 定义LCD数据端口
sbit LCD_RS = P2^0; // RS引脚连接到P1.2
sbit LCD_RW = P2^1; // R/W引脚连接到P1.1
sbit LCD_E = P1^2; // E引脚连接到P1.0
// 延时函数
void delay(unsigned int ms) {
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 853; j++);
}
void LCD_Command(unsigned char cmd) {
LCD_DATA = cmd; // 将命令字节加载到数据总线
LCD_RS = 0; // 选择命令寄存器
LCD_RW = 0; // 设置为写操作
LCD_E = 1; // 使能LCD
delay(1); // 短暂延时
LCD_E = 0; // 禁止LCD
}
void LCD_Init() {
LCD_Command(0x38); // 设置显示模式
LCD_Command(0x0C); // 显示开,光标关
LCD_Command(0x06); // 文字不动,地址自动+1
LCD_Command(0x01); // 显示清屏
delay(2); // 等待LCD完成清屏
}
void LCD_DisplayString(unsigned char row, unsigned char column, unsigned char *str) {
unsigned char address;
if (row == 0)
address = 0x80 + column; // 第一行地址
else if (row == 1)
address = 0xC0 + column; // 第二行地址
LCD_Command(address); // 设置LCD地址
while (*str) { // 显示字符串
LCD_DATA = *str++;
LCD_RS = 1; // 选择数据寄存器
LCD_RW = 0; // 设置为写操作
LCD_E = 1; // 使能LCD
delay(1); // 短暂延时
LCD_E = 0; // 禁止LCD
}
}
void main() {
LCD_Init(); // 初始化LCD
LCD_DisplayString(0, 0, "Hello"); // 在第一行显示Hello
LCD_DisplayString(1, 0, "World!"); // 在第二行显示World!
while(1);
}
注意
背光调节可通过外部机械调节,显示需要自己调节
操作视频
https://www.bilibili.com/video/BV1JFQ3YPE2K?vd_source=b10b3445cdc8080c1d316e6f9a6245a0