There is rarely a new module with an original HD44780 any more, since that IC isn't manufactured since ages. New HD44780 displays use clones of different quality, and with timing variations from the original HD44780.
HD44780 timing, including clones is a bitch. Many code for HD44780 out there has wrong timing and just worked on one or the other HD44780 clone. People unfortunately think when it happened to work for them it will work for everyone and publish that code.
Therefore, carefully go through the datasheet for your module and notice all the timing (delay) values. Adhere to them. Every time. And not only that. Add a safety margin to them, since your CPU clock might be a little bit off, and your module might have a bad hair day. If you can, measure the timing of your signals with an oscilloscope or LA. Don't just trust that the timing looks ok in the software. Especially, don't trust delay loops. Your compiler might have optimized them out.
Another issue with those HD44780 clones is their behavior when it comes to unconnected data and control lines compared to the original HD44780. Carefully connect all pins just for good measure. Including grounding unused pins or tying them to Vcc. Many HD44780 clones don't need this, but some do.
Yet another issue is reset. On paper a HD44780 or clone initializes itself after reset automatically, and the typical sequence to initialize it is not needed. In reality this barely works, because it requires power rising at a certain speed. So in reality you can not skip the initial instruction sequence. And that sequence must be given with the right timing, otherwise you end up at with an uninitialized display.
And yes, correctly adjust the contrast.