【Renesas RA6M4开发板之I2C(模拟)驱动ssd1306 OLED屏幕】

简介: 【Renesas RA6M4开发板之I2C(模拟)驱动ssd1306 OLED屏幕】

1.0 OLED

1.png

此图转载优信电子


有机发光二极管(OrganicLight-Emitting Diode,OLED),又称为有机电激光显示、有机发光半导体(OrganicElectroluminesence Display,OLED),是指有机半导体材料和发光材料在电场驱动下,通过载流子注入和复合导致发光的现象。本篇通过0.96寸OLED包采用I2C软串口示例程序演示。


1.1产品特性:

OLED(Organic Light-Emitting Diode):有机发光二极管又称为有机电激光显示,OLED显示技术具有自发光的特性,采用非常薄的有机材料涂层和玻璃基板,当有电流通过时,这些有机材料就会发光,而且OLED显示屏幕可视角度大,功耗低。OLED由于同时具备自发光、不需背光源(只上电是不会亮的,驱动程序和接线正确才会点亮)、对比度高、厚度薄、视角广、反应速度快、可用于挠曲面板、使用温度范围广、结构及制程简单等优异之特性。最先接触的12864屏都是LCD的,需要背光,功耗较高,而OLED的功耗低,更加适合小系统;由于两者发光材料的不同,在不同的环境中,OLED的显示效果更佳。模块供电可以是3.3V也可以是5V,不需要修改模块电路,OLED屏具有多个控制指令,可以控制OLED的亮度、对比度、开关升压电路等指令。操作方便,功能丰富。可显示汉字、ASClI、图案等。同时为了方便应用在产品上,预留4个M3固定孔,方便用户固定在机壳上。


1.2产品参数:

1、高分辨率:12864(和12864LCD相同分辨率,但该OLED屏的单位面积像素点多)

2、超广可视角度:大于160°

3、超低功耗:正常显示时0.06W

4、宽供电范围:直流3.3V-5V

5、工业级:工作温度范围-30℃~70℃

6、体积小:27mm27mm*2mm

7、通信方式:l2C

8:、亮度、对比度可以通过程序指令控制

9:、使用寿命不少于16000小时

10、OLED屏幕内部驱动芯片:SSD1306


2. RT-theard配置

2.1 硬件需求

1、需要0.96寸I2C驱动的OLED屏幕进行动态显示,SDA—p511(p50b);SCL—p512(p50c),公式首先将p去掉还有三位,以p511为例,最后转换的数字为 “(5x16x16)+(1x10)+1”算出来为 1291 转换为16进制为0x50b。注:在程序里的话需要将字符转为数字。


实现功能:

OLED屏幕;画直线、矩形框、画圆、画光标、字体。

板载按键中断交互,LED3 1Hz频闪。


2.11.png


ssd1306屏幕地址看电阻接线情况为:0x3c(后面需要用到)

2、RA6M4开发板

2.12.png

3、USB下载线,ch340串口和附带6根母母线,rx—p613;tx—p614

2.13.png


2.2 软件配置

Renesas RA6M4开发板环境配置参照:【基于 RT-Thread Studio的CPK-RA6M4 开发板环境搭建】

1、新建项目RA6M4-IIC工程

2.21.png

2、点击RT-theard Setting,在软件包下添加软件包,然后搜索ssd相关软件支持包,点击添加即可,然后出现对应包。

2.22.png

3、配置ssd306,右键选择配置项

2.23.png

4、在软件包中配置上述地址0x3c,开启示例

2.24.png

5、在硬件中,启动I2C,设置端口

2.25.png


6、全部保存刚刚的配置,更新当前配置文件

2.26.png

保存完是灰色,没有保存是蓝色。


3. 代码分析

1、刚刚加载软件包在packages文件夹下,示例代码为

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);
}
#ifdef FINSH_USING_MSH
MSH_CMD_EXPORT(ssd1306_TestAll, test ssd1306 oled driver);
#endif


2、此库包含画直线(ssd1306_TestPolyline();)、矩形框(ssd1306_TestRectangle();)、画圆(ssd1306_TestCircle();)、画光标(ssd1306_TestArc();)、字体(ssd1306_TestFonts();)。调用时直接在串口CMD命令输入“ssd1306_TestAll”,即可查看对应切换。

3.2.png

3、main.c文件在re_gen文件夹下,主程序围绕“hal_entry();”函数(在src文件夹)

main.c

/* generated main source file - do not edit */
#include "hal_data.h"
            int main(void) {
              hal_entry();
              return 0;
            }


hal_entry.c

/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author        Notes
 * 2021-10-10     Sherman       first version
 * 2021-11-03     Sherman       Add icu_sample
 */
