极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9374|回复: 3

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

[复制链接]
发表于 2016-3-14 17:33:34 | 显示全部楼层 |阅读模式
先上代码库


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

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

  1. void OLED::ssd1306_str_small(uint8_t x, uint8_t y, const char ch[], boolean invert)
  2. {
  3.         uint8_t c,i,j=0,pa;
  4.         while(ch[j] != '\0')
  5.         {
  6.                 c = ch[j] - 32;
  7.                 if(x>123)
  8.                 {
  9.                         x=0;
  10.                         y++;
  11.                 }
  12.                 ssd1306_setpos(x,y);
  13.             for(i=0;i<5;i++)
  14.                 {
  15.                         pa = pgm_read_byte(&font5_8[c][i]) & 0x7f;
  16.                         ssd1306_data(invert?(pa^0xff):pa);
  17.                 }
  18.                 ssd1306_data(invert?0xff:0);                //6th column
  19.                 x += 6;
  20.                 j++;
  21.         }
  22. }
复制代码

上面是函数原型,下面是调用代码
  1. display.ssd1306_str_small(62,3,"Digistump");
复制代码


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

  1. void OLED::ssd1306_str_big(uint8_t x, uint8_t y,const char ch[], boolean invert)
  2. {
  3.         uint8_t c,i,j=0,pa,spa;
  4.         while (ch[j]!='\0')
  5.         {
  6.                 c = ch[j] - 32;
  7.                 if (x>118)
  8.                 {
  9.                         x=0;
  10.                         y++;
  11.                 }
  12.                 ssd1306_setpos(x,y+1);
  13.                 for(i=0;i<5;i++)
  14.                 {
  15.                         pa = pgm_read_byte(&font5_8[c][i]);
  16.                         spa = ((pa & 0x40)?0x30:0) | ((pa & 0x20)?0x0c:0) | ((pa & 0x10)?0x03:0);  
  17.                         ssd1306_data(invert?(spa^0xff):spa);
  18.                         ssd1306_data(invert?(spa^0xff):spa);
  19.                 }
  20.                 ssd1306_data(invert?0xff:0);
  21.                 ssd1306_data(invert?0xff:0);

  22.                 ssd1306_setpos(x,y);
  23.                 for(i=0;i<5;i++)
  24.                 {
  25.                         pa = pgm_read_byte(&font5_8[c][i]);
  26.                         spa = ((pa & 0x08)?0xc0:0) | ((pa & 0x04)?0x30:0) | ((pa & 0x02)?0x0c:0) | ((pa & 0x01)?0x03:0);  
  27.                         ssd1306_data(invert?(spa^0xff):spa);
  28.                         ssd1306_data(invert?(spa^0xff):spa);
  29.                        
  30.                 }
  31.                 ssd1306_data(invert?0xff:0);
  32.                 ssd1306_data(invert?0xff:0);
  33.                 x += 12;
  34.                 j++;
  35.         }
  36. }
复制代码

上面是放大显示的函数原型,下面是调用代码
  1. display.ssd1306_str_big(42, 1, "DEMO");
复制代码


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



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

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

 楼主| 发表于 2016-3-15 09:04:18 | 显示全部楼层
70多个人看~么一个发表点意见么?
回复 支持 反对

使用道具 举报

发表于 2016-3-15 09:56:35 来自手机 | 显示全部楼层
看过别外一个库,放大就是把一个点用四个点显示。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-15 10:09:39 | 显示全部楼层
老胖熊 发表于 2016-3-15 09:56
看过别外一个库,放大就是把一个点用四个点显示。

原理是这样的,就如我的代码一样,我知道大概每句怎么用。
可是,代码为什么要这么写?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-26 09:09 , Processed in 0.046480 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表