显示模块(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个点阵表示)
1.2接口信号说明
1.3时序参数
1.4LCD1602读写操作时序
写指令操作过程
将RS设为0
将R/W设为0
将命令写入数据端口
延时,将E设为1
延时,将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; // 重置占空比
}
}