The code does have to block interrupts during 1 time critical piece of code but that is only for 5us.
It can be much longer than that. In a 2-wire implementation, you will need to protect the transmission of a '1' bit - time to perform a test, branching and then flipping pins if necessary.
In a 1-wire implementation, each transmission has to pass through two rc filters' time constants so that you can affect changes on the mosi pin without any impact on the sck / rs pin. It is going to be long.
Sure it *could* be longer than 5us but it doesn't have to.
The numbers I'm talking about are for a real working implementation that I have
done which only blocks interrupts for 5us with a 1 wire implementation.
And yes there are two rc filters used for a 1 wire implementation.
And yes there are other delays but those other delays can be interrupted
forever and a day and won't affect operation other than slow it down.
Not sure what you are thinking about with a 2 wire implementation but
a two wire implementation, just like a 3 wire implementation
never has to block interrupts as there are no time critical sections or bits
that have to be protected since there are no rc filters involved when
using 2 or 3 wires to run a shift register.
The processor just sets the pins appropriately and
there are no timing constraints. Faster is better but slower or interrupted
by interrupts doesn't matter. It still works.
Like I said, you might not consider the code for a 1 wire shift register design "fancy",
but it is some very timing precise code that takes a while to design, write, and get it
working correctly and reliably along with the matching hardware design.
Definitely not a 15 minute job, particularly if you want it to work
as an Arduino library on different CPUs like both AVR and pic32 and still be
fully backward compatible with the LiquidCrystal library.
--- bill