SSD1306 OLED에는 어떤 설정이 필요한가요?
페이지별 열 단위 · LSB 우선 바이트를 디스플레이 메모리에 직접 쓴다면 페이지별 열 단위, LSB 우선, 켜진 픽셀 = 1입니다.
텍스트·이미지를 SSD1306·SH1106·ST7920·Adafruit GFX용 C 배열로 변환하는 온라인 도구. 12×12/16×16 도트 폰트, PCtoLCD2002 4가지 스캔 방식, 기존 배열 해석 지원.
시스템 폰트는 안티에일리어싱된 윤곽선이라 약 20 px 미만에서는 획이 끊기거나 뭉칩니다. 12 px와 16 px에는 위의 도트 폰트를 사용하세요.
여기에 이미지를 끌어다 놓거나 클릭해 선택
PNG, JPG, GIF, BMP, WebP, SVG — 로고, 아이콘, 스크린숏
이미지의 어두운 픽셀이 디스플레이에서 켜진 픽셀이 됩니다. 투명한 부분은 배경으로 처리합니다.
오래된 프로젝트나 튜토리얼에서 가져온 폰트 배열이 어떻게 생성되었는지 모르시나요? 여기에 붙여넣으면 모든 스캔 방향과 비트 순서가 나란히 그려지고, 제대로 읽히는 것이 곧 설정입니다.
SSD1306 / SSD1309 / SH1106 / ST7565 페이지 메모리 및 MicroPython framebuf.MONO_VLSB와 같은 배치입니다. 바이트를 디스플레이에 그대로 쓰면 됩니다.
켜진 픽셀 = 1, GNU Unifont 글리프입니다. 가지고 있는 배열과 이 바이트를 비교하면 어떤 설정으로 생성했는지 알 수 있습니다.
| 스캔 방향 | 비트 순서 | 바이트 (16진수) |
|---|---|---|
| 행 단위 (가로 바이트) | MSB 우선 — 첫 픽셀을 bit 7에 | 01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00 |
| 행 단위 (가로 바이트) | LSB 우선 — 첫 픽셀을 bit 0에 | 80 00 80 00 80 00 80 00 FC 1F 84 10 84 10 84 10 84 10 84 10 FC 1F 84 10 80 00 80 00 80 00 80 00 |
| 열 단위 (세로 바이트) | MSB 우선 — 첫 픽셀을 bit 7에 | 00 00 00 00 0F F0 08 20 08 20 08 20 08 20 FF FF 08 20 08 20 08 20 08 20 0F F0 00 00 00 00 00 00 |
| 열 단위 (세로 바이트) | LSB 우선 — 첫 픽셀을 bit 0에 | 00 00 00 00 F0 0F 10 04 10 04 10 04 10 04 FF FF 10 04 10 04 10 04 10 04 F0 0F 00 00 00 00 00 00 |
| 페이지별 열 단위 (세로 바이트, SSD1306 페이지 순서) | MSB 우선 — 첫 픽셀을 bit 7에 | 00 00 0F 08 08 08 08 FF 08 08 08 08 0F 00 00 00 00 00 F0 20 20 20 20 FF 20 20 20 20 F0 00 00 00 |
| 페이지별 열 단위 (세로 바이트, SSD1306 페이지 순서) | LSB 우선 — 첫 픽셀을 bit 0에 | 00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00 |
| 띠별 행 단위 (가로 바이트, 폭 8픽셀 띠) | MSB 우선 — 첫 픽셀을 bit 7에 | 01 01 01 01 3F 21 21 21 21 21 3F 21 01 01 01 01 00 00 00 00 F8 08 08 08 08 08 F8 08 00 00 00 00 |
| 띠별 행 단위 (가로 바이트, 폭 8픽셀 띠) | LSB 우선 — 첫 픽셀을 bit 0에 | 80 80 80 80 FC 84 84 84 84 84 FC 84 80 80 80 80 00 00 00 00 1F 10 10 10 10 10 1F 10 00 00 00 00 |
도트 폰트: GNU Unifont(16 px)와 Fusion Pixel Font(12 px), 둘 다 SIL Open Font License 1.1을 따릅니다. 라이선스 전문
Go Tools 엔지니어링 팀이 제작하고 검증했습니다.
페이지별 열 단위 · LSB 우선 바이트를 디스플레이 메모리에 직접 쓴다면 페이지별 열 단위, LSB 우선, 켜진 픽셀 = 1입니다.
행 단위 · MSB 우선 행 단위, MSB 우선, 켜진 픽셀 = 1이며, 각 행은 바이트 경계까지 채웁니다.
32바이트 어떤 스캔 방향이든 32바이트입니다. 12 × 12는 24바이트, 8 × 16 ASCII 문자는 16바이트입니다.
逆向 = LSB 우선 顺向 = MSB 우선(첫 픽셀이 bit 7), 逆向 = LSB 우선(첫 픽셀이 bit 0)입니다.
SSD1306, SH1106, ST7565 같은 그래픽 OLED·LCD 컨트롤러는 대부분 폰트를 내장하고 있지 않습니다. 글자를 표시하려면 펌웨어가 켜짐/꺼짐 픽셀로 이루어진 작은 격자를 디스플레이 메모리에 복사합니다. 픽셀 하나가 1비트, 8픽셀이 1바이트입니다. 글리프를 이런 바이트로 변환하는 작업을 중국어 임베디드 튜토리얼에서는 '取模'라고 부르며, Windows 프로그램 PCtoLCD2002가 오랫동안 이 일을 맡아 왔습니다.
하지만 바이트만으로는 부족합니다. 같은 16 × 16 글자도 담는 방식이 네 가지(행 단위, 열 단위, 페이지별 열 단위, 띠별 행 단위)이고, 각 방식마다 첫 픽셀을 bit 7에 둘지 bit 0에 둘지 정할 수 있습니다. 같은 글리프를 나타내는 바이트열이 8가지가 되고, 디스플레이가 제대로 그리는 것은 그중 하나뿐입니다. 튜토리얼에서 복사한 폰트가 좌우 반전되거나 반으로 갈라지거나 회전되어 보이는 일이 잦은 이유가 여기에 있습니다.
// 中 (16x16), pages of columns, LSB first, lit = 1 — SSD1306 page order
const unsigned char zhong[32] = {
0x00,0x00,0xF0,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,
0x00,0x00,0x0F,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x0F,0x00,0x00,0x00
};
// First 16 bytes = page 0 (rows 0-7), one byte per column, bit 0 = top row 브라우저 폰트는 안티에일리어싱이 적용된 윤곽선 폰트입니다. 송체(명조 계열)를 12 px에서 이진화하면 中의 가로획이 아예 사라집니다. 그래서 이 도구는 실제 비트맵 폰트를 내장했습니다. 16 × 16 폰트는 GB2312의 6,763자를 모두 담고 있고, 12 × 12 폰트에는 희귀 한자 143자가 빠져 있어 이 글자들은 시스템 폰트로 대신 그리고 따로 표시합니다.
행 단위, 열 단위, 페이지별 열 단위, 띠별 행 단위를 각각 MSB 우선 또는 LSB 우선, 켜진 픽셀 = 1 또는 0과 조합할 수 있습니다. 이름은 PCtoLCD2002를 따르고, 그 의미는 SSD1306 데이터시트와 흔히 쓰는 OLED 예제 프로젝트에 맞춰 확인했으므로 기존 프로젝트에서 쓰던 설정을 그대로 고르면 됩니다.
SSD1306, Adafruit GFX, XBM 중 하나를 고르면 옵션이 자동으로 설정됩니다. 옵션을 직접 바꾸면 그 바이트 순서를 읽는 디스플레이와 라이브러리를 알려 주고, 해당하는 것이 없으면 없다고 표시합니다.
출처를 모르는 폰트 배열을 붙여넣으면 스캔 방향과 비트 순서의 8가지 해석을 모두 나란히 그립니다. 제대로 읽히는 것이 곧 설정이며, 클릭 한 번으로 적용됩니다.
로고, 아이콘, 사진을 디스플레이 크기에 맞춰 축소한 뒤 임계값, Floyd–Steinberg, Atkinson 디더링 중 하나로 변환합니다. 투명한 부분은 배경으로 처리하며 임계값은 모든 모드에서 적용됩니다.
/*"中",0*/ 주석이 붙은 C51 스타일 2차원 배열, 오프셋이 포함된 Arduino PROGMEM, MicroPython bytearray 딕셔너리, A51 DB 줄, 일반 16진수를 지원합니다. 생성된 C 코드는 -Wall -Wextra -pedantic 옵션으로도 경고 없이 컴파일됩니다.
中
00 00 F0 10 10 10 10 FF 10 10 10 10 F0 00 00 00 00 00 0F 04 04 04 04 FF 04 04 04 04 0F 00 00 00
32바이트입니다. 페이지 0(0~7행)의 16개 열 다음에 페이지 1(8~15행)의 16개 열이 이어집니다. 7번 열의 0xFF는 모든 비트가 1로, 세로획이 두 페이지의 8개 행을 모두 관통한다는 뜻입니다.
中
01 00 01 00 01 00 01 00 3F F8 21 08 21 08 21 08 21 08 21 08 3F F8 21 08 01 00 01 00 01 00 01 00
행마다 2바이트씩 16행입니다. 0x01 0x00은 가운데 세로획만 있는 행입니다. 가장 왼쪽 픽셀이 첫 바이트의 bit 7이므로 7번 열의 픽셀은 bit 0에 들어갑니다. 이 바이트를 SSD1306 페이지 쓰기에 넘기면 화면이 엉망이 됩니다. 글리프는 같아도 담는 방식이 다르기 때문입니다.
A
00 00 00 00 18 24 24 42 42 7E 42 42 42 42 00 00
ASCII 문자는 반각 폭입니다. 8 × 16은 16바이트이며 행 단위로 스캔하면 한 행에 1바이트입니다. 드라이버가 모든 글리프를 16 × 16으로 가정한다면 '반각 문자(A–Z, 0–9)도 전체 셀 폭 사용'에 체크하세요.
中 (12 × 12, 행 단위, MSB 우선)
00 00 04 00 04 00 FF E0 84 20 84 20 84 20 FF E0 04 00 04 00 04 00 04 00
12픽셀짜리 행마다 2바이트가 필요하고, 둘째 바이트의 마지막 4비트는 패딩입니다. 12행 × 2바이트 = 24. 모든 디스플레이 라이브러리가 한 행을 (width + 7) / 8바이트로 다루므로, 비트를 더 촘촘히 담으면 모든 라이브러리에서 깨집니다.
텍스트는 실제 도트 폰트로 그립니다. 12 × 12(Fusion Pixel) 또는 16 × 16(GNU Unifont)이며 ASCII는 반각 폭입니다. 로고나 아이콘은 이미지 탭으로 전환해 128 × 64 같은 출력 크기를 지정합니다.
SSD1306 / SH1106 / ST7565 계열은 페이지 순서의 세로 바이트에 맨 위 픽셀이 bit 0입니다. Adafruit GFX, TFT_eSPI, U8g2 drawBitmap, LVGL 계열은 가로 바이트에 왼쪽 픽셀이 bit 7입니다. XBM / U8g2 drawXBM 계열은 같은 가로 바이트지만 왼쪽 픽셀이 bit 0입니다.
미리보기에는 실제로 인코딩되는 비트맵이 그대로 표시됩니다. 픽셀을 클릭하면 켜짐/꺼짐이 전환되고, 이동 입력란으로 글리프 위치를 조금씩 옮길 수 있습니다.
C(PCtoLCD2002 C51 스타일), Arduino PROGMEM, MicroPython bytearray, A51 어셈블리, 일반 16진수 중에서 고릅니다. 출력 첫 줄에 스캔 방향, 비트 순서, 글리프 크기가 기록되므로 배열 자체가 설명서 역할을 합니다.
가로 바이트의 비트 순서가 틀렸습니다. Adafruit GFX drawBitmap()은 MSB 우선, XBM과 U8g2 drawXBM()은 LSB 우선이 필요합니다.
U8g2 drawXBM()에 MSB 우선 바이트 전달
drawXBM() → XBM 프리셋 (행 단위, LSB 우선)
세로 바이트의 비트 순서가 틀렸습니다. SSD1306 계열 컨트롤러는 D0을 맨 위 행에 두므로 LSB 우선이 필요합니다.
페이지별 열 단위, MSB 우선 → SSD1306
페이지별 열 단위, LSB 우선 → SSD1306
열 단위와 페이지별 열 단위를 혼동했습니다. 두 방식은 높이 8픽셀 이하 글리프에서만 같은 바이트가 나오고, 16픽셀에서는 바이트 순서가 달라집니다.
열 단위 → SSD1306 페이지 쓰기
페이지별 열 단위 → SSD1306 페이지 쓰기
대각선으로 뒤집혔다면 가로 바이트를 세로 바이트로(또는 그 반대로) 읽은 것입니다. 켜진 배경에 어두운 글자가 보인다면 디스플레이는 켜진 픽셀 = 1을 기대하는데 켜진 픽셀 = 0을 고른 것입니다.
행 단위 바이트를 SSD1306 페이지로 전송
배열을 디코더 탭에 붙여넣고 제대로 읽히는 미리보기 선택
변환 도구
2진수, 16진수, 10진수, 8진수 및 임의 진법(2-36)을 즉시 변환합니다. 온라인에서 무료로 사용할 수 있으며 모든 처리는 브라우저에서 이루어집니다.
변환 도구
부호 있는 정수를 넣으면 부호-절대값, 1의 보수, 2의 보수, 오프셋 바이너리를 4~64비트로 한 번에 계산합니다. 비트열이나 16진수로 역방향 조회도 지원합니다.
변환 도구
리눅스 파일 권한을 8진수(755, 644)와 rwx 기호로 변환하는 온라인 chmod 계산기. 명령 생성과 777 위험 경고까지 브라우저에서 바로 처리합니다.
변환 도구
HEX, RGB, HSL, OKLCH, OKLAB, CMYK 등 9가지 색상 형식을 브라우저에서 즉시 변환합니다. 무료 온라인 도구, 가입 불필요.
변환 도구
온라인 위경도 좌표 변환: 십진수·도분초(DMS)를 UTM, 웹 메르카토르, GCJ-02(가오더)·BD-09(바이두)로. 위경도 순서 자동 판별, 역변환 오차 1 mm 미만, CSV 일괄 변환.
변환 도구
HEX 색상을 CMYK로 변환합니다. 인쇄 시안용 sRGB 기반 근사. 무료 온라인 도구, 색상은 페이지를 벗어나지 않습니다.