当前位置: 首页 > news >正文

显示模块(LCD1602,OLED,四位数码管)

显示模块(LCD1602,OLED,四位数码管)

文章目录

  • 显示模块(LCD1602,OLED,四位数码管)
    • 1.LCD1602
      • 1.2接口信号说明
      • 1.3时序参数
      • 1.4LCD1602读写操作时序
      • 1.5时序参数
      • 1.6清屏
      • 1.7输入方式设置
      • 1.8显示开关控制
      • 1.9功能设置
      • 1.10LCD1602的屏幕数据怎么显示。
      • 1.11LCD1602显示屏显示(实操)

1.LCD1602

LCD1602是一种常用的字符型液晶显示器,单子符点阵位5*7或5*10,同时可显示16*2个也就是32个字符

(就是说一共可以显示16*2个字符,每个字符由5*7或5*10个点阵表示)

LCD1602

1.2接口信号说明

接口信息说明

电源基础结构

1.3时序参数

时序参数

1.4LCD1602读写操作时序

读写操作时序

写指令操作过程

  1. 将RS设为0

  2. 将R/W设为0

  3. 将命令写入数据端口

  4. 延时,将E设为1

  5. 延时,将E设为0

1.5时序参数

时序参数

1.6清屏

命令字节格式为:0x01

执行命令后,会清除屏幕的所有数值,也就是将光标移至开头的左上角

清屏

1.7输入方式设置

命令的字节格式为: 0x04 + N

输入方式设置

1.8显示开关控制

配置地址:0x08+n,n为对应位数的配置

在显示开关设置命令中:显示开关设置命令为0x08 + N,其中N的取值决定了显示、光标及闪烁的状态。当 DB2 位(即N的第 2 位)为1时,表示开启光标闪烁;

显示开关控制

1.9功能设置

配置地址:0x30+n,n为配置对应的位数

在功能设置命令中:功能设置命令为0x30 + N,用于设置数据接口位数、显示行数和字符点阵等。当 DB2 位(即N的第 2 位)为1时,表示选择5x10点阵字符;

功能设置

可以直接传入一个16进制数,对相关参数进行单独设置,如:0x38(00111000)将DB4设置为1,DB3设置为1,DB2设置为1.

1.10LCD1602的屏幕数据怎么显示。

1602液晶内部包含DDRAM、CGROM以及CGRAM,DDRAM就是显示数据RAM,用来寄存待显示的字符代码,共80个字节,其地址与屏幕的对应关系如下图所示:

地址与屏幕的关系

如果想在00处输入字符“A”,那么就需要在00地址处输入字符“A”的代码。(ASCII码)

数据写入地址,DDRAM中第一行为0x80+0x

​ DDRAM中第二行为0xC0+0x

1602液晶内部具有字符存储器,也就是CGROM,共存储了192个常用字符的字模,比如要显示“A”,也就是要将CGROM的字符存储器里的字符代码写入到DDRAM中1602液晶的字符代码显示数字、字母时均可以用ASCII码表示,操作时直接用“A”,“1”等这样的格式进行。

1.11LCD1602显示屏显示(实操)

D0~D7接P3.0~P3.7

RS,RW,E接P1.2,P1.3,P1.4

背光正极接5V,背光负极接地

V0接电位器(由于没有硬件,这里由PWM输出)

#include "msp430f5529.h"

#define CPU_CLOCK 1000000  // 假设 CPU 时钟为 1MHz
#define PWM_FREQUENCY 1000  // PWM 频率 1kHz
#define PWM_PERIOD (CPU_CLOCK / PWM_FREQUENCY)  // PWM 周期
#define delay_ms(x) __delay_cycles((x) * CPU_CLOCK / 1000)
#define delay_us(x) __delay_cycles((x) * CPU_CLOCK / 1000000)

// LCD1602 控制引脚定义
#define RS_CLR P1OUT &= ~BIT2  // RS = 0
#define RS_SET P1OUT |= BIT2   // RS = 1
#define RW_CLR P1OUT &= ~BIT3  // RW = 0
#define RW_SET P1OUT |= BIT3   // RW = 1
#define EN_CLR P1OUT &= ~BIT4  // EN = 0
#define EN_SET P1OUT |= BIT4   // EN = 1
#define DataPort P3OUT         // 数据端口

// 初始化 IO 口
void LCD1602_Port_init() {
    P3DIR |= 0xFF;  // 设置 P3 为输出(数据端口)
    P1DIR |= BIT2 + BIT3 + BIT4;  // 设置 P1.2, P1.3, P1.4 为输出(控制引脚)
}

// 写命令到 LCD1602
void LCD1602_WriteCommand(unsigned char com) {
    RS_CLR;  // RS = 0,选择命令寄存器
    RW_CLR;  // RW = 0,写操作
    DataPort = com;  // 发送命令
    EN_SET;  // EN = 1
    delay_us(10);  // 延时
    EN_CLR;  // EN = 0
    delay_ms(2);  // 延时
}

