AiCube 一键生成四大通信组合代码,轻松驱动 OLED-12864!

AiCube 自动生成【SPI,SPI-DMA,I2C,I2C-DMA】代码,驱动OLED-12864。4种通信组合,一网打尽,使用AiCube生成基于Ai8051U的 I2C / SPI 代码。大家可以轻松改到STC8H8K64U / STC32G12K128系列

01认识 OLED-12864 显示屏

(SPI+I2C,2种通信模式)

右图是网络上比较常用的OLED-12864显示屏,通过电阻跳线选择是SPI通信接口,还是I2C通信接口

图片

图片

当需要使用SPI接口时,R1、R2、R8不焊,R3、R4焊4.7K电阻,如左图

当需要使用I2C接口时,R2、R3、R9不焊,R1、R4焊4.7K电阻,R8焊0欧电阻,如右图

图片

02OLED-12864屏接口

本帖的测试环境使用的是Ai8051U试验箱V1.2,试验箱上的OLED12864接口如右图所示:

图片

此部分的接口电路图如下:

图片

SPI使用的是:

SS(P3.5),MOSI(P3.4),MISO(P3.3),SCLK(P3.2)这组端口===但进行了MOSI / MISO切换,也就是 SPI 变成了

SS(P3.5),MISO(P3.4),MOSI(P3.3),SCLK(P3.2)

强推挽 | 准双向口 | 强推挽 | 强推挽

I2C使用的是:

SCL(P3.2),SDA(P3.3)这组端口

准双向口      准双向口

开漏+上拉   开漏+上拉

图片

图片

图片

实验箱上的OLED接口是8Pin,本帖使用的OLED是7Pin,靠左对齐将屏插到接口上即可,如下图:

图片

03使用AiCube生成SPI驱动框架

打开AiCube,新建Ai8051U-32Bit项目

3.1 在图形化I/O配置界面中选择SPI的P3口切换组

图片

3.2 在图形化I/O配置界面对OLED相关的I/O模式做如下配置

(特别说明:为适配Ai8051U试验箱的电路图,本范例的SPI需要交换MISO和MOSI管脚功能,原本的MISO脚需要当作MOSI功能脚进行配置为强推挽)

图片

3.3  在图形化I/O配置界面配置完成后,务必勾选相应的端口,如下图
(若不勾选,则AiCube不会生成相应的初始化代码)

图片

3.4  如下图对SPI功能模块进行配置

(特别说明:为适配Ai8051U试验箱的电路图,本范例的SPI需要交换MISO和MOSI管脚功能,下图中“交换MISO和MOSI功能脚”项需要配置为“是”)

图片

3.5  完成上面的配置点击AiCube界面中的“创建Keil项目”按钮即可生成Keil项目框架及相应的代码

图片

04完善代码添加OLED驱动代码

4.1、添加OLED驱动代码和数据代码到项目中

打开AiCube自动生成的Keil项目,将OLED驱动代码"oled.c"和图片字库代码"tab.c"添加到项目中

图片

4.2  使用硬件SPI实现OLED的底层驱动代码(核心代码)

