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

esp开发与应用(1602液晶显示屏)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

模块当中,有的是比较简单的,比如说蜂鸣器,尤其是有源蜂鸣器。大家可以把它想象成是一个gpio输出的喇叭,通电就有声音,没通电就没有声音。整个模块也就三个pin,一个是电源,一个是地,还有一个就是gpio控制开关。所以蜂鸣器不复杂。但相比较而言,还有一些模块,会稍微复杂一点,比如说1602液晶屏幕。过去的1602屏幕占用的pin比较多,但是后来出了一个PCF8574芯片,这就方便多了。相当于这是一个i2c接口的芯片,我们只要对PCF8574进行控制,就可以让PCF8574控制屏幕,最终让1602屏幕显示文字和符号了。

1、找到esp32的i2c口

在esp32上面,默认第一个i2c口就是gpio22和gpio21,前者是scl,后者是sda。

2、找到电源部分

这里需要注意的部分,就是输入电压。一般esp32上面有两个电压,一个是5v,一个是3.3v。5v就是直接usb传进来的电压,3.3v也是5v转的电压。但对于1602模块呢,它需要5v的电压,所以这部分还是要找到5v的电压入口。

3、连接好esp32模块和1602模块

连接的时候采用的是母对母的杜邦线,这部分不复杂,但是要细心一点。

4、编写代码

编写代码这部分,如之前所说,还是用ai来写比较好。我们需要告诉ai的是,当前使用的i2c是第一个,gpio用的是22和21,1602的驱动芯片就是PCF8574,然后希望它编写一个简单的输出小程序。这样不出意外的话,ai就可以帮助我们生成代码。有条件的,可以vs code上直接购买ai插件生成代码。如果不行,用deepseek生成后,拷贝粘贴过来,也是可以的。

#include <stdio.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/i2c.h" // I2C configuration #define I2C_MASTER_SCL_IO 22 // SCL pin #define I2C_MASTER_SDA_IO 21 // SDA pin #define I2C_MASTER_NUM I2C_NUM_0 // I2C port number #define I2C_MASTER_FREQ_HZ 100000 // I2C frequency // PCF8574 I2C address (common: 0x27 or 0x3F) #define PCF8574_ADDR 0x27 // PCF8574 pin definitions (connected to 1602 LCD) #define LCD_RS 0x01 // P0 #define LCD_RW 0x02 // P1 #define LCD_EN 0x04 // P2 #define LCD_BACKLIGHT 0x08 // P3 #define LCD_D4 0x10 // P4 #define LCD_D5 0x20 // P5 #define LCD_D6 0x40 // P6 #define LCD_D7 0x80 // P7 // LCD commands #define LCD_CLEAR 0x01 #define LCD_HOME 0x02 #define LCD_ENTRY_MODE 0x04 #define LCD_DISPLAY_CTRL 0x08 #define LCD_CURSOR_SHIFT 0x10 #define LCD_FUNCTION_SET 0x20 #define LCD_CGRAM_ADDR 0x40 #define LCD_DDRAM_ADDR 0x80 // I2C write byte to PCF8574 static esp_err_t i2c_write_byte(uint8_t data) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, (PCF8574_ADDR << 1) | I2C_MASTER_WRITE, true); i2c_master_write_byte(cmd, data, true); i2c_master_stop(cmd); esp_err_t ret = i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); i2c_cmd_link_delete(cmd); return ret; } // Send LCD command void lcd_send_cmd(uint8_t cmd) { uint8_t high_nibble = (cmd & 0xF0) | LCD_BACKLIGHT; // High nibble + backlight uint8_t low_nibble = ((cmd << 4) & 0xF0) | LCD_BACKLIGHT; // Low nibble + backlight // Send high nibble i2c_write_byte(high_nibble); i2c_write_byte(high_nibble | LCD_EN); // EN=1 vTaskDelay(1 / portTICK_PERIOD_MS); i2c_write_byte(high_nibble & ~LCD_EN); // EN=0 // Send low nibble i2c_write_byte(low_nibble); i2c_write_byte(low_nibble | LCD_EN); // EN=1 vTaskDelay(1 / portTICK_PERIOD_MS); i2c_write_byte(low_nibble & ~LCD_EN); // EN=0 } // Send LCD data void lcd_send_data(uint8_t data) { uint8_t high_nibble = (data & 0xF0) | LCD_RS | LCD_BACKLIGHT; // RS=1 uint8_t low_nibble = ((data << 4) & 0xF0) | LCD_RS | LCD_BACKLIGHT; // Send high nibble i2c_write_byte(high_nibble); i2c_write_byte(high_nibble | LCD_EN); vTaskDelay(1 / portTICK_PERIOD_MS); i2c_write_byte(high_nibble & ~LCD_EN); // Send low nibble i2c_write_byte(low_nibble); i2c_write_byte(low_nibble | LCD_EN); vTaskDelay(1 / portTICK_PERIOD_MS); i2c_write_byte(low_nibble & ~LCD_EN); } // Initialize LCD void lcd_init(void) { vTaskDelay(50 / portTICK_PERIOD_MS); // 4-bit mode initialization sequence lcd_send_cmd(0x33); vTaskDelay(5 / portTICK_PERIOD_MS); lcd_send_cmd(0x32); vTaskDelay(5 / portTICK_PERIOD_MS); // Function set: 4-bit, 2-line, 5x8 lcd_send_cmd(LCD_FUNCTION_SET | 0x08 | 0x00); vTaskDelay(5 / portTICK_PERIOD_MS); // Display control: display on, cursor off lcd_send_cmd(LCD_DISPLAY_CTRL | 0x04); vTaskDelay(5 / portTICK_PERIOD_MS); // Clear display lcd_send_cmd(LCD_CLEAR); vTaskDelay(20 / portTICK_PERIOD_MS); // Entry mode: cursor move right lcd_send_cmd(LCD_ENTRY_MODE | 0x02); vTaskDelay(5 / portTICK_PERIOD_MS); } // Set cursor position void lcd_set_cursor(uint8_t row, uint8_t col) { uint8_t addr = (row == 0) ? 0x00 : 0x40; lcd_send_cmd(LCD_DDRAM_ADDR | (addr + col)); } // Print string to LCD void lcd_print(const char *str) { while (*str) { lcd_send_data(*str++); } } // Initialize I2C void i2c_init(void) { i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, .scl_io_num = I2C_MASTER_SCL_IO, .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_MASTER_FREQ_HZ, }; i2c_param_config(I2C_MASTER_NUM, &conf); i2c_driver_install(I2C_MASTER_NUM, conf.mode, 0, 0, 0); } void app_main(void) { printf("1602 LCD I2C Driver (PCF8574)\n"); printf("SCL: GPIO%d, SDA: GPIO%d\n", I2C_MASTER_SCL_IO, I2C_MASTER_SDA_IO); printf("PCF8574 Address: 0x%02X\n", PCF8574_ADDR); // Initialize I2C i2c_init(); // Initialize LCD lcd_init(); // Display Hello, World! lcd_set_cursor(0, 0); lcd_print("Hello,"); lcd_set_cursor(1, 0); lcd_print("Fei ning ning!"); printf("LCD display complete!\n"); while (1) { vTaskDelay(1000 / portTICK_PERIOD_MS); } }

