STC15F2K60S2(LCD1602)

使用方法

        对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

### STC15F2K60S2 单片机LCD1602 显示屏连接及编程 #### 硬件连接说明 为了实现 STC15F2K60S2 单片机控制 LCD1602 显示屏的功能,硬件连接如下: | LCD1602 Pin | 功能 | 连接到 STC15F2K60S2 | |-------------|----------------|---------------------| | VSS | 地 | GND | | VDD | 电源正极 | +5V | | VO | 对比度调节 | 可变电阻 | | RS | 数据/命令选择 | P3.7 | | R/W | 读写选择 | 接地 (只写模式) | | E | 使能信号 | P3.6 | | D0-D7 | 数据总线 | 不用全部连接, 使用4位模式时只需D4-D7分别连到P3.0-P3.3 | 表中的连接方式适用于常见的8位并行接口以及简化后的4位并行接口配置[^1]。 #### 初始化设置和函数定义 对于 STC15F2K60S2 控制 LCD1602 的软件部分,通常需要先初始化液晶显示模块,并编写几个辅助函数来发送指令、字符给 LCD。以下是 C 语言编写的示例代码片段用于完成上述操作: ```c #include <reg52.h> sbit rs = P3^7; // 定义RS端口 sbit rw = P3^6; // 定义R/W端口 sbit en = P3^5; // 定义E端口 void delay(unsigned int i){ while(i--); } // 向LCD发出一个字节的数据(指令或数据), mode=0表示指令,mode=1表示数据. void lcd_write_byte(unsigned char dat,unsigned char mode){ sbit rs = mode; P3 &= 0x0f; // 清除高四位 P3 |= ((dat & 0xf0)>>4); // 发送高四位 en = 1; delay(5); en = 0; P3 &= 0x0f; // 再次清除高四位准备发低四位 P3 |= (dat & 0x0f); // 发送低四位 en = 1; delay(5); en = 0; delay(200); } // 初始化LCD1602 void init_lcd(void){ lcd_write_byte(0x33,0); lcd_write_byte(0x32,0); lcd_write_byte(0x28,0); lcd_write_byte(0x0C,0); lcd_write_byte(0x06,0); lcd_write_byte(0x01,0); delay(1000); } ``` 这段代码实现了基本的初始化过程,其中包含了必要的延时处理以确保每条命令都能被正确执行。 #### 输出字符串至屏幕 为了让用户能够更方便地向屏幕上打印信息,在这里提供了一个简单的 `lcd_print` 函数用来逐个字符地将字符串输出到指定位置上: ```c // 将光标移动到第line行col列的位置(line:0 or 1,col:0~15) void set_cursor(unsigned char line,unsigned char col){ unsigned char addr; if(line==0){addr=0x80+col;} else{addr=0xC0+col;} lcd_write_byte(addr,0); } // 打印字符串str到当前光标的所在位置 void lcd_print(char * str){ while(*str != '\0'){ lcd_write_byte(*str++,1); } } ``` 通过调用这些自定义函数可以轻松实现在不同位置显示不同的文字内容。以上就是针对 STC15F2K60S2LCD1602 屏幕之间交互所需的主要知识点和技术细节介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值