0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

闲来无事玩单片机呀 2021-12-06 09:25 次阅读

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43970

    浏览量

    620784
  • OLED技术
    +关注

    关注

    1

    文章

    65

    浏览量

    13168
  • OLED
    +关注

    关注

    118

    文章

    5984

    浏览量

    221423
  • SPI
    SPI
    +关注

    关注

    17

    文章

    1614

    浏览量

    89586
  • RT-Thread
    +关注

    关注

    31

    文章

    1148

    浏览量

    38866
收藏 人收藏

    评论

    相关推荐

    RTT大赛作品:AB32VG1开发板OLED显示实验

    最近在玩AB32VG1,在做OLED显示实验时,很多关于AB32VG1驱动OLED的文章,很多都是官方例程操作,在msh窗口中输入测试指令,测试驱动是否正常。很少有关于在main函数中直接实现的,本编文章直接在MAIN函数实现
    的头像 发表于 11-05 16:03 5819次阅读
    <b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b>:AB32VG1开发板<b class='flag-5'>OLED</b><b class='flag-5'>显示</b>实验

    RTT大赛作品连载】AB32VG1评估板到货控制彩灯测试

    RTT大赛作品连载】AB32VG1评估板到货控制彩灯测试篇;接下来看看在如何AB32VG1评估板控制彩灯! 在RT-ThreadStudio新建项目到对应开发配置及下载及验证测试!
    的头像 发表于 11-07 19:39 4849次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】AB32VG1评估板到货控制彩灯测试

    RTT大赛作品连载】CH32V103开发板资料及上电首测

    简介   参加论坛举办的rtt大赛也有几天了,我选用的是CH32V103的板子,第一步就是收集板卡的相关资料了。 CH32V103是 沁恒微电子设计的一款RSIC-V的单片机,使用了RSIC-V3A
    的头像 发表于 11-15 08:45 7611次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】CH32V103开发板资料及上电首测

    RTT大赛作品连载】AB32VG1评估板 音乐播放器

    RTT大赛作品连载】AB32VG1评估板 音乐播放器
    的头像 发表于 11-12 21:11 5882次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】AB32VG1评估板 音乐播放器

    RTT大赛作品连载】中科蓝讯AB32VG1开发板开箱篇

    介绍电路原理图分析接口说明,AB32VG1开发板是以中科蓝讯(Bluetrum)公司推出的基于RISC-V架构的高配置芯片AB5301A为核心所组成的。【RTT大赛作品连载】中科蓝讯A
    的头像 发表于 11-13 10:01 9698次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】中科蓝讯AB32VG1开发板开箱篇

    RTT大赛作品连载】CH32V RTT微秒延时的实现

    CH32V103是沁恒出的一款基于RiscV核心的单片机,在官网有该芯片的资料、库函数和例程,另外沁恒还开发了一款IDE: MounRiver Studio 。里面也提供了不少的例程可以参考,其中就有带rt-thread操作系统的例程,虽然只有一个LED的,但聊胜于无,毕竟rt-thread的bsp中还没有支持到这个芯片。 所以我就基于led功能进行了新功能的开发,但发现其中bsp这块确实匮乏,只有gpio和uart的drv实现,其他的都还没做移植,也罢,那我就!!   先不用其他了。。iic spi之类的直接
    的头像 发表于 11-29 08:30 7134次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】CH32V <b class='flag-5'>RTT</b>微秒延时的实现

    RTT大赛作品连载】 PWM操作蜂鸣器

    使用AB32VG1的PWM来操作无源蜂鸣器,能够输出频率为1KHz到20KHz的声音。
    的头像 发表于 12-06 08:36 8977次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】 PWM操作蜂鸣器

    RTT大赛作品连载OLED显示图片

    使用AB32VG1驱动IIC显示图片。
    的头像 发表于 12-06 09:17 6473次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】 <b class='flag-5'>OLED</b><b class='flag-5'>显示</b>图片

    RTT大赛作品连载】AB32VG1开发板之OLED

    驱动OLED屏.
    的头像 发表于 01-04 08:58 4147次阅读
    【<b class='flag-5'>RTT</b><b class='flag-5'>大赛</b><b class='flag-5'>作品</b><b class='flag-5'>连载</b>】AB32VG1开发板之<b class='flag-5'>OLED</b>屏

    【星核计划】上传FPGA大赛作品,领取电子发烧友专属上传福利!

    -FPGA大赛,本次大赛奖励丰厚,不仅有奖金,还有电子发烧友论坛为参赛者准备的上传福利,按照下面规则上传参赛作品即可获得,还在等什么,快来参加吧!!作品上传地址:【FPGA开发者项目
    发表于 05-21 15:01

    【文章连载】RT-Thread创新应用大赛文章汇总

    作者:RTT大赛学习经验分享 基于 rt-thread studio 的 sdk 开发 adc 的应用详解RTT大赛作品:AB32VG1开发
    发表于 10-11 15:13

    【有奖活动】RT-Thread创新应用大赛作品连载征文

    礼品:https://jifen.elecfans.com/index.html▷文章标题格式:【RTT大赛作品连载】+自拟内容▷文章作品
    发表于 10-21 18:49

    RTT大赛作品连载】AB32VG1开发板OLED显示实验

    最近在玩AB32VG1,在做OLED显示实验时,在csdn搜索了很多关于AB32VG1驱动OLED的文章,很多都是官方例程操作,在msh窗口中输入测试指令,测试驱动是否正常。很少有关于在main函数
    发表于 11-05 14:33

    【三等奖】RT-Thread创新应用设计大赛作品1

    项目简介:很荣幸能申请到AB32VG1开发板参加这次RTT的创新大赛,这个芯片的功能很强大。我基于这个开发板制作了一款桌面小工具一个小巧、功能丰富、具有实用价值的桌面物联网“控制中枢”。可以实现
    发表于 01-25 14:28

    国际程序设计大赛作品欣赏

    国际程序设计大赛作品欣赏,非常漂亮的程序
    发表于 08-18 17:26 0次下载