// 写数据到 LCD1602
void LCD1602_WriteData(unsigned char dat) {
    RS_SET;  // RS = 1,选择数据寄存器
    RW_CLR;  // RW = 0,写操作
    DataPort = dat;  // 发送数据
    EN_SET;  // EN = 1
    delay_us(10);  // 延时
    EN_CLR;  // EN = 0
    delay_ms(2);  // 延时
}

// 初始化 LCD1602
void LCD1602_Init() {
    delay_ms(15);  // 等待 LCD 上电稳定
    LCD1602_WriteCommand(0x38);  // 8 位数据接口,2 行显示,5x7 点阵
    delay_ms(5);
    LCD1602_WriteCommand(0x0C);  // 显示开,光标关,光标不闪烁
    delay_ms(5);
    LCD1602_WriteCommand(0x06);  // 地址自动递增,不移屏
    delay_ms(5);
    LCD1602_WriteCommand(0x01);  // 清屏
    delay_ms(5);
}

// 在指定位置显示字符
void LCD1602_DisplayChar(unsigned char x, unsigned char y, unsigned char dat) {
    unsigned char addr;
    if (y == 0) {
        addr = 0x80 + x;  // 第一行地址
    } else {
        addr = 0xC0 + x;  // 第二行地址
    }
    LCD1602_WriteCommand(addr);  // 设置显示地址
    LCD1602_WriteData(dat);  // 写入数据
}

// 显示字符串
void LCD1602_DisplayString(unsigned char x, unsigned char y, unsigned char *str) {
    unsigned char addr;
    if (y == 0) {
        addr = 0x80 + x;  // 第一行地址
    } else {
        addr = 0xC0 + x;  // 第二行地址
    }
    LCD1602_WriteCommand(addr);  // 设置显示地址
    while (*str) {
        LCD1602_WriteData(*str++);  // 逐个写入字符
    }
}

// 配置 P2.4 为 TA0.1 输出(PWM)
void PWM_Init() {
    P2DIR |= BIT4;  // P2.4 设置为输出
    P2SEL |= BIT4;  // P2.4 选择外设功能(TA0.1)

    // 配置 Timer_A
    TA0CCR0 = PWM_PERIOD - 1;  // PWM 周期
    TA0CCTL1 = OUTMOD_7;       // 复位/置位模式
    TA0CCR1 = 0;               // 初始占空比为 0%
    TA0CTL = TASSEL_2 + MC_1;  // SMCLK 作为时钟源,增计数模式
}

// 设置PWM占空比
void PWM_SetDutyCycle(unsigned int duty) {
    if (duty > 100) duty = 100;  // 限制占空比范围
    TA0CCR1 = (duty * PWM_PERIOD) / 100;  // 设置占空比
}

void main(void) {
    WDTCTL = WDTPW | WDTHOLD;  // 关闭看门狗
    PWM_Init();  // 初始化 PWM
    LCD1602_Port_init();  // 初始化 IO 口
    LCD1602_Init();  // 初始化 LCD1602

    // 显示内容
    LCD1602_DisplayString(0, 0, "Hello, MSP430!");  // 第一行显示
    LCD1602_DisplayString(0, 1, "LCD1602 Test!");  // 第二行显示

    unsigned int duty = 0;  // 初始占空比
    while (1) {
        PWM_SetDutyCycle(duty);  // 设置占空比
        delay_ms(100);  // 延时
        duty += 10;     // 增加占空比
        if (duty > 100) duty = 0;  // 重置占空比
    }
}

相关文章:

  • 腾讯云大模型知识引擎×DeepSeek:股票分析低代码应用实践
  • 企业数字化转型规划设计1(107页PPT)(文末有下载方式)
  • FPGA时钟约束
  • 实时内核稳定性问题 - 压测异常重启问题
  • 取消Win10锁屏界面上显示的天气、市场和广告的操作
  • 【 C/C++ 包管理工具】vcpkg安装+使用
  • gradle-8.13
  • 【Java】TCP网络编程:从可靠传输到Socket实战
  • abaqus后处理导出多个节点数据的顺序
  • EtherCAT转Modbus网关如何在倍福plc组态快速配置
  • 【MCU】芯片复位与软件复位 在生产工装上的应用
  • 软考系统架构设计师之计算机组成与体系结构笔记
  • 蓝桥杯备考----小贪心+分类讨论问题---Popsicle
  • OAK相机入门(一):深度测距原理
  • lvgl学习(一)
  • xss-labs靶场训练
  • 从全局角度回顾Transformer白话版
  • 【大模型系列篇】深度解锁MCP模型上下文协议,赋能大模型玩转智能体
  • 实时监控、数据分析!Web-Check构建你的网站健康检测系统实操方案
  • SAP-ABAP:SAP系统架构技术白皮书
  • 引入AI Mode聊天机器人,Gemini 2.5 Pro加持,谷歌重塑搜索智能
  • 演员辛柏青发讣告:妻子朱媛媛患癌去世
  • F4方程式上海站引擎轰鸣,见证中国赛车运动不断成长
  • 外媒称北斗挑战GPS地位,外交部:中国的北斗也是世界的北斗
  • 中方是否支持或参加俄乌谈判?外交部:支持一切有利于和平的努力
  • 住建部:截至去年底常住人口城镇化率达到67%