453|0

410

帖子

3

TA的资源

纯净的硅(高级)

楼主
 

【匠芯创D133CBS】I2C驱动OLED显示屏 [复制链接]

  本帖最后由 TL-LED 于 2024-9-11 23:33 编辑

测试I2C接口,驱动OLED显示屏。

 

一、硬件电路

 

电路板上方面外部连接的I2C端口就是J11插件对应的I2C0。

1.1、I2C0接口电路图部分

1.2、硬件连接图

 

二、配置I2C

 

2.1、打开I2C0

 

2.2、使能I2C驱动调试和例程

 

三、配置第三方库

 

3.1、选择SSD1306库

 

3.2、选择I2C0和使能测试例程

 

选择完成后 ,执行命令pkgs --update跟新库文件

下载完成后,会在packages目录下找到源文件

 

四、程序

 

4.1、ssd1306_tests.c

/*
 * Copyright (c) 2020, RudyLo <luhuadong@163.com>
 *
 * SPDX-License-Identifier: MIT License
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-11-15     luhuadong    the first version
 */

#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>

#include <string.h>
#include <stdio.h>
#include "ssd1306.h"
#include "ssd1306_tests.h"

void ssd1306_TestBorder()
{
    ssd1306_Fill(Black);

    uint32_t start = rt_tick_get();
    uint32_t end = start;
    uint8_t x = 0;
    uint8_t y = 0;
    do {
        ssd1306_DrawPixel(x, y, Black);

        if((y == 0) && (x < 127))
            x++;
        else if((x == 127) && (y < 63))
            y++;
        else if((y == 63) && (x > 0)) 
            x--;
        else
            y--;

        ssd1306_DrawPixel(x, y, White);
        ssd1306_UpdateScreen();
    
        rt_thread_mdelay(5);
        end = rt_tick_get();
    } while((end - start) < 8000);
   
    rt_thread_mdelay(1000);
}

void ssd1306_TestFonts()
{
    ssd1306_Fill(Black);
    ssd1306_SetCursor(2, 0);
    ssd1306_WriteString("Font 16x26", Font_16x26, White);
    ssd1306_SetCursor(2, 26);
    ssd1306_WriteString("Font 11x18", Font_11x18, White);
    ssd1306_SetCursor(2, 26+18);
    ssd1306_WriteString("Font 7x10", Font_7x10, White);
    ssd1306_SetCursor(2, 26+18+10);
    ssd1306_WriteString("Font 6x8", Font_6x8, White);
    ssd1306_UpdateScreen();
}

void ssd1306_TestFPS()
{
    ssd1306_Fill(White);
   
    uint32_t start = rt_tick_get();
    uint32_t end = start;
    int fps = 0;
    char message[] = "ABCDEFGHIJK";
   
    ssd1306_SetCursor(2,0);
    ssd1306_WriteString("Testing...", Font_11x18, Black);
   
    do {
        ssd1306_SetCursor(2, 18);
        ssd1306_WriteString(message, Font_11x18, Black);
        ssd1306_UpdateScreen();
       
        char ch = message[0];
        memmove(message, message+1, sizeof(message)-2);
        message[sizeof(message)-2] = ch;

        fps++;
        end = rt_tick_get();
    } while((end - start) < 5000);
   
    rt_thread_mdelay(1000);

    char buff[64];
    fps = (float)fps / ((end - start) / 1000.0);
    snprintf(buff, sizeof(buff), "~%d FPS", fps);
   
    ssd1306_Fill(White);
    ssd1306_SetCursor(2, 18);
    ssd1306_WriteString(buff, Font_11x18, Black);
    ssd1306_UpdateScreen();
}

