当前位置: 首页 > 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和211602的驱动芯片就是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); // EN1 vTaskDelay(1 / portTICK_PERIOD_MS); i2c_write_byte(high_nibble ~LCD_EN); // EN0 // Send low nibble i2c_write_byte(low_nibble); i2c_write_byte(low_nibble | LCD_EN); // EN1 vTaskDelay(1 / portTICK_PERIOD_MS); i2c_write_byte(low_nibble ~LCD_EN); // EN0 } // Send LCD data void lcd_send_data(uint8_t data) { uint8_t high_nibble (data 0xF0) | LCD_RS | LCD_BACKLIGHT; // RS1 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.rkmt.cn/news/1373224.html

相关文章:

  • 2026年Q2天津家族信托律师推荐:周宇律师的专业服务解析 - 2026年企业推荐榜
  • 2026年紫外线杀菌器技术解析与选型参考指南:不锈钢杀菌器、大功率紫外灯、水处理杀菌器、浸没式杀菌器、消毒杀菌器选择指南 - 优质品牌商家
  • 2026年至今,上海新风系统源头服务专家:合宜人居深度解析 - 2026年企业推荐榜
  • 2026排污许可证办理全解析:北京排水排污许可证/北京酒店特行许可证审批/城镇污水排入排水管网许可证/宾馆特行许可证/选择指南 - 优质品牌商家
  • 第一次的博客
  • Windows 批量解压 TAR 文件脚本:支持文件数量校验、断点续解压和自动跳过
  • MySQL InnoDB引擎八大核心特性详解(高频面试题)
  • 热江 - 绿色版手游官网下载:热江 - 绿色版最新官方下载渠道
  • 胖瘦 AP 网络仿真实验
  • 如何快速掌握窗口控制:简单实用的分辨率调整指南
  • 告别昂贵定位器!用Python和PyTorch复现DCL-Net,实现无传感器3D超声重建
  • Llama3-8B中文微调实战:用‘弱智吧’QA数据让模型学会说人话
  • 我随便做的几道python题目
  • CPU环境下LLM推理优化:缓存与预取策略实践
  • 第 12 周 周报
  • 记录一下航模涡喷发动机满载运行时叶片突然断裂
  • 如何用Python快速接入Taotoken调用多个大模型
  • CVE二进制工具:无源码漏洞检测的原理与实战
  • 文件加密软件哪款更稳定?实测推荐信企卫软件功能盘点,企业必看!
  • 星云阁科技新闻社|科技圈硬核迭代与全球化破壁新逻辑
  • 2026年免费在线去水印软件详细教程,新手一看就会
  • 基于SpringBoot+WebSocket的实时火灾报警模拟系统毕设
  • 瑞德克斯在手机端的表现稳不稳?是否适合随时查看行情?
  • 深度专栏 | 撕碎“手工浪漫”:精品可可的硬核工业底色与绝对复现
  • 避坑指南:处理NOAA海温数据时,关于陆地掩膜、时间解析和面积加权的三个常见错误
  • 避坑指南:用SARIMA做时间序列预测时,这5个参数调优错误千万别犯(Python实战)
  • 从‘交并比’到损失函数:一文搞懂Dice Loss在图像分割里的前世今生与代码实现
  • 芯片合封是个嘛?
  • 小学期第二周学习笔记
  • 2026年至今,河北扁钢走线架厂商实力与选择逻辑剖析 - 2026年企业推荐榜