usleep is likely to be implemented as a blocking loop not far different from the for loop.
On the other hand a true sleep function is supposed to suspend the calling task and release the control to other tasks which possibily run at lower priorities.
I guess the lcd management driver runs in a lower priority task (or rather in a lower priority isr, if you don't use any OS): then you send the data with fprintf but the driver is not assigned any cpu time until your function has completed.
The solution depends on your application structure.
If you are using an OS, you should have another sleep "true" function available.
Also debug into usleep in order to find out how it has been implemented; maybe you can set some project options in order to make it work the proper way.
If the fprintf and sleep calls are in a isr, make sure it's not a high priority one.