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

描述

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

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

 

一、硬件连接

SPIIIC连接引脚

SCL  — PE3

SDA — PE2

 

二、创建工程

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

SPI添加ssd1306软件包

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

SPIssd1306配置

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

SPI软件IIC配置

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

 

三、修改代码

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

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

SPI文件目录

 

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

SPI汉字取模方式

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

SPI汉字取模

代码如下:

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

 

四、实践效果

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

SPI

 

五、代码

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

 

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分