////////////////////////////////////////// 复位OLED// 入口参数: 无// 函数返回: 无////////////////////////////////////////voidOLED_RESET(){    OLED_RES = 1; delay_ms(200);    OLED_RES = 0; delay_ms(200);        //复位    OLED_RES = 1;}
////////////////////////////////////////// 写OLED命令// 入口参数: cmd (命令序列)//           len (命令长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_CMD(uint8_t *cmd, uint16_t len){    OLED_DC = 0;                        //写命令    OLED_SendData(cmd, len);}
////////////////////////////////////////// 写OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_DAT(uint8_t *dat, uint16_t len)    OLED_DC = 1;                        //写数据    OLED_SendData(dat, len);}
////////////////////////////////////////// 发送OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_SendData(uint8_t *dat, uint16_t len)    OLED_CS = 0;                       //片选使能
    while (len--)    {        SPI_SendData(*dat++);             //写数据        while (!SPI_CheckFlag());          //等待数据发生完成        SPI_ClearFlag();               //清除完成标志    }
    OLED_CS = 1;                      //片选禁能}

4.3  其它代码可参考附件中的代码完成
4.4  代码完成代码编写后,将编译生成的HEX文件下载到试验箱,即可看到如下效果

以上第一部分演示了使用AiCube生成硬件SPI代码驱动OLED的流程
下面第二部分演示使用AiCube生成硬件SPI-DMA代码驱动OLED的流程

 

01使用AiCube生成

SPI-DMA驱动框架

打开AiCube,新建Ai8051U-32Bit项目
1.1  I/O口配置可参考上面第一部分的配置方法
1.2  如下图对SPI功能模块进行配置,与1楼的区别是增加了SPI-DMA的配置

图片

1.3  完成上面的配置生成Keil项目框架及相应的代码

02完善代码添加OLED驱动代码

2.1  同样将添加OLED驱动代码和数据代码到项目中
2.2  使用硬件SPI-DMA实现OLED的底层驱动代码(核心代码)

////////////////////////////////////////// 写OLED命令// 入口参数: cmd (命令序列)//           len (命令长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_CMD(uint8_t *cmd, uint16_t len){    while (fSPIDMABusy);                //等待上一次传输完成
    OLED_DC = 0;                        //写命令    OLED_SendData(cmd, len);}
////////////////////////////////////////// 写OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_DAT(uint8_t *dat, uint16_t len){    while (fSPIDMABusy);                //等待上一次传输完成
    OLED_DC = 1;                        //写数据    OLED_SendData(dat, len);}
////////////////////////////////////////// 发送OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_SendData(uint8_t *dat, uint16_t len){    OLED_CS = 0;                        //片选使能       memcpy(pu8SPIDMATxBuffer, dat, len); //将数据复制到DMA缓冲区
    DMA_SPI_SetAmount(len - 1);         //设置DMA发送字节数    DMA_SPI_MasterTrigger();            //触发SPI主机DMA    fSPIDMABusy = 1;                    //设置DMA传输忙标志}

下面第三部分演示使用AiCube生成硬件I2C代码驱动OLED的流程

01

使用AiCube生成I2C驱动框架

打开AiCube,新建Ai8051U-32Bit项目

1.1  在图形化I/O配置界面中选择I2C的P3口切换组

图片

1.2  在图形化I/O配置界面对OLED相关的I/O模式做如下配置

图片

1.3  在图形化I/O配置界面配置完成后,务必勾选相应的端口,如下图
(若不勾选,则AiCube不会生成相应的初始化代码)

图片

1.4  如下图对I2C功能模块进行配置

图片

1.5  完成上面的配置点击AiCube界面中的“创建Keil项目”按钮即可生成Keil项目框架及相应的代码

02

完善代码添加OLED驱动代码

2.1  同样将添加OLED驱动代码和数据代码到项目中
2.2  使用硬件I2C实现OLED的底层驱动代码(核心代码)

////////////////////////////////////////// 写OLED命令// 入口参数: cmd (命令序列)//           len (命令长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_CMD(uint8_t *cmd, uint16_t len){    I2C_MasterStart();    I2C_MasterSendByte(0x78);           //从机地址    I2C_MasterSendByte(0x00);                    //写命令 (DC = 0)        OLED_SendData(cmd, len);}
////////////////////////////////////////// 写OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_DAT(uint8_t *dat, uint16_t len)    I2C_MasterStart();    I2C_MasterSendByte(0x78);                    //从机地址    I2C_MasterSendByte(0x40);                    //写数据 (DC = 1)        OLED_SendData(dat, len);}
////////////////////////////////////////// 发送OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_SendData(uint8_t *dat, uint16_t len)    while (len--)        I2C_MasterSendByte(*dat++);    I2C_MasterStop();}

第四部分演示使用AiCube生成硬件I2C-DMA代码驱动OLED12864的流程

01使用AiCube生成

SPI-DMA驱动框架

打开AiCube,新建Ai8051U-32Bit项目

1.1  I/O口配置可参考第三部分的配置方法

1.2  如下图对I2C功能模块进行配置,与第三部分的区别是增加了I2C-DMA的配置

图片

1.3  完成上面的配置生成Keil项目框架及相应的代码

02完善代码添加OLED驱动代码

2.1  同样将添加OLED12864驱动代码和数据代码到项目中

2.2  使用硬件I2C-DMA实现OLED12864的底层驱动代码(核心代码)

////////////////////////////////////////// 写OLED命令// 入口参数: cmd (命令序列)//           len (命令长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_CMD(uint8_t *cmd, uint16_t len){    while (fI2CDMABusy);                //等待上一次传输完成
    pu8I2CDMATxBuffer[0] = 0x78;        //从机地址    pu8I2CDMATxBuffer[1] = 0x00;            //写命令 (DC = 0)        OLED_SendData(cmd, len);            //发送命令序列}
////////////////////////////////////////// 写OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_WR_DAT(uint8_t *dat, uint16_t len)    while (fI2CDMABusy);                //等待上一次传输完成
    pu8I2CDMATxBuffer[0] = 0x78;        //从机地址    pu8I2CDMATxBuffer[1] = 0x40;            //写数据 (DC = 1)        OLED_SendData(dat, len);            //发送数据序列}
////////////////////////////////////////// 发送OLED数据// 入口参数: dat (数据序列)//           len (数据长度)// 函数返回: 无////////////////////////////////////////voidOLED_SendData(uint8_t *dat, uint16_t len){    memcpy(&pu8I2CDMATxBuffer[2], dat, len);
    while (I2C_CheckMasterBusy());      //等待I2C模块退出忙状态    DMA_I2C_EnableDMA();                //发送DMA命令前,先使能I2C DMA功能    I2C_StartSendDataRecvACK();         //I2C DMA发送数据必须使用09命令
    DMA_I2C_SetDMAAmount(len + 1);      //使能I2C DMA发送/接收总字节数    DMA_I2C_SetTxAmount(len + 1);       //设置I2C DMA发送总字节数    DMA_I2C_TriggerTx();                //触发I2C DMA发送
    fI2CDMABusy = 1;                    //设置DMA传输忙标志}

本文中的图片和字库均使用的是AIapp-ISP软件中的工具生成

图片

为配合OLED12864的数据存放格式,图片取模工具需要进行如下转换设置

图片

本文中的演示字库使用的是16*16的汉字点阵,字库生成工具需要进行如下设置

图片

AICube 是一种用于生成 AI 模型训练与推理相关资源的工具,其生成的图像文件通常用于数据集构建或可视化分析。在使用 AICube 生成图像文件后,如果在 IDE(如 VS Code、PyCharm、Jupyter Notebook 等)中无法查看图像,可能的原因包括文件路径配置错误、文件格式不兼容、IDE 插件缺失或图像加载方式不当。 ### 文件路径问题 生成的图像文件可能存储在项目目录之外或相对路径不正确,导致 IDE 无法识别或加载图像。建议检查 AICube 输出日志中指定的图像保存路径,并确认 IDE 中调用图像的路径是否正确。 ```python # 示例:检查图像文件是否存在 import os image_path = "output/images/generated_image.png" if os.path.exists(image_path): print("图像文件存在") else: print("图像文件不存在,请检查路径") ``` ### 文件格式兼容性问题 AICube 可能生成特定格式的图像文件(如 `.tiff` 或 `.webp`),而某些 IDE 或图像查看插件可能不支持这些格式。建议将图像转换为通用格式(如 `.png` 或 `.jpg`)[^1]。 ```python # 示例:使用 PIL 转换图像格式 from PIL import Image img = Image.open("output/images/generated_image.tiff") img.save("output/images/generated_image.png") ``` ### IDE 配置或插件问题 某些 IDE 默认不支持直接预览图像,尤其是非标准编辑器(如纯文本模式的 VS Code)。可以尝试安装图像预览插件,如 VS Code 的 "Image Preview" 扩展,或使用 Jupyter Notebook 直接显示图像。 ```python # 示例:在 Jupyter Notebook 中显示图像 from IPython.display import display, Image display(Image(filename="output/images/generated_image.png")) ``` ### 解决方法总结 - 确认图像文件的实际路径与代码中引用的路径一致。 - 检查图像格式是否为通用格式,必要时进行转换。 - 安装 IDE 图像预览插件或使用支持图像显示的环境(如 Jupyter Notebook)。 - 使用图像处理库(如 PIL、OpenCV)加载并显示图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值