Попробуйте не использовать что-то вроде SetXY() или как оно там может зваться, а напрямую указывать смещения. То есть, что-то вроде
lcdWriteCommand(KS0066_SET_DDRAM + i);
где KS0066_SET_DDRAM = 0x80, а i надо поварьировать, чтобы понять, с каких значений i какая строка начинается.
Например, для 16x2 c i = 0x00 начинается первая строка, с i = 0x40 - вторая. Для 20x4 будет иначе. Точно не уверен, но предположу, что c i = 0x00 - первая, i = 0x40 - вторая, i = 0x14 = третья, i = 0x64 - четвёртая. То есть, если последовательно гнать в дисплей данные, строки будут заполняться в последовательности 1-3-2-4, т.е. 3-я строка фактически является продолжением первой, четвёртая - второй, словно бы это был дисплей 40x2.


