本文将介绍如何使用U8g2显示BMP图像。
1. 准备工作
- 目标图片文件
- 取模工具
- ESP8266-12F开发板
- ST7567驱动128X64屏幕
- 面包板
- 杜邦线若干
2. 制作过程
- 用杜邦线将ESP8266开发板、屏幕、面包板连接在一起,做好准备工作
示例中的屏幕和ESP8266引脚的连接关系图
屏幕引脚 | ESP8266引脚 | 备注 |
---|---|---|
CS | D8 | 片选引脚 |
RES | D4 | 复位引脚 |
RS | D6 | SPI数据控制引脚 |
SCL | D5 | SPI时钟引脚 |
SI | D7 | SPI数据信息引脚 |
VDD | 3.3V | 接开发板3.3V电源 |
VSS | GND | 接开发板GND |
BLA | 3.3V | 屏幕背光电源 |
BLK | GND | 屏幕背光接地 |
IC_SCL | ||
IC_CS | ||
IC_SO | ||
IC_SI |
因为这个屏幕带有背光电源,因此需要将背光电源也同时接电。如果只给背光电源接电而屏幕电源不接,那么屏幕显示过程中会不稳定。有关于此屏幕的介绍请看另一篇文章:Arduino驱动LED128X64 - U8g2 自定义中文字库,在这篇文章中,会同时介绍如何自定义中文字库。
2. 准备一张BMP图片
例如我们使用这张图片作为示例
- 使用取模工具对图片进行取模操作
打开取模工具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
- 编写代码
#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());
}
- 执行效果