故事背景
有一次做項目用到了OLED顯示器,需要用它來顯示漢字,網上找了很多的資料,用OLED顯示英文或者數字比較方便,至於顯示漢字也不是很難,只是網上的資料都太零散,而且有的代碼運行不了,基於此寫下本文,便於初學或者第一次用OLED的朋友少走彎路。本文不講LCD的使用
預先準備
- 軟件
需要預先安裝兩個庫,即Adafruit_GFX.h和Adafruit_SSD1306.h,要控制OLED需要這兩個庫,如果顯示英文或者數字直接用函數可以調用,若用OLED顯示漢字並不是說不好顯示,而是直接編代碼比較麻煩,因爲(本文用到的)OLED是128*64的。若自己規劃漢字是比較麻煩的,所以我們推薦使用取模器,即PCtoLCD2002。至於Arduino的IDE相信大家都有,也相信大家熟練掌握了Arduino的基礎知識。下面的 網盤鏈接是上面的兩個庫和PCtoLCD2002。
鏈接:https://pan.baidu.com/s/1dhCfwkeFCrzhlmdCDi2vbw
提取碼:8d7q - 硬件
硬件自然需要一塊OLED板子,一小塊麪包板(可有可無),七根公-公杜邦線,(若沒有面包板需要七根公-母杜邦線),一塊Arduino(型號是UNO的)。
重點區
OK,說了那麼多廢話,安裝完上面的庫和軟件之後,我們就開始準備打印漢字吧!!
首先是取模軟件的使用,取模軟件打開是這樣的:
上面的是可以調節字體,字號,加粗等等,以及每一個字佔的點陣大小,默認是16*16的。
操作也是很簡單的:
在圖①位置處輸入漢字即可,將會在取模器上看見改字,在②處點擊生成字模,就會出現③處的矩陣,一般情況下,一個字用 一個數組表示,其次在④處有一個保存字模。 可以以txt的形式保存到本地。一般直接複製生成的漢字字模就好了。定義兩個數組分別保存“漢”和“字”,生成如下的數組,多餘的花括號自行去掉。如下:
static const unsigned char PROGMEM str1[] =
{0x00,0x00,0x27,0xF8,0x12,0x08,0x12,0x08,0x82,0x08,0x41,0x10,0x49,0x10,0x09,0x10,
0x10,0xA0,0x10,0xA0,0xE0,0x40,0x20,0x40,0x20,0xA0,0x21,0x10,0x22,0x08,0x0C,0x06};/*漢*/
static const unsigned char PROGMEM str2[] =
{0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,0x00,0x40,0x00,0x80,
0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00};/*"字",1*/
之後使用兩個函數調用就好了,如下:
//我測試的時候,有這麼幾個是可以顯示的,至於漢字顯示多的話就將字體設小。
//21 10
//37 10
//53 10
//69 10
//85 10
//101 10
//60 30
//76 30
//92 30
display.drawBitmap(5, 10, str1, 16, 16,1);
//5 10是x y的座標,str1是第一個漢字的點列矩陣,16*16是矩陣大小,1是模式。
display.drawBitmap(21, 10, str2, 16, 16,1);
display.display();
完整的代碼在文章末尾。
以上是代碼的核心區 。
其次是硬件的連接,原理圖如下:
該圖的OLED爲4管腳,本文用的是7管腳的,一般是6管腳和7管腳,6管腳默認CS接低電平,該圖用Fritzing繪製,沒有找到7管腳的OLED,大致原理看實物圖。
實物圖如下:
因此對應的管腳口代碼是:
#define OLED_RES 12
#define OLED_SDA 13
#define OLED_SCK 9
#define OLED_DC 10
#define OLED_CS 8
最後完整代碼:
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RES 12
#define OLED_SDA 13
#define OLED_SCK 9
#define OLED_DC 10
#define OLED_CS 8
Adafruit_SSD1306 display(OLED_SDA, OLED_SCK, OLED_DC, OLED_RES, OLED_CS);//定義一個display函數 類似於實例對象
//取16X16漢字字模 逐行式 順向高位在前
static const unsigned char PROGMEM str1[] =
{0x00,0x00,0x27,0xF8,0x12,0x08,0x12,0x08,0x82,0x08,0x41,0x10,0x49,0x10,0x09,0x10,
0x10,0xA0,0x10,0xA0,0xE0,0x40,0x20,0x40,0x20,0xA0,0x21,0x10,0x22,0x08,0x0C,0x06};/*漢*/
static const unsigned char PROGMEM str2[] =
{0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,0x00,0x40,0x00,0x80,
0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00};/*"字",1*/
void setup() {
Serial.begin(9600);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);//開始啓動的語句
display.setTextColor(WHITE);//開像素點發光
display.clearDisplay();//清屏
display.drawBitmap(5, 10, str1, 16, 16,1);
display.drawBitmap(21, 10, str2, 16, 16,1);
display.display();
}
void loop()
{
}
最後的顯示實物圖如下:
到此就該說再見了,內容也就這麼多,有問題歡迎評論,本文僅供學習,只是提供一個思路 ,由於能力有限,文章難免有錯誤,歡迎在文章下面評論,一起討論,一起學習。