I SHOULD have been tackling the steppers. Or the endstops. But what I didn't understand was why the FreeExpression project didn't use the LCD that comes with the hardware. A quick look at the FreeExpression code gave me the pinout for a modified (to use a different LCD) connector, and looking at the OLED code for the cake version, it used SPI in a very simple mode.
Now, a quick look at the cake, expression, CRV001 and expression v2 motherboard said these things were all closely related, and I made a bet that no matter what, they were probably STILL using SPI for the other LCDs.
If you already have a working layout for the motherboard, don't mess with it just to change LCDs. So I did the most boring thing possible.
I installed u8g's library in Arduino, opened the hello world example, and looked at the supported devices.
The Expression V1's screen is yellow on black, basically a black and white LCD. There's simply not enough free pins in the header for it to be running in parallel. It was unlikely to be even a four bit.
With a little trial and error, I hit the right combination, using MegaCore's pin names (PIN_PE7, for example). And the LCD booted up. I now knew that the LCD for the Expression was a U8GLIB_NHD27OLED_BW supported device.
Adding a new display type to Marlin isn't terribly well documented, but there's a commit in my git repo - https://github.com/MarlinFirmware/Marlin/tree/f9b88e1688482b1eeb549e1c199ebfb247818106
Shows most of how it's done.
Keyboard? No. no, no. But LCDs working, that was a start.