|
此前的一贴:AI编程玩一元钱的ESP32-C2模块【3】——前两篇综合https://www.mydigit.cn/forum.php?mod=viewthread&tid=533626&fromuid=1505079
的阅读量为0,应该是帖子的水平太“菜”技术含量太“水”,也可能是没有同道新手感兴趣吧。
扔掉醋壶抖擞精神继续水贴。
今天玩通了这个小模块的I2C通讯,说起它的I2C接口我曾经对模块的器件ESP8684数据手册翻看了半天,但限于理解能力并没有找到相关硬件I2C通道、引脚的提示,咨询百度AI后得知它的I2C引脚是可以任意配置的,如此一来我就不知道我用到的是硬件I2C还是软件模拟了,但无论怎样我用Wire.h库实现了I2C通讯这就够了我也不愿意过深的研究了。
为了测试I2C通讯就要找一个I2C的器件,起初想找一个多年前玩过的带有经典I2C接口芯片AT24C02的模块但没有找到,却找到一个I2C接口的PCF8756驱动5位半数码的LCD段码屏。
于是在网页版的Deepseek提问:“给出ESP32C2点亮PCF8576驱动5位半8字段码屏的的arduino代码”,很快就得到了代码,编译烧录后段码屏毫无反应,看来这次AI编程翻车了,毕竟屏幕内部接线不同涉及到的控制字也不同程序自然就无法通用了。
于是重新百度搜集这个段码屏的资料,结果竟然搜到了十几年前我自己发的点亮这个屏的帖子,难得的是帖子里还有我自己拆屏描绘的接线原理图,只是那段根据别人的代码改编的程序现在来看真真的无法入眼也懒得测试了,接下来根据PCF8576的数据手册重新写了代码再次点亮了这块段码屏。
用于STC8H单片机硬件I2C控制的代码如下:
- //程序编写于2025/07/21,原创:wannenggong
- //程序用于时钟显示,显示画面为12-47
- //使用STC8H8K64U单片机的硬件I2C驱动PCF8576-5位半8字LCD段码屏
- //屏幕左侧的两个8字位原本显示:汉字“价格”、“折扣”、数字“1”,程序控制其没有显示、为空白状态
- //使用I2C-4通道,SCL=P3.2;SDA=P3.3;
- //烧录代码时设定系统时钟24MHz
- #include <STC8H.H>
- #include "I2C.h"
- #define PCF_BUS_ADDR 0x72 //PCF8756静态显示模式的I2C总线地址
- #define PCF_DISP_MODE 0x49 //PCF8756显示模式控制字
- #define PCF_RAM_START 0x00 //PCF8756内部显示数据存储单元RAM的起始地址
- #define PCF_SAX_ADDR 0x60 //多PCF8756器件联机时的器件地址
- #define DIS_FLKR_SET 0x70 //不闪烁显示命令字@最后一个命令(C=0)
- #define BT7_C 0x80 //控制指令8位数据的最高位C
- uchar Digit[] = {0xd7, 0x06, 0xe3, 0xa7, 0x36, 0xb5, 0xf5, 0x17, 0xf7, 0xb7, 0x20, 0x00}; //(10)0x20点亮g段,0x00是清除显示码
- uchar wei = 5; //LCD数码显示位数设定
- u8 cnt[5] = {1, 2, 10, 4, 7}; //用于时间显示数据缓存、初始显示时间为2-47
- //----发送显示数据函数-------------------------------
- void Display_Data() //显示时间数据
- {
- uchar i;
- i2c_start();
- write_dat(PCF_BUS_ADDR); //发送总线地址不执行BT7位规则
- Receive_ACK();
- write_dat(PCF_DISP_MODE | BT7_C); //静态显示模式,发送非最后一条指令时BT7位需要置1(C=1)
- Receive_ACK();
- write_dat(PCF_RAM_START | BT7_C);
- Receive_ACK();
- write_dat(PCF_SAX_ADDR | BT7_C);
- Receive_ACK();
- write_dat(DIS_FLKR_SET); //发送最后一条指令时BT7位需要置0(C=0),不进行|BT7_C操作
- Receive_ACK();
- for(i = 0; i < wei; i++) // 发送数据
- {
- write_dat(Digit[cnt[i]]);
- Receive_ACK();
- }
- i2c_stop();
- }
- //----主函数--------------------------------------
- void main(void)
- {
- EAXSFR();
- GPIO_set();
- P3PU = 0x0c;//P3.2、P3.3配置上拉电阻
- I2C_init();
- while(1)
- {
- Display_Data();
- }
- }
复制代码
有了C51程序,再次打开deepseek提问:将下述C51代码转换成ESP32C2代码
得到了arduino代码,修改了器件总线地址后测试成功,ESP32C2的代码如下:
- /**
- * ESP32-C2(即ESP8684)支持硬件I2C接口,
- * 但不同于传统固定引脚设计,其I2C引脚可通过软件指定任意GPIO。
- * 这意味着用户可自由选择空闲的GPIO作为SDA和SCL线,无需局限于特定物理引脚
- * 硬件连接:
- * 任意选择两个未占用的GPIO(如GPIO7和GPIO8),分别连接至外部设备的SDA与SCL线,并确保共地(GND)连接。
- * 在Arduino IDE中,通过Wire.begin(SDA_PIN, SCL_PIN)初始化自定义引脚
- **/
- #include <Wire.h>
- const int sdaPin = 7; // 自定义SDA引脚
- const int sclPin = 8; // 自定义SCL引脚
- #define PCF_BUS_ADDR 0x39 // PCF8576静态显示模式的I2C总线地址,8位地址为0x72,arduino中使用7位地址0x39
- #define PCF_DISP_MODE 0x49 // PCF8576显示模式控制字
- #define PCF_RAM_START 0x00 // PCF8576内部显示数据存储单元RAM的起始地址
- #define PCF_SAX_ADDR 0x60 // 多PCF8576器件联机时的器件地址
- #define DIS_FLKR_SET 0x70 // 不闪烁显示命令字(C=0)
- #define BT7_C 0x80 // 控制指令8位数据的最高位C
- // 数码管段码表 (共阴数码管)
- uint8_t Digit[] = {0xd7, 0x06, 0xe3, 0xa7, 0x36, 0xb5, 0xf5, 0x17, 0xf7, 0xb7, 0x20, 0x00};
- // 0-9数字的段码,10号(0x20)点亮g段,11号(0x00)是清除显示码
- uint8_t wei = 5; // 数码管显示位数设定
- uint8_t cnt[5] = {1, 2, 10, 4, 7}; // 显示数据缓存,初始显示"12 47"(10表示中间横杠)
- //----------------------------------------------------------
- void Display_Data()
- {
- Wire.beginTransmission(PCF_BUS_ADDR);//arduino发送器件的总线地址时有addr<<1将7位地址变成8位地址的操作
-
- // 发送控制命令
- Wire.write(PCF_DISP_MODE | BT7_C); // 设置显示模式
- Wire.write(PCF_RAM_START | BT7_C); // 设置RAM起始地址
- Wire.write(PCF_SAX_ADDR | BT7_C); // 设置从机地址
- Wire.write(DIS_FLKR_SET); // 设置不闪烁模式(C=0)
-
- // 发送显示数据
- for(uint8_t i = 0; i < wei; i++)
- {
- Wire.write(Digit[cnt[i]]); // 发送每位数字的段码
- }
-
- Wire.endTransmission();
- }
- //----------------------------------------------------------
- void setup()
- {
- Wire.begin(sdaPin, sclPin); // 初始化I2C总线,使用GPIO7作为SDA,GPIO8作为SCL
- Display_Data();
- }
- //----------------------------------------------------------
- void loop()
- {
- //delay(100);
- }
复制代码
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|