OLED是单片机开发中一个比较常用的外设,其像素位128X64。
OLED一般有两种驱动方式,IIC驱动或者SPI驱动,本文采用IIC驱动的方式。
一、硬件连接
IIC连接引脚SCL — PE3
SDA — PE2
二、创建工程
1. 工程创建可以直接参考官方的文档,工程创建好了之后打开RT-ThreadSettings,添加软件包ssd1306。
添加ssd1306软件包2. 右键单击ssd1306,点击详细配置,勾选ssd1306所有选项
ssd1306配置3. 切换到硬件标签栏,勾选使能软件模拟IIC
软件IIC配置4.然后编译,下载在msh命令中断数据ssd1306_TestAll就可以打开测试程序看到OLED测试效果。
三、修改代码
上面的代码可以操作OLED显示英文字母以及数字,但是显示不了图片以及文字,这部分功能需要我们自行添加。下面将详细介绍如何添加我们自己的中文字符显示程序以及16X16,24X24,48X48,64X64像素(其他像素的图片可以根据需要自行修改)的图片显示程序。
在applications目录下创建五个文件分别为:
文件目录
1. 创建OLED线程
static void OLED_ThreadManage(void)
{
rt_thread_t oled_thread;
oled_thread = rt_thread_create("OLED Thread Manage", /*线程名字*/
OLED_ManageEntry, /*线程入口函数*/
RT_NULL, /*线程入口函数参数*/
4096, /*线程栈大小*/
8, /*线程优先级*/
10); /*线程时间片*/
rt_thread_startup (oled_thread);
}
2. 初始化线程,将OLED_AppInit()放在main函数的while循环之前进行初始化。
void OLED_AppInit(void)
{
OLED_ThreadManage();
}
3. 编写汉字显示函数。
1)显示原理
汉字显示需要先使用专门的取模工具进行取模,然后调用ssd1306的画点函数ssd1306_DrawPixel()来在OLED的指定位置画上点来实现显示汉字的效果,取模软件使用PCtoLCD2002 OLED取模工具,可以自行在网上下载。
2)取模方式选择,选择阴码,逐列式,顺向,我们的汉字显示函数也将根据这个方式来编写程序。
汉字取模方式3)输入汉字,点击生成字幕,复制生成的字幕到工程中codetab.h中
汉字取模代码如下:
const unsigned char Hz[][16] ={
{0x00,0x80,0x01,0x00,0x06,0x00,0x1F,0xFF,0xE0,0x00,0x02,0x08,0x04,0x30,0x18,0xC0},
{0xF0,0x02,0x10,0x01,0x13,0xFE,0x10,0x00,0x10,0x80,0x14,0x60,0x18,0x18,0x00,0x00},/*"你",0*/
{0x08,0x02,0x08,0x44,0x0F,0xA8,0xF8,0x10,0x08,0x68,0x0F,0x86,0x00,0x00,0x01,0x00},
{0x41,0x02,0x41,0x01,0x47,0xFE,0x49,0x00,0x51,0x00,0x61,0x00,0x01,0x00,0x00,0x00},/*"好",1*/
{0x00,0x00,0x00,0x00,0x00,0x1A,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*",",2*/
{0x04,0x00,0x04,0x00,0x04,0x00,0x7F,0xFE,0x04,0x02,0x04,0x02,0xFF,0xE2,0x04,0x22},
{0x04,0x22,0x04,0x22,0xFF,0xE2,0x04,0x02,0x04,0x02,0x04,0x02,0x04,0x00,0x00,0x00},/*"世",3*/
{0x00,0x10,0x00,0x10,0x00,0x20,0x7F,0x21,0x49,0x46,0x49,0x78,0x49,0x80,0x7F,0x00},
{0x49,0x80,0x49,0x7F,0x49,0x40,0x7F,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x00},/*"界",4*/
};
4)函数显示函数如下,使用ssd1306_DrawPixel(x, y, White)来画点:
static void OLED_DrawHz(uint8_t x,
uint8_t y,
uint8_t chr,
SSD1306_COLOR color)
{
uint8_t temp,t,t1;
uint8_t y0=y;
uint8_t csize=32u;
chr <<= 1u;
for(t=0; t {
if(t == 16u)
chr += 1;
temp=(White == color) ? (Hz[chr][t%16]):(~Hz[chr][t%16]);
// temp=Hz[chr][t];
for(t1=0;t1<8;t1++)
{
if(temp&0x80)
ssd1306_DrawPixel(x, y, White);
temp<<=1;
y++;
if((y-y0) == 16)
{
y=y0;
x++;
break;
}
}
}
}
6)编写汉字显示函数,在OLED显示线程的Entry函数中编写汉字显示函数
static void OLED_ManageEntry(void *parameter)
{
ssd1306_Init(); /*IIC and OLED initial*/
OLED_DrawHz(0, 24, 0, White); /*0 - 你*/
OLED_DrawHz(16, 24, 1, White); /*1 - 好*/
OLED_DrawHz(32, 24, 2, White); /*2 - ,*/
OLED_DrawHz(48, 24, 3, White); /*3 - 世*/
OLED_DrawHz(64, 24, 4, White); /*4 - 界*/
ssd1306_UpdateScreen();
while(1)
{
rt_thread_mdelay(100);
}
}
四、实践效果
完整代码在下一篇帖子中,有需要请移步。
五、代码
详细代码请移步gitee:https://gitee.com/hehung/ab32-vg1_-rt-thread
全部0条评论
快来发表一下你的评论吧 !