Hallo Blade_Vampire,

ohne dass ich deinen Code vollständig angesehen habe:

1. Ich würde in der ISR die Variable C nur toggeln, das heißt, bei jedem Aufruf der ISR von 0 auf 1 wechseln und umgekehrt. Waitms muss da raus.

2. Deine Hauptschleife (Do-Loop) ist extrem schnell, wenn du keinen weiteren Code drin hast. D.h., dass Debounce 30ms wartet, um den Taster ein 2. Mal abzufragen, danach flitzt dein Hauptprogramm weiter und landet nach wenigen us wieder bei Debounce. Wenn da der Taster noch nicht losgelassen wurde (die Finger sind meist nicht so schnell), hat der Pegel von Rauchmelder noch nicht gewechselt.
Ich würde die Hauptschleife ewas verzögern, z.B. um 50 oder 100ms.
Bei einer Alarmanlage braucht man ja eigentlich auch keine so hohe Speed, um auf die Zustände von Tasten oder Alarmkontakten zu reagieren.

Gruß Dirk