Ich hab es jetzt nicht so mit 8051ern, habe aber etwas Ahnung von C.
Wieso rufst du in einer Interrupt-Routine eine Funktion ("print_lcd")
auf? Das kostet unnötig Zeit.
Dann hast du eine "Mörderberechnung" in einem Printf für einen Wert,
den du früher schon berechnet hast. Berechne den Wert, schreibe ihn in
eine Variable und schreibe den Wert dieser dann in CM7 etc.
Dann ist eine Aktualisierung der Pulsdauer einer PWM mitten im Programm
nicht wirklich gut, weil es zu komischen Impulsen kommen kann.
Aktualisiere den Vergleichswert am Anfang des Pulses
(Interrupt-Routine?).
Dann gib erst etwas auf dem Display aus, wenn sich etwas geändert hat
(Tastgrad, Zeit, B-Zeit).
Die Tasten kannst du konstant einlesen (entprellen nicht vergessen [in
der Timer-Routine]). Hat sich dann eine Änderung eingestellt, kann man
darauf reagieren.
Das war's von meiner Seite erst mal.
Gruß Rahul