U8g2显示BMP图片 PCtoLCD2002取模

本文将介绍如何使用U8g2显示BMP图像。

1. 准备工作

  1. 目标图片文件
  2. 取模工具
  3. ESP8266-12F开发板
  4. ST7567驱动128X64屏幕
  5. 面包板
  6. 杜邦线若干

PCtoLCD2002取模工具及示例代码下载地址

2. 制作过程

  1. 用杜邦线将ESP8266开发板、屏幕、面包板连接在一起,做好准备工作
    示例中的屏幕和ESP8266引脚的连接关系图
屏幕引脚ESP8266引脚备注
CSD8片选引脚
RESD4复位引脚
RSD6SPI数据控制引脚
SCLD5SPI时钟引脚
SID7SPI数据信息引脚
VDD3.3V接开发板3.3V电源
VSSGND接开发板GND
BLA3.3V屏幕背光电源
BLKGND屏幕背光接地
IC_SCL
IC_CS
IC_SO
IC_SI

因为这个屏幕带有背光电源,因此需要将背光电源也同时接电。如果只给背光电源接电而屏幕电源不接,那么屏幕显示过程中会不稳定。有关于此屏幕的介绍请看另一篇文章:Arduino驱动LED128X64 - U8g2 自定义中文字库,在这篇文章中,会同时介绍如何自定义中文字库。
2. 准备一张BMP图片
例如我们使用这张图片作为示例
示例图片,格式bmp

  1. 使用取模工具对图片进行取模操作
    打开取模工具PCToLCD2002完美版
    点击选择图片
    点击选择图片
    点击设置进行参数设置
    点击设置进行参数设置
    确认参数一致
    确认参数一致
    点击“生成字模”按钮,将会看到取模后的信息,如下:

0x80,0x01,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0xF0,0xE0,0xFF,0x00,0x00,0x3F,
0xF8,0xFF,0x07,0x00,0x7F,0xFE,0xFF,0x0F,0x00,0xE3,0xFF,0xFF,0x3F,0x00,0x80,0xFF,
0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x7F,0x00,0xE0,0xFF,0xFF,0xFF,0x00,0xF0,0xFF,0xFF,
0xFF,0x01,0xF0,0xFF,0xFF,0xFF,0x03,0xF8,0xFF,0xFF,0xFF,0x03,0xF8,0xFF,0xFF,0xFF,
0x03,0xFC,0xFF,0xFF,0xFF,0x07,0xFC,0x7F,0x40,0xFF,0x07,0xFE,0x01,0x00,0xF8,0x07,
0x1E,0x00,0x00,0x00,0x07,0x00,0x1C,0x00,0x03,0x00,0x00,0x3C,0x80,0x07,0x00,0x00,
0x76,0xC0,0x1D,0x00,0x00,0x76,0xC0,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,
0x00,0x00,0x07,0xFC,0x01,0x00,0xF0,0x07,0xFC,0x1F,0x00,0xFF,0x07,0xFC,0x1F,0x00,
0xFF,0x07,0xF8,0x7F,0x80,0xFF,0x07,0xF8,0xFF,0xE0,0xFF,0x03,0xF0,0xFF,0xFF,0xFF,
0x03,0xF0,0xFF,0xFF,0xFF,0x01,0xE0,0xFF,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0xFF,0x00,
0x80,0xFF,0xFF,0x7F,0x00,0x00,0xFF,0xFF,0x3F,0x00,0x00,0xFE,0xFF,0x0F,0x00,0x00,
0xF8,0xFF,0x07,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00

  1. 编写代码
#include <Arduino.h>
#include <ArduinoJson.h>
#include <ESP8266WiFi.h>
#include <U8g2lib.h>
#include <Ticker.h>


#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#define CS    D8
#define RES   D4
#define DC    D6
#define SCK   D5
#define DATA  D7
//这里务必根据您的屏幕驱动,选择正确的构造函数
//如何选择,请参照https://github.com/olikraus/u8g2/wiki/u8g2setupcpp
U8G2_ST7567_ENH_DG128064I_1_4W_SW_SPI u8g2(U8G2_MIRROR, 
  /* clock=*/ SCK, /* data=*/ DATA, /* cs=*/ CS, /* dc=*/ DC, /* reset=*/ RES);

