Ich hab solche Sachen bislang immer mit den Befehlen "Debounce" und "Not" erledigen lassen.
Sinngemäß hab ich also per Debounce den Taster entprellen lassen und dann in die folgende Routine das hier geschrieben:

Portx.y = not Portx.y

Toggle verursacht (glaub ich) etwas mehr Code und braucht mehr Rechenzyklen um ausgeführt zu werden. Müsste man mal im Simulator austesten.
Nutzt man "Config Debounce" nicht so setzt der Compiler die Entprellzeit auf 25ms fest.

Um ein Lauflicht zu starten kannste in der Routine die nach dem Betätigen des Tasters folgen soll einen Timer starten der das Programm ablaufen lässt oder sonst welche anderen Bits setzen/zurücksetzen die dem µC verklickern das Du jetzt in Diskostimmung bist