Hallo Chandler.

Vorweg die Frage: Hast du bereits anderweitige Erfahrung bzw. Erfolge mit diesem Controller?
Ich bin nämlich irritiert über die CONFIGs:
a) Startup-Timers deaktivieren: dafür sollte man schon einen guten Grund haben, diese Timer haben fast nur Vorteile
b) ECIO ist meines Wissens External Clock mit (dann unnützem) Oscillator-Out-Pin als I/O, keinesfalls aber ein Quarzoszillator für externen Quarz
c) Erfahrung mit PLL? Da gibt es ein, zwei Fallstricke bzgl. des nutzbaren Wertebereichs von Eingangsfrequenz und Multiplikator

Wenn es unglücklich läuft, arbeitet dein Controller hier mit dem internen Not-Taktgeber im zig-Kilohertz-Bereich und alle deine Zeiten sind rund tausendmal länger als erwartet.

Das Programm erscheint mir unvollständig, zumindest mangels include-Dateien schwer nachvollziehbar.
Kannst du uns auch den Schaltplan zeigen?

Noch ein paar Anmerkungen:
- welche Funktion hat LATBbits.LATB12 ? Eine Debugging-LED?
- Die Aktion auf LATBbits.LATB13 wird wegen des davor platzierten while (1) {} wohl niemals ausgeführt werden
- Warum wird für die Datenbits zum LCD mal ein unsigned char, mal ein unsigned int verwendet? Wenn es vielleicht auch nicht schadet, so hat es doch Fehlerpotential
- heißer Tipp: (viel) mehr Kommentare im Code !

Meine Empfehlungen:
- stelle den korrekten Prozessortakt sicher, z.B. anhand einer Debugging-LED, die im Sekundentakt blinken soll und auch in dieser Frequenz blinkt
- verlangsame das Timing; das LCD kommt auch mit quasi-stationären Signalen zurecht.
- notfalls stoppe nach jedem I/O-Vorgang den Programmablauf und prüfe, ob sich tatsächlich die erwarteten Leitungspegel einstellen

Zum Schluss:
Nicht böse sein, wenn ich dir Ratschläge unter deinem Niveau gegeben haben sollte. Ich kann nicht herauslesen, ob deine ziemlich unscharfe Anfrage auf Nachlässigkeit oder fehlender Erfahrung beruht.

Gruß
Christian.