u8g2_uint_t U8X8_PROGMEM screenWidth;
u8g2_uint_t U8X8_PROGMEM screenHeight;
bool U8X8_PROGMEM isLoading = false;
//哈皮玩Logo
// width: 35, height: 38
const unsigned char logo[] U8X8_PROGMEM = { 
  0x80,0x01,0x00,0x00,0x00,0xC0,0x01,0x00,0x00,0x00,0xF0,0xE0,0xFF,0x00,0x00,0x3F,
  0xF8,0xFF,0x07,0x00,0x7F,0xFE,0xFF,0x0F,0x00,0xE3,0xFF,0xFF,0x3F,0x00,0x80,0xFF,
  0xFF,0x7F,0x00,0xC0,0xFF,0xFF,0x7F,0x00,0xE0,0xFF,0xFF,0xFF,0x00,0xF0,0xFF,0xFF,
  0xFF,0x01,0xF0,0xFF,0xFF,0xFF,0x03,0xF8,0xFF,0xFF,0xFF,0x03,0xF8,0xFF,0xFF,0xFF,
  0x03,0xFC,0xFF,0xFF,0xFF,0x07,0xFC,0x7F,0x40,0xFF,0x07,0xFE,0x01,0x00,0xF8,0x07,
  0x1E,0x00,0x00,0x00,0x07,0x00,0x1C,0x00,0x03,0x00,0x00,0x3C,0x80,0x07,0x00,0x00,
  0x76,0xC0,0x1D,0x00,0x00,0x76,0xC0,0x1D,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,
  0x00,0x00,0x07,0xFC,0x01,0x00,0xF0,0x07,0xFC,0x1F,0x00,0xFF,0x07,0xFC,0x1F,0x00,
  0xFF,0x07,0xF8,0x7F,0x80,0xFF,0x07,0xF8,0xFF,0xE0,0xFF,0x03,0xF0,0xFF,0xFF,0xFF,
  0x03,0xF0,0xFF,0xFF,0xFF,0x01,0xE0,0xFF,0xFF,0xFF,0x00,0xC0,0xFF,0xFF,0xFF,0x00,
  0x80,0xFF,0xFF,0x7F,0x00,0x00,0xFF,0xFF,0x3F,0x00,0x00,0xFE,0xFF,0x0F,0x00,0x00,
  0xF8,0xFF,0x07,0x00,0x00,0xE0,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};

void setup(){
    Serial.begin(9600);
    u8g2.begin();
    u8g2.enableUTF8Print();
    screenWidth = u8g2.getDisplayWidth();
    screenHeight = u8g2.getDisplayHeight();


    showLoading();
    WiFi.begin("WIFI名称", "WIFI密码");//请替换成您环境中的真实信息
    while(WiFi.status() != WL_CONNECTED){
        delay(500);
    }

    isLoading = true;
}

void loop(){
  if (isLoading){
    showStrCenter("Loading Complete.");
    delay(1000);
    showWiFi();
    isLoading = false;
  }
  delay(200);
}

void showLoading(){
  u8g2.firstPage();
  do{
    u8g2.drawXBM(10, 13, 35, 38, logo);
    u8g2.setFont(u8g2_font_helvR08_tr);
    char* str = "Loading...";
    u8g2_uint_t width = u8g2.getStrWidth(str);
    u8g2.drawStr(50, 40, str);
  }while(u8g2.nextPage());
}

//正在加载
void showStrCenter(char* str){
    u8g2.firstPage();
    do{
      u8g2.setFont(u8g2_font_helvR08_tr);
      u8g2_uint_t width = u8g2.getStrWidth(str);
      u8g2_uint_t x = (screenWidth - width) / 2;
      u8g2_uint_t y = screenHeight / 2; 
      u8g2.drawStr(x, y, str);
    }while(u8g2.nextPage());
}