void ssd1306_TestLine()
{
    ssd1306_Line(1,1,SSD1306_WIDTH - 1,SSD1306_HEIGHT - 1,White);
    ssd1306_Line(SSD1306_WIDTH - 1,1,1,SSD1306_HEIGHT - 1,White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestRectangle()
{
    uint32_t delta;

    for(delta = 0; delta < 5; delta ++) 
    {
        ssd1306_DrawRectangle(1 + (5*delta),1 + (5*delta) ,SSD1306_WIDTH-1 - (5*delta),SSD1306_HEIGHT-1 - (5*delta),White);
    }
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestCircle()
{
    uint32_t delta;

    for(delta = 0; delta < 5; delta ++) 
    {
        ssd1306_DrawCircle(20* delta+30, 30, 10, White);
    }
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestArc()
{
    ssd1306_DrawArc(30, 30, 30, 20, 270, White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestPolyline()
{
    SSD1306_VERTEX loc_vertex[] =
    {
        {35,40},
        {40,20},
        {45,28},
        {50,10},
        {45,16},
        {50,10},
        {53,16}
    };

    ssd1306_Polyline(loc_vertex,sizeof(loc_vertex)/sizeof(loc_vertex[0]),White);
    ssd1306_UpdateScreen();
    return;
}

void ssd1306_TestAll()
{
    ssd1306_Init();

    ssd1306_TestFPS();
    rt_thread_mdelay(3000);

    ssd1306_TestBorder();

    ssd1306_TestFonts();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestRectangle();
    ssd1306_TestLine();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestPolyline();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestArc();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_TestCircle();
    rt_thread_mdelay(3000);

    ssd1306_Fill(Black);
    ssd1306_SetCursor(0, 0);
    ssd1306_WriteString("MCU:D133CBS", Font_11x18, White);
    ssd1306_SetCursor(0, 20);
    ssd1306_WriteString("I2C:OLED", Font_11x18, White);
    ssd1306_UpdateScreen();
    rt_thread_mdelay(3000);
}

#ifdef FINSH_USING_MSH
MSH_CMD_EXPORT(ssd1306_TestAll, test ssd1306 oled driver);
#endif

 

4.2、ssd1306_tests.h

/*
 * Copyright (c) 2020, RudyLo <luhuadong@163.com>
 *
 * SPDX-License-Identifier: MIT License
 *
 * Change Logs:
 * Date           Author       Notes
 * 2020-11-15     luhuadong    the first version
 */

#ifndef __SSD1306_TEST_H__
#define __SSD1306_TEST_H__

#include <_ansi.h>

_BEGIN_STD_C

void ssd1306_TestBorder(void);
void ssd1306_TestFonts(void);
void ssd1306_TestFPS(void);
void ssd1306_TestAll(void);
void ssd1306_TestLine(void);
void ssd1306_TestRectangle(void);
void ssd1306_TestCircle(void);
void ssd1306_TestArc(void);
void ssd1306_TestPolyline(void);



_END_STD_C

#endif // __SSD1306_TEST_H__

 

五、程序运行

 

下载程序后,串口终端执行ssd1306_TestAll,显示如下视频

101

 

点赞(1) 关注(1)
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
本人正在自学单片机

本人正在自学单片机<br>外面的教程书籍很多,但是基本上是产品手册的翻版,没有一本适合自学.为什么?因为这是一个经济的社会, ...

关于旁路电容的深度对话(很好很强大)

关于旁路电容的深度对话,感觉“神”级的一些讨论,读后收获很大 31417-%-277733-%-

TI数控电源diy的上位机软件,可显示曲线等

可以实时显示数据, 数据格式 是FF H8 L8(电压) H8 L8(电流) 曲线绘制没有分格式 单一数据绘制 下面的流程图怎么会多了eewo ...

十年研发经验工程师的嵌入式学习书籍大推荐(转帖)

本帖最后由 tiankai001 于 2017-1-30 23:07 编辑 从事嵌入式研发行业十年,认为学习就是要不断的吸纳知识,在研发过程中,经 ...

开关电源的电感选择和布局布线

开关电源(SMPS, Switched-Mode Power Supply)是一种非常高效的电源变换器,其理论值更是接近100%,种类繁多。按拓扑结构分, ...

全新国产AD/DA等芯片大全,

477979 最新比较全的国产芯片目录

PWM和模拟比较器在汽车ECU中有哪些应用

我想请教一下,很多汽车芯片有很多路PWM和ACMP模拟比较器,这两个模块在产品中具体有哪些应用,不要说他可以产生不同占空比的方 ...

【国产FPGA安路 高集成低功耗SF1系列FPSoC新品】按键控制流水灯测试

c6bec478dd1ac77098c1b30fa817ae9a 前言 前面测试了LED,这一篇继续结合KEY进行交互测试。 过程 新建工程 参考 ...

开关模式功率转换器设计与分析

本书通过一种解析求解开关模式功率转换器电路的新方法,对开关模式功率转换器进行了深入探讨,并给出相应的仿真分析、验证和理论 ...

《人工智能实践教程》5、神经网络输出层的设计

神经网络可以用于解决分类问题和回归问题,但需要根据情况改变输出层的激活函数。一般而言,回归问题用恒等函数,分类问题用Soft ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表