【匠芯创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
|