5、编译查看代码

代码输出后,首先编译一下。不能编译的代码价值不大。其次就是简单看一下流程,有没有i2c初始化、PCF8574初始化、发命令、发数据、显示数据这些动作。如果没有问题的话,就可以烧入显示了。不出意外,就可以看到屏幕的显示了。

6、调整电位器

实际显示的时候,字体的显示效果不一定好,即字体和背景的对比度可能不是很好。好在模块上面有一个明显的电位器。说是电位器,其实就是一个可调电阻,找一个十字起,微调一下即可。

http://www.jsqmd.com/news/880623/

相关文章:

  • 聚焦“纪律高危型”学生的考勤画像深度分析
  • C166开发中HEX文件生成问题解析与解决方案
  • 气象科研效率提升:用xarray和metpy优雅处理ERA5数据,自动计算Q1/Q2
  • 用Python手把手复现GRO淘金优化算法(附完整代码与CEC2005测试)
  • 2026年蒸发式冷却塔怎么选:闭式冷却塔、不锈钢冷却塔、冷却塔填料、凉水塔、圆形冷却塔、横流式冷却塔、玻璃钢冷却塔选择指南 - 优质品牌商家
  • 如何用OneNote Markdown插件快速提升笔记效率:终极指南
  • 避坑指南:用wsl --import迁移Ubuntu后,那些官网没明说的配置项(如默认用户、DNS)
  • 2026双头超声波机厂家怎么选:非标订做超声波清洗机/伺服超声波/包布热压机/单头高周波机/双头高周波机/同步熔断机/选择指南 - 优质品牌商家
  • 告别‘芝麻开门’:用Python和PyTorch搭建一个文本无关的声纹验证系统(附VoxCeleb数据集实战)
  • 记录一下航模涡喷发动机满载运行时叶片突然断裂
  • 2026高压发泡机技术解析:弹性体发泡机/方向盘高压泡机/水箱PU发泡机/热水器发泡机/热水器环戊烷发泡机/环戊烷发泡机/选择指南 - 优质品牌商家
  • 量子基准测试与PyQBench框架实践指南
  • CVE二进制工具:无源码漏洞检测的原理与实战
  • Windows 批量解压 TAR 文件脚本:支持文件数量校验、断点续解压和自动跳过
  • 2026年琼海靠谱装修公司实力大PK,究竟哪家更值得选?
  • Windows Cleaner技术架构解析:开源磁盘清理工具的模块化设计与实现
  • OpenClaw接入飞书详细教程
  • 函数指针调用的两种语法及其在嵌入式C中的应用
  • 第一次的博客
  • 四川型钢厂家现货批发|工程专用钢材一站式配送 - 四川盛世钢联营销中心
  • 别再死记硬背!用Python代码和D-Separation定理,5分钟搞懂贝叶斯网络的4种基本结构
  • AMD Ryzen处理器深度调试完全指南:掌握SMU系统管理单元的专业技巧
  • 第 12 周 周报
  • C2000 CPU Timer 学习笔记
  • 2026庭院烤漆门技术解析:室内烤漆门、庭院烤漆门、强化烤漆门、强化门墙柜、推拉门墙柜、无烤漆门、环保烤漆门、门墙柜一体选择指南 - 优质品牌商家
  • AI校园失物招领助手(实践团队总结)
  • 小学期学习——第二周
  • Java国密SM2证书Unknown curve异常的三步绕过方案
  • 大众点评数据采集实战:如何破解动态字体加密实现全站爬取
  • ARM SVE指令集:ST3B与ST3D存储指令详解