Arduino UNO u8glib显示中文-亲测可用

思路:

1、字体取模,后建立小型静态字库

2、u8glib函数画图显示汉字,print显示内容

说明:

取模软件及参数设置:

小四对应16*16字体

按图配参数

二、代码部分

字库定义:

#include <U8glib.h>

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);  // I2C / TWI

static const uint8_t PROGMEM wen[] = {
  /*--  文字:  温  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x00, 0x00, 0x23, 0xF8, 0x12, 0x08, 0x12, 0x08, 0x83, 0xF8, 0x42, 0x08, 0x42, 0x08, 0x13, 0xF8,
  0x10, 0x00, 0x27, 0xFC, 0xE4, 0xA4, 0x24, 0xA4, 0x24, 0xA4, 0x24, 0xA4, 0x2F, 0xFE, 0x00, 0x00,
};

static const uint8_t PROGMEM shi[] = {
  /*--  文字:  湿  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x00, 0x00, 0x27, 0xF8, 0x14, 0x08, 0x14, 0x08, 0x87, 0xF8, 0x44, 0x08, 0x44, 0x08, 0x17, 0xF8,
  0x11, 0x20, 0x21, 0x20, 0xE9, 0x24, 0x25, 0x28, 0x23, 0x30, 0x21, 0x20, 0x2F, 0xFE, 0x00, 0x00,
};

static const uint8_t PROGMEM du[] = {
  /*--  文字:  度  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x01, 0x00, 0x00, 0x80, 0x3F, 0xFE, 0x22, 0x20, 0x22, 0x20, 0x3F, 0xFC, 0x22, 0x20, 0x22, 0x20,
  0x23, 0xE0, 0x20, 0x00, 0x2F, 0xF0, 0x24, 0x10, 0x42, 0x20, 0x41, 0xC0, 0x86, 0x30, 0x38, 0x0E,
};

static const uint8_t PROGMEM ssd[] = {
  /*--  文字:  ℃  --*/
  /*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
  0x60, 0x00, 0x91, 0xF4, 0x96, 0x0C, 0x6C, 0x04, 0x08, 0x04, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00,
  0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x04, 0x06, 0x08, 0x01, 0xF0, 0x00, 0x00,
};

// ================初始化======================
void setup() {
  u8g.setFont(u8g_font_9x15);

}

// ================主函数======================
void loop() {
  delay(500);
   fn_displayOLED();

}


void fn_displayOLED(void) {
  u8g.firstPage();
  do {
    u8g.setColorIndex(1);
    u8g.setFont(u8g_font_unifont);
    u8g.setPrintPos(0, 5);
    u8g.drawBitmapP( 0, 20, 2, 16, wen);
    u8g.drawBitmapP( 16, 20, 2, 16, du);
    u8g.setPrintPos(32, 34);
    u8g.print(":" + String(16.5));
    u8g.drawBitmapP( 82, 20, 2, 16, ssd);

    u8g.drawBitmapP( 0, 40, 2, 16, shi);
    u8g.drawBitmapP( 16, 40, 2, 16, du);
    u8g.setPrintPos(32, 54);
    u8g.print(":" + String(32.5)+"%");
    

  } while (u8g.nextPage());
}

 参考文章:

U8glib学习使用(详细版)_Systemmax20的博客-优快云博客使用模块Arduino UNO0.96 OLED (SIP)此显示模块根据电阻链接的方式 来控制连接的模式(SPI IIC )端口占用情况SPI Com: SCK = 13, MOSI = 11, CS = 10, DC = 9, RST =RESET//调用u8glib库#include "U8glib.h"//创建一个对象U8GLIB_SSD1306_128X64 u8g(13, 11, 10, 9); // SW SPI Com: SCK = 13, MOSI = 11, CShttps://blog.youkuaiyun.com/Systemmax20/article/details/122251516用U8glib显示汉字,简单可行,各种液晶屏通用,有无字库皆...,-Arduino中文社区 - Powered by Discuz!开发项目需要用到显示汉字,用的是OLED128X64,先看了极客网的U8glib如何显示中文。先找Unicode码,然后生成字体文件,还要编译,太麻烦。还是祭出点阵大法,管你什么字体 ... icon-default.png?t=M0H8https://www.arduino.cn/thread-31016-1-1.htmlu8glib自学笔记2_胖哥的博客-优快云博客_u8glibu8glib自学笔记第2篇https://blog.youkuaiyun.com/seacowtech/article/details/53783666

<think>好的,用户想在Arduino中使用U8glib显示中文,我需要一步步解决这个问题。首先,我需要回忆U8glib库的基本用法,以及它是否直接支持中文显示。根据之前的引用,用户提到需要取模,这说明可能需要将中文字符转换为位图数据才能显示。 首先,确认U8glib库本身是否内置中文字符集。通常这类库可能主要支持ASCII字符,中文需要自己处理。用户提供的参考链接里提到了使用取模软件生成字模数据,所以步骤可能包括:安装库、接线、取模、编写代码显示。 接下来,接线部分。根据引用中的信息,OLED的SCL接A5,SDA接A4,VCC接3.3V或5V,GND接GND。需要确保用户正确连接硬件,否则无法显示。 然后是取模步骤。用户需要选择合适的取模软件,比如PCtoLCD2002,设置正确的参数,如字体大小、取模方式(阴码、逐列式、顺向),生成对应的十六进制数组。这部分需要详细说明参数设置,否则生成的代码可能无法正确显示。 代码部分,用户需要包含U8glib库,定义显示对象,例如使用I2C接口的SSD1306。然后在setup中初始化,在loop中调用绘制函数。在绘制函数里,使用drawXBMP方法显示位图。注意坐标和位图数据的正确引用,以及PROGMEM关键字的使用,以节省内存。 可能遇到的问题包括:取模参数错误导致显示乱码,内存不足,或者接线错误。需要提醒用户检查这些方面。此外,U8glib库的不同版本可能有差异,建议用户查阅具体文档。 最后,生成相关问题,考虑用户可能的后续问题,比如如何动态显示、优化内存、使用其他字体等,帮助用户进一步学习。</think>在Arduino中使用U8glib显示中文字符需要以下步骤: ### 一、硬件接线 OLED与Arduino Uno的连接方式为: - VCC → 3.3V/5V - GND → GND - SCL → A5 - SDA → A4 (适用于I2C接口的OLED显示屏)[^2] ### 二、取模步骤 1. 使用**PCtoLCD2002**取模软件 2. 设置参数: - 字体:宋体 - 字号:16×16像素 - 取模方式:阴码/逐列式/顺向 3. 生成十六进制数组代码(示例): ```cpp static unsigned char chinese_bits[] U8G_PROGMEM = { 0x00,0x40,0x44,0x44,0x7F,... // 具体数值根据字符生成 }; ``` ### 三、代码实现 ```cpp #include <U8glib.h> U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // 初始化OLED void draw(void) { u8g.drawXBMP(0, 16, 16, 16, chinese_bits); // 显示坐标(x,y)处的16x16中文字符 } void setup() { u8g.setFont(u8g_font_unifont); // 设置默认英文字体 } void loop() { u8g.firstPage(); do { draw(); } while(u8g.nextPage()); } ``` ### 四、注意事项 1. 使用`PROGMEM`关键字存储字模数据以节省内存[^1] 2. 每个汉字需要32字节存储空间(16×16像素) 3. 多汉字显示需按坐标分多次调用`drawXBMP` 4. 建议使用外部Flash存储大字符集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

新思维软件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值