欢迎光临
我们一直在努力

51单片机从零到实战(9)——LCD1602驱动

第 9 篇:LCD1602 液晶屏

数码管只能显示数字。LCD1602 能显示两行 × 16 个字符——字母、数字、符号都能显示。


1. 引脚与接线

LCD1602(8 位并行模式):

RS → P2.0 (0=命令, 1=数据)
RW → P2.1 (0=写, 1=读)
E → P2.2 (使能,下降沿触发)
D0-D7 → P0.0-P0.7 (8 位数据)
V0 → 10kΩ 电位器(调对比度)


2. 驱动代码(精简版)

sbit LCD_RS = P2^0;
sbit LCD_RW = P2^1;
sbit LCD_E = P2^2;
#define LCD_DATA P0

void lcd_write_cmd(unsigned char cmd) {
LCD_RS = 0; LCD_RW = 0;
LCD_DATA = cmd;
LCD_E = 1; delay_us(5); LCD_E = 0;
delay_ms(2); // 命令需要时间执行
}

void lcd_write_data(unsigned char dat) {
LCD_RS = 1; LCD_RW = 0;
LCD_DATA = dat;
LCD_E = 1; delay_us(5); LCD_E = 0;
delay_us(50);
}

void lcd_init(void) {
delay_ms(20); // 等 LCD 上电稳定
lcd_write_cmd(0x38); // 8 位、2 行、5×7 点阵
lcd_write_cmd(0x0C); // 开显示,关光标
lcd_write_cmd(0x06); // 写入后指针右移
lcd_write_cmd(0x01); // 清屏
}

void lcd_set_cursor(unsigned char row, unsigned char col) {
lcd_write_cmd(0x80 + (row * 0x40) + col);
// 第 1 行起始地址 0x00,第 2 行起始地址 0x40
}

void lcd_print(char *str) {
while (*str) lcd_write_data(*str++);
}


3. 显示数字

void lcd_print_num(unsigned int num) {
char buf[6];
sprintf(buf, "%u", num); // 数字转字符串
lcd_print(buf);
}

// 显示带小数的温度
void lcd_print_temp(float temp) {
char buf[8];
sprintf(buf, "%.1f", temp); // 保留 1 位小数
lcd_print(buf);
lcd_print_data(0xDF); // °符号
lcd_print("C");
}


4. 完整示例

void main() {
lcd_init();
lcd_set_cursor(0, 2);
lcd_print("Hello MCU!");
lcd_set_cursor(1, 0);
lcd_print("Temp: 25.6");
lcd_print_data(0xDF);
lcd_print("C");
while (1);
}

LCD 显示效果:
┌──────────────────┐
│ Hello MCU! │ ← 第 1 行
│ Temp: 25.6°C │ ← 第 2 行
└──────────────────┘


下一篇:矩阵键盘——16 个按键只占 8 个 IO 口

赞(0)
未经允许不得转载:171主机测评 » 51单片机从零到实战(9)——LCD1602驱动
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址