#include <rtthread.h>
#include "hal_data.h"
#include <rtdevice.h>
#define LED3_PIN    BSP_IO_PORT_01_PIN_06
#define USER_INPUT  "P105"
void hal_entry(void)
{
    rt_kprintf("\nHello RT-Thread!\n");
    while (1)
    {
        rt_pin_write(LED3_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED3_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}
void irq_callback_test(void *args)
{
    rt_kprintf("\n IRQ00 triggered \n");
}
void icu_sample(void)
{
    /* init */
    rt_uint32_t pin = rt_pin_get(USER_INPUT);
    rt_kprintf("\n pin number : 0x%04X \n", pin);
    rt_err_t err = rt_pin_attach_irq(pin, PIN_IRQ_MODE_RISING, irq_callback_test, RT_NULL);
    if(RT_EOK != err)
    {
        rt_kprintf("\n attach irq failed. \n");
    }
    err = rt_pin_irq_enable(pin, PIN_IRQ_ENABLE);
    if(RT_EOK != err)
    {
        rt_kprintf("\n enable irq failed. \n");
    }
}
MSH_CMD_EXPORT(icu_sample, icu sample);

4. 下载验证

1、编译重构


4.11.png

4.12.png

编译成功


2、下载程序

4.2.png

下载成功


3、CMD串口调试

4.31.png


然后板载复位

输入:ssd1306_TestAll,开始显示!🎉🎉🎉

4.32.png

效果如下

4.33.gif

目录
相关文章
|
Java 测试技术 容器
Spring框架-ObjectProvider更加宽泛的依赖注入
从上面的过程中我们可以看出,但Spring中某个Bean的依赖类型为ObjectProvider时,我们不需要提供一个ObjectProvider类型的Bean到容器中,只需要提供一个T类型的Bean到容器中,容器会自动将其包装成一个ObjectProvider,然后注入到依赖中
358 0
|
Java 计算机视觉
Java调用opencv图片矫正
Java调用opencv图片矫正
1022 0
|
监控 安全 量子技术
【2023 年第十三届 MathorCup 高校数学建模挑战赛】 B 题 城市轨道交通列车时刻表优化问题 详细建模方案及代码实现
本文详细介绍了2023年第十三届MathorCup高校数学建模挑战赛B题的城市轨道交通列车时刻表优化问题,提供了详细的建模方案、优化目标、约束条件以及MATLAB代码实现,旨在最小化企业运营成本并最大化服务水平。
206 0
|
11月前
|
机器学习/深度学习 人工智能 芯片
【AI系统】谷歌 TPU v4 与光路交换
TPU v4 是谷歌在 TPU v3 发布四年后推出的最新一代 AI 加速器,采用了 7nm 工艺,MXU 数量翻倍,内存容量和带宽显著提升。TPU v4 引入了 Sparse Core 以优化稀疏计算,首次采用了 3D Torus 互联方式,通过 Palomar 光路开关芯片减少系统延迟和功耗。TPU v4 Pod 实现了 1.126 Exaflops 的 BF16 峰值算力,展现了谷歌在大规模并行计算领域的突破。然而,TPU v4 也面临着系统成熟度低、拓扑僵硬和负载均衡问题等挑战。
514 0
|
开发工具 数据安全/隐私保护 git
Lerna 使用教程 -- 开发脚手架的流程和核心命令详解
Lerna 使用教程 -- 开发脚手架的流程和核心命令详解
415 0
|
人工智能 黑灰产治理 开发者
虚拟模特,一键生成高颜值AI模特!活动震撼来袭,快来生成你的高颜值模特大片!
体验”通义万相-虚拟模特“,晒出属于你的高颜值AI模特大片,在活动页面提交作品以及使用反馈,即有机会获得反馈奖哦!
1094 11
虚拟模特,一键生成高颜值AI模特!活动震撼来袭,快来生成你的高颜值模特大片!
|
Java 关系型数据库 MySQL
基于SpringBoot后端实现连接MySQL数据库并存贮数据
基于SpringBoot后端实现连接MySQL数据库并存贮数据
STM32F103驱动oled显示屏
STM32F103驱动oled显示屏
498 0
|
监控 安全
Video-LLaMa:利用多模态增强对视频内容理解
在数字时代,视频已经成为一种主要的内容形式。但是理解和解释视频内容是一项复杂的任务,不仅需要视觉和听觉信号的整合,还需要处理上下文的时间序列的能力。本文将重点介绍称为video - llama的多模态框架。Video-LLaMA旨在使LLM能够理解视频中的视觉和听觉内容。论文设计了两个分支,即视觉语言分支和音频语言分支,分别将视频帧和音频信号转换为与llm文本输入兼容的查询表示。
767 1
|
域名解析 应用服务中间件 Linux
服务器搭建网站完整教程
服务器最大的用途,就是可以搭建网站,许多人都认为搭建网站是一件很难的事情,因为包含许多的比较专业东西,比如服务器、编程之类的,确实,在几年前是这样的,普通人想要自己做一个网站太难了 但是随着网站发展了那么多年,已经有许多的其他人做好的工具我们可以利用起来,建一个网站已经越来越简单了,甚至不需要了解代码点几下鼠标就能创建自己的网站,而且比以前的更加的好用,今天主机笔记就介绍下新手如何使用宝塔面板和Wordpress搭建独立网站宝塔面板?正如它的宣传语:一个简单好用的 Linux/Windows 面板。
5816 1