void showWiFi(){
  u8g2.firstPage();
  do{
    u8g2.setFont(u8g2_font_helvR08_tr);
    u8g2.drawStr(0, 12, ("Connected to: " + WiFi.SSID()).c_str());
    u8g2.drawStr(0, 24, ("IP Address:" + WiFi.localIP().toString()).c_str());
  }while(u8g2.nextPage());
}

  1. 执行效果
    在这里插入图片描述
  • 7
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
5月1日凌晨发布第一测试版 功能介绍: 1.生成中英文数字混合的字符串的字模数据. 2.可选择字体,大小,并且可独立调整文字的长和宽,生成任意形状的字符。 3.各种旋转,翻转文字功能 4.任意调整输出点阵大小,并任意调整字符在点阵中的位置。 5.字模数据输出可自定义各种格式,系统预设了C语言和汇编语言两种格式,并且可自己 定义出新的数据输出格式;每行输出数据个数可调。 6.支持四种取模方式:逐行(就是横向逐行取点),逐列(纵向逐列取点),行列(先 横向取第一行的8个点作为第一个字节,然后纵向取第二行的8个点作为第二个字节……), 列行(先纵向取第一列的前8个点作为第一个字节,然后横向取第二列的前8个点作为第二个 字节……) 7.支持阴码(亮点为1),阳码(亮点为0)取模 8.支持纵向(第一位为低位)(,倒向第一位为高位)取模 9.输出数制可选16进制或10进制 10.可生成索引文件,用于在生成的大量字库中可快速检索到需要的汉字 11.动态液晶面板彷真,可调节彷真面板象素点大小和颜色 12.图形模式下可任意用鼠标作画,左键画图,右键擦图。 12.旋转,翻转,平移等字符模式下的功能也可用与对BMP图象的处理 版本为pctolcd1.94 5月1日晚上发布第二测试版 更新如下: 1.增加锁定点阵大小功能,例如可锁定24X24点阵大小,然后调节独立调节字点阵的大小 2.增加热键功能,可用光标配合Ctrl,Shift对文字大小和位置修改 3.增加精简输出格式选项 4.把文字输入框换成了文字输入组合框,这样就可以保存历史纪录。 5.输出数据会自动清除以前的数据 6.可隐藏自定义格式,简化操作 7.一些小的BUG修正。 版本为pctolcd2.03 5月3日凌晨发布第三测试版 更新如下: 1.增加了一些小东西,例如演示动画一类的,我懒的一一写了 2.改掉一些可恶的小BUG,例如点阵输入框的自动完成。 3.增加大量文字处理和导入TXT文本文件功能,并且可以去除文本中的空白和重复字符, 可以对文本进行排序,适合于生成小字库。我这里测试是3万多字的TXT文件在2分钟内转成16X16点阵的字库文件。 版本号为pctolcd2.53 由于本软件侧重于对字符的处理,所以在图象方面功能较弱,请见晾。 5月8日发布正式版 正式版已经开始朝着液晶字库生成软件的方向进化了,我在后来的更新中把主要精力也放 在这部分,由于我目前还没有发现有同类的软件具备这个功能,也无法得到任何的参考,只能 自己摸索前进,所以如果还有不方便的地方请大家多提意见. 具体更新如下: 1.重写大部分的内核代码以配合汉字库生成的功能,目前这个内核已经进行了反复的测试, 相信稳定性和速度较前一版本有了巨大的提高. 2.去掉那个比较愚蠢的热键区了,因为用处不大 3.增加汉字库生成功能,这是最重要的改进之处,下文将详细介绍. 4.修正许多小BUG,使软件更加成熟些. 5月12日发布完美版 这次发布的PCtoLCD2002完美版与前一版本相比没有增加太多的功能,因为我觉得现有的这些功能已经足够用于生成各种字模的需要了,所以完美版的主要工作是反复测试,精心去除各种BUG,以及调节一些细微之处,目的当然就是追求完美!不过世上不会有真正完美的东西,这个软件也不例外,而且这个软件从头至尾全部是我一个人编写完成,精力有限,难免会顾此失彼,如果大家发现了这个版本中存在的BUG,请及时告诉我。 更新说明: 1。界面采用新的字体,不会再有那种难看的黑色粗体字,比以前的要漂亮多了。 2。加入全面的提示帮助,尽量减少普通用户的各种疑惑。 3。修正生成文件的扩展名的一些BUG,不会总是加上FON的扩展名了。 4。修正生成字模数据的一些格式BUG,现在生成的C51格式字模数据基本上可以直接粘贴到源程序中使用而不需要修改了 5。加入新的字模数据格式调整项,允许用户更自由的定制自己需要的数据格式 6。最重要的更新:全面支持保存当前设置功能,用户设置的字模格式,主窗口状态和字库生成窗口选项信息均可保存,下一次打开窗口时不用重新设置。 7。修正了新建图象时会自动跳到图形模式的BUG 8。增加输出紧凑格式数据选项,可以生成不包含空白行的字模数据。 9。完善了每行数据显示个数的功能,可以任意设置每行显示的数据个数,并同时可以设置每行索引数据显示个数。 10。修正了取模说明的一些错误,并改动了格式。 11。现在当用户选择10进制输出时,会自动去掉生成字模数据前的“0x",或后面的“H”,选择16进制时则会自动加上。 12。对各个窗体重新设计以全面适应最大化的需要,如果您觉得当前窗口不够大,可以最大化使用。 13。增加生成英文点阵字库功能,可自动生成ASCII码从0-127的任意点阵字库,使用方法同生成国标点阵字库功能。 14。再次优化代码,去掉各种调试信息,使程序速度再快一些。 15。还有许多细微的调整我记不清了…… 需要注意的地方: 在测试的过程中我发现了一个问题:在WIN98或WINME下当用户直接生成特大点阵的字模时(例如320*320,1024*768的汉字字模),此时由于数据量非常庞大,而WIN98/WINME会有64K的数据容量限制,所以在主窗口中是无法得到全部的字模数据的,这时您需要使用字库生成功能,通过形成一个数据文件才能得到完整的字模数据。 我认为到现在这个软件功能已经很完善了,但可能使用上有点不方便,如果你有什么不明白 的地方,可以发帖子或发MAIL询问
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值