- Added OLED functionality in keymap.c with custom rendering for layers and modifiers. - Created a Python script to generate simple icons for OLED displays. - Introduced a new rules.mk file to enable OLED features for the keymap. - Developed an OLED font helper script for visualizing and designing custom graphics. - Redesigned OLED layout to fit 128x32 displays, optimizing space for logos and layer indicators. - Implemented flow tap functionality in flow_tap.c for enhanced key responsiveness.
		
			
				
	
	
	
	
		
			4.8 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	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
- Simplify graphics: Use 1-row tall icons (single character height) instead of 3-row tall graphics
 - Optimize layout: Better use of the 4 available rows
 - 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:
// 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
- Find line ~136 where character 0x80 starts
 - Replace the hex values for characters 0x80, 0x81, 0x92-0x9B
 - Keep all other characters (0x00-0x7F for ASCII text)
 
Step 3: Compile and Test
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
- Visit: https://helixfonteditor.netlify.com/
 - Each character is 6 pixels wide × 8 pixels tall
 - Export as hex array (6 bytes per character)
 - 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):
// 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
- oled_font_helper.py: Visualize current font graphics
 - generate_simple_icons.py: Generate simple icon hex values
 - oled_redesign_128x32.c: Complete redesigned OLED code
 
Next Steps
Would you like me to:
- Apply these changes directly to your keymap.c and glcdfont.c?
 - Create a different layout design?
 - Design custom icons for specific purposes?
 - Keep some of your original graphics but optimize them?
 
Let me know how you'd like to proceed!