第 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 口



