全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > 电子/半导体 > 嵌入式技术 >

【RTT大赛作品连载】 OLED显示中文

时间:2021-12-06 09:25

人气:

作者:admin

标签: OLED技术  RT-Thread  单片机  OLED 

导读:使用AB32VG1操作OLED显示文字信息,包括汉字取模方式介绍,汉字显示函数编写....

OLED是单片机开发中一个比较常用的外设,其像素位128X64。

OLED一般有两种驱动方式,IIC驱动或者SPI驱动,本文采用IIC驱动的方式。

一、硬件连接

poYBAGGrAE2AB-nXAABwDOEQodo187.pngIIC连接引脚

SCL — PE3

SDA — PE2

二、创建工程

1. 工程创建可以直接参考官方的文档,工程创建好了之后打开RT-ThreadSettings,添加软件包ssd1306。

pYYBAGGq_rCADzkNAAF8Dau8ryc462.png添加ssd1306软件包

2. 右键单击ssd1306,点击详细配置,勾选ssd1306所有选项

poYBAGGq_wCAfj0cAAB7ilY3mgM571.pngssd1306配置

3. 切换到硬件标签栏,勾选使能软件模拟IIC

poYBAGGq_8iAVFigAABdVfSUVcc845.png软件IIC配置

4.然后编译,下载在msh命令中断数据ssd1306_TestAll就可以打开测试程序看到OLED测试效果。

三、修改代码

上面的代码可以操作OLED显示英文字母以及数字,但是显示不了图片以及文字,这部分功能需要我们自行添加。下面将详细介绍如何添加我们自己的中文字符显示程序以及16X16,24X24,48X48,64X64像素(其他像素的图片可以根据需要自行修改)的图片显示程序。

在applications目录下创建五个文件分别为:

pYYBAGGrBRCALg1vAABYre8ks54601.png文件目录

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)取模方式选择,选择阴码,逐列式,顺向,我们的汉字显示函数也将根据这个方式来编写程序。

pYYBAGGrBF2AGF1pAAK5lsW8eR8440.png汉字取模方式

3)输入汉字,点击生成字幕,复制生成的字幕到工程中codetab.h中

poYBAGGrBMeAG6j9AAKXX6IA8GY953.png汉字取模

代码如下:

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);
    }
}

四、实践效果

完整代码在下一篇帖子中,有需要请移步。

pYYBAGGrCPSAdDmuAAn3aDhIPm8473.png

五、代码

详细代码请移步gitee:https://gitee.com/hehung/ab32-vg1_-rt-thread

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信