# OLED Display Fix for 128x32 Screens ## Problem Your OLED code was designed for larger displays (128x64) with 8 rows. Your 128x32 display only has **4 rows × 21 characters**, so the 3-row tall graphics take up most of the screen, leaving no room for useful information. ## Solution Overview 1. **Simplify graphics**: Use 1-row tall icons (single character height) instead of 3-row tall graphics 2. **Optimize layout**: Better use of the 4 available rows 3. **Update font file**: Replace oversized graphics with compact, readable icons ## New Layout for 128x32 (4 rows) ``` Row 1: [Logo] LAYER NAME Row 2: [Icon] W-C-S (modifiers) Row 3: WPM:045 Row 4: CAPS SCRL ``` ## Files Modified ### 1. OLED Code (keymap.c) Replace your current OLED functions with the compact version in: - `oled_redesign_128x32.c` (reference implementation) Key changes: - **Logo**: 2 characters instead of 15 (3×5 grid) - **Layer indicators**: 2 characters instead of 15 (3×5 grid) - **Modifiers**: 4 single characters (W-A-C-S) instead of multi-char graphics - **Text-based layer names**: More readable than icons - **Efficient spacing**: Uses all 4 rows effectively ### 2. Font File (glcdfont.c) Update these character positions with simple icons: ```c // 0x80-0x81: Logo (2 chars) 0x3E, 0x41, 0x55, 0x55, 0x41, 0x3E, // 0x80: Keyboard icon 0x3E, 0x41, 0x55, 0x55, 0x41, 0x3E, // 0x81: Keyboard icon // 0x92-0x93: Default layer (2 chars) 0x08, 0x1C, 0x3E, 0x7F, 0x2A, 0x2A, // 0x92: Home icon 0x10, 0x38, 0x7C, 0xFE, 0x54, 0x54, // 0x93: Home icon // 0x94-0x95: Symbol layer (2 chars) 0x24, 0x7F, 0x24, 0x7F, 0x24, 0x00, // 0x94: # symbol 0x24, 0x2A, 0x7F, 0x2A, 0x12, 0x00, // 0x95: $ symbol // 0x96-0x97: Navigation layer (2 chars) 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x08, // 0x96: Up arrow 0x08, 0x08, 0x08, 0x2A, 0x1C, 0x08, // 0x97: Down arrow // 0x98-0x9B: Modifier keys (1 char each) 0x66, 0x66, 0x00, 0x7E, 0x66, 0x66, // 0x98: GUI/Windows 0x7E, 0x09, 0x09, 0x09, 0x7E, 0x00, // 0x99: ALT 0x3E, 0x41, 0x41, 0x41, 0x22, 0x00, // 0x9A: CTRL 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x08, // 0x9B: SHIFT (arrow) ``` ## Implementation Steps ### Step 1: Update keymap.c OLED functions Copy the redesigned functions from `oled_redesign_128x32.c` to your `keymap.c`, replacing these functions: - `render_logo()` → `render_logo_compact()` - `render_logo2()` → (merged into main function) - `render_layer_state()` → `render_layer_name()` + `render_layer_icon()` - `render_mod_status_gui_alt()` → `render_modifiers_compact()` - `render_mod_status_ctrl_shift()` → (merged into modifiers_compact) - `render_status_main()` → `render_status_compact()` - `render_status_secondary()` → (use same compact function) - `oled_task_user()` → Updated version ### Step 2: Update glcdfont.c 1. Find line ~136 where character 0x80 starts 2. Replace the hex values for characters 0x80, 0x81, 0x92-0x9B 3. Keep all other characters (0x00-0x7F for ASCII text) ### Step 3: Compile and Test ```bash cd qmk_userspace bash build_all.sh ``` ### Step 4: Flash to Keyboard Flash the `.uf2` files to both halves of your split keyboard. ## Customization ### Design Your Own Icons 1. Visit: https://helixfonteditor.netlify.com/ 2. Each character is **6 pixels wide × 8 pixels tall** 3. Export as hex array (6 bytes per character) 4. Copy hex values to glcdfont.c ### Character Format Each character = 6 bytes (one per column): ``` Byte format (binary): 0bDCBA9876 where 0 = top pixel, 7 = bottom pixel Example (arrow up): ▄ ▄▄▄ ▄ █ ▄ ▄ ▄ ▄ █ ███ █ █ █ █ █ █ = [0x08, 0x1C, 0x2A, 0x08, 0x08, 0x08] ``` ### Alternative: Use Text Instead of Icons If you prefer text-only (no custom graphics): ```c // In render_modifiers_compact(): if(modifiers & MOD_MASK_GUI) oled_write_P(PSTR("W"), false); if(modifiers & MOD_MASK_ALT) oled_write_P(PSTR("A"), false); if(modifiers & MOD_MASK_CTRL) oled_write_P(PSTR("C"), false); if(modifiers & MOD_MASK_SHIFT) oled_write_P(PSTR("S"), false); ``` ## Benefits of This Design ✅ **Readable**: Text layer names are clearer than multi-row icons ✅ **Efficient**: Uses all 4 rows with no wasted space ✅ **Informative**: Shows layer, modifiers, WPM, and caps/scroll lock ✅ **Compact**: Small icons fit in single row (1 char tall) ✅ **Consistent**: Same layout on both keyboard halves ✅ **Maintainable**: Simpler code, easier to modify ## Tools Provided 1. **oled_font_helper.py**: Visualize current font graphics 2. **generate_simple_icons.py**: Generate simple icon hex values 3. **oled_redesign_128x32.c**: Complete redesigned OLED code ## Next Steps Would you like me to: 1. Apply these changes directly to your keymap.c and glcdfont.c? 2. Create a different layout design? 3. Design custom icons for specific purposes? 4. Keep some of your original graphics but optimize them? Let me know how you'd like to proceed!