16-Bit kann dein Timer hochzählen. Das ist hexadezimal von 0x0000 bis
0xFFFF bzw. dezimal von 0 bis 65535 bzw. 65536 Timerticks.
Ja, das kannst du fast immer so machen. Fast, weil 65536 nicht der
Preload ist (65536-1000 ist hier der Preload) und weil der 8051 hat auch
andere Timermodi mit 8-Bit und 13-Bit. In diesen Fällen hättest du
andere Werte statt der 65536 (8-Bit: 1+0xFF = 256 und 13-Bit: 1+0x1FFF =
8192)
Dein Overflow-Interrupt tritt auf, wenn von 65535 auf 0 (0xFFFF => 0)
gezählt wird (und er eingeschaltet ist).
Wenn du alle 1000 Timerticks einen Overflow-Interrupt haben willst, darf
der Timer nicht bei 0 anfangen zu zählen. Er muss bei ... 65536 - 1000
anfangen zu zählen. Also musst du das Timerregister mit dem Preload
65536 - 1000 = 64536 vorladen.
Da dieser 16-Bit Wert in zwei 8-Bit Register geschrieben werden muss,
wird er in ein Highbyte ("ganzzahlig dividiert durch 256") und ein
Lowbyte ("Rest bei ganzzahliger Division durch 256") aufgespalten.
Peter nutzt mit dem Vorladen von -1000 elegant aus, dass 65536 bei
16-Bit das gleiche ist wie der Wert 0. 0x0FFFF (65535) + 1 = 0x10000
(0x10000) und beschnitten auf 16-Bit ist das eben 0x0000. 65536 - 1000
== 0 - 1000 = -1000 als Preload. Der Trick klappt auch bei 8-Bit und
13-Bit.