Timing of both dits and dahs is not correct, at least not the sound that is being generated. I recorded some simple sequences of dits and viewed them in audacity. The first two dits are longer than the subsequent ones and the spacing is shorter than the dits. Dahs sound better than the dits but the first dah is longer than subsequent ones.

I have my keyer in iambic mode B, spacing char.

Are you aware of this issue? If not, can you try to reproduce it? Simply listen to 15 WPM 5 5 5 5 . You can hear the cadence change in the middle of each dit string. My radio is out of action for repair so I can't attach it to hear it generate side tone right now.

On a hunch I made lcd_write() return immediately. Dit pacing is much better now. Sound and silence equally long. Dahs are equally long and spacing between dahs is a dit.

My LCD updates rather sluggishly. Is that expected or is there still something wrong with my LCD? After replacing my Arduino it is at least showing text now.

I said clock speed because the LCD is so sluggish. Just a guess, nothing more. The fact that disabling the morse decode printing fixes the timing is a clear indication that LCD updates are too slow. What I don't know is if this is normal or yet some other hardware issue. I'll have to look at the code to see how you time the dits. If it makes assumptions about clock speed then clock speed is fine. 15 WPM sounds like 15 WPM.

I'm using the latest Arduino version. Could it be the LCD library broke and is much slower than the version you have? If your LCD is all zippy and without 'rolling' updates I guess I have to take another video to upload.

You are right, sorry. I didn't realize hourly updates were provided as I didn't use those. I have 1.6.5 but I see there is a 1.6.6 by now so I wasn't even using the latest release version anymore. I will try your latest code with 1.6.6, thanks.