dann setz die Beep-Befehlsfolge vor die Do-Loop-Schleife, dann hat sich das schonmal.

Goto Main2 und Main2 kannst du dir im übrigen sparen, das brauchst du nicht. (da springst du ja eh über nix drüber)

Hast du nen externen Pullup-Widerstand am Taster? Und geht der Taster nach GND?

vlt geht das:
Code:
$regfile = "m16def.dat" 
$crystal = 16000000 

Config Porta.0 = Output 
Config Portd.7 = Output 
Config Pina.2 = Input 
Porta.2 = 1   ' (edit:) !!!Weil du da keine externen pullups hast!!!!!
Dim Zeit As Byte 
Dim Main1 As Long 

Dim Main3 As Long 


Portd.7 = 1 
Waitms 300 
Portd.7 = 0 
Waitms 300 
Portd.7 = 1 
Waitms 300 
Portd.7 = 0 


Main1: 
Zeit = 0 



Porta.0 = 1 
If Pina.2 = 0 Then 
Porta.0 = 0 
Goto Main3
Else 
Goto Main1 
End If 

Main3: 
While Pina.2=0  'es muss ja solange sein, bis der Taster wieder geschlossen wird
Zeit = Zeit + 1 


If Zeit = 10 Then 
Porta.0 = 1 
Portd.7 = 1 
End If

If Zeit = 15 Then 
Porta.0 = 1 
Portd.7 = 1
Zeit = 0          ' so würde die lampe nach 30 Sekunden und nach 45 sekunden für je 3 sec angehen, der Beeper auch
End If 

Waitms 3000  'weil sonst deine "Zeit" nicht wartet zwischen dem Zählen
Porta.0 = 0  'wenn die eh aus sind, dann juckts keinen, wenn nicht, dann passts
Portd.7 = 0  'weil dann eine der If-Schleifen dran war, und du das nicht in der If-Schleife brauchst.

Wend

Goto Main1
EDIT: gnaah, ich überseh immer wieder kleine fehler im prog.