maxims 发表于 2016-3-14 17:33:34

【求分析】最近在研究ATTINY85的时候发现个OLED库,有段代码很神奇

先上代码库


这个库里边有一段代码,是把标准5*8的英文字库放大显示

首先,我们看一下标准大小的显示代码

void OLED::ssd1306_str_small(uint8_t x, uint8_t y, const char ch[], boolean invert)
{
        uint8_t c,i,j=0,pa;
        while(ch != '\0')
        {
                c = ch - 32;
                if(x>123)
                {
                        x=0;
                        y++;
                }
                ssd1306_setpos(x,y);
          for(i=0;i<5;i++)
                {
                        pa = pgm_read_byte(&font5_8) & 0x7f;
                        ssd1306_data(invert?(pa^0xff):pa);
                }
                ssd1306_data(invert?0xff:0);                //6th column
                x += 6;
                j++;
        }
}
上面是函数原型,下面是调用代码
display.ssd1306_str_small(62,3,"Digistump");

--------------------------------------------我是Maxims哥哥的分割线----------------------------------------------------
再看放大显示的函数原型

void OLED::ssd1306_str_big(uint8_t x, uint8_t y,const char ch[], boolean invert)
{
        uint8_t c,i,j=0,pa,spa;
        while (ch!='\0')
        {
                c = ch - 32;
                if (x>118)
                {
                        x=0;
                        y++;
                }
                ssd1306_setpos(x,y+1);
                for(i=0;i<5;i++)
                {
                        pa = pgm_read_byte(&font5_8);
                        spa = ((pa & 0x40)?0x30:0) | ((pa & 0x20)?0x0c:0) | ((pa & 0x10)?0x03:0);
                        ssd1306_data(invert?(spa^0xff):spa);
                        ssd1306_data(invert?(spa^0xff):spa);
                }
                ssd1306_data(invert?0xff:0);
                ssd1306_data(invert?0xff:0);

                ssd1306_setpos(x,y);
                for(i=0;i<5;i++)
                {
                        pa = pgm_read_byte(&font5_8);
                        spa = ((pa & 0x08)?0xc0:0) | ((pa & 0x04)?0x30:0) | ((pa & 0x02)?0x0c:0) | ((pa & 0x01)?0x03:0);
                        ssd1306_data(invert?(spa^0xff):spa);
                        ssd1306_data(invert?(spa^0xff):spa);
                       
                }
                ssd1306_data(invert?0xff:0);
                ssd1306_data(invert?0xff:0);
                x += 12;
                j++;
        }
}
上面是放大显示的函数原型,下面是调用代码
display.ssd1306_str_big(42, 1, "DEMO");

--------------------------------------------分割线又飘过了----------------------------------------------------
这是字库部分内容0~9
{0x3e, 0x51, 0x49, 0x45, 0x3e}, // 30 0
{0x80, 0x42, 0x7f, 0x40, 0x80}, // 31 1
{0x42, 0x61, 0x51, 0x49, 0x46}, // 32 2
{0x21, 0x41, 0x45, 0x4b, 0x31}, // 33 3
{0x18, 0x14, 0x12, 0x7f, 0x10}, // 34 4
{0x27, 0x45, 0x45, 0x45, 0x39}, // 35 5
{0x3c, 0x4a, 0x49, 0x49, 0x30}, // 36 6
{0x01, 0x71, 0x09, 0x05, 0x03}, // 37 7
{0x36, 0x49, 0x49, 0x49, 0x36}, // 38 8
{0x06, 0x49, 0x49, 0x29, 0x1e}, // 39 9


--------------------------------------------分割线我又飘过了----------------------------------------------------

那么,它放大5*8字库到大概2~4倍显示的原理是什么呢?
求分析,谢谢

maxims 发表于 2016-3-15 09:04:18

70多个人看~么一个发表点意见么?

老胖熊 发表于 2016-3-15 09:56:35

看过别外一个库,放大就是把一个点用四个点显示。

maxims 发表于 2016-3-15 10:09:39

老胖熊 发表于 2016-3-15 09:56 static/image/common/back.gif
看过别外一个库,放大就是把一个点用四个点显示。

原理是这样的,就如我的代码一样,我知道大概每句怎么用。
可是,代码为什么要这么写?
页: [1]
查看完整版本: 【求分析】最近在研究ATTINY85的时候发现个OLED库,有段代码很神奇