Sorry - das kommt davon, wenn man > 1 Sache gleichzeitig macht

Es muss natürlich heißen

Dim Zahl as Byte

Wenn der Controller mit Variablen arbeiten soll, muss für jede Variable 1. ein Name (fast beliebig) und 2. ein geeigneter Variablen-Typ festgelegt werden. Gängige Typen sind z.B.

Bit (0 oder 1)
Byte (8 Bits, d.h. die Variable kann Werte von 0 bis 255 annehmen)
Word (16 Bits, d.h. die Variable kann Werte von 0 bis 65.535 annehmen)
Integer (16 Bit, kann Werte von-32.768 bis +32.767 annehmen)

Mit "Dim Zahl as Byte" wird eine Byte-Variable angelegt.

While-Wend-Schleifen werden so lange durchaufen, wie die While-Bedingung erfüllt ist. In diesem Code heisst das, dass alle 100ms die Variable "Zahl" um eins erhöht ist - solange PIND.7=0 bleibt.

Lässt Du den Taster los ist PIND.7=1, und die While-Wend-Schleife wird augenblicklich verlassen. Dann muss man nur noch checken ob die Variable Zahl < 20 oder > 20 ist, und schon weiß man, ob der Taster länger als 2 Sek. gedrückt wurde oder eben nicht.

Die Variable behält ihren Wert aber erstmal weiter - und deshalb muss man sie unbedingt zurücksetzen, wenn der nächste Tsterdruck erfolgt. Sonst würde der Controller ganz gelassen vom alten Wret aus weiterzählen - und die Variable hätte einen falsch hohen Wert. Deshalb steht zwischen "If PIND.7=0" und der While-Wend-Schleife die Anweisung "Zahl = 0".

Jetzt klarer??