A few styling remarks, which are highly subjective. Your program is simple enough that it will not matter much.
The final "return;" statement adds nothing. For one, control will never reach this statement, and even if it would, it's the end of the function anyway. Unless I'm missing something that your particular compiler would enforce it.
Comments like "// decrement counter if not zero" are superfluous. They just repeat the code (on the same level of abstraction). It does not tell the programmer *why* something happens. As of now, comment and code match, but there's a non-zero chance that the code will evolve. It's easy to neglect reflecting those changes in comments, and once that happens the comment is not merely not adding value, it is actually mis-leading (and thus malicious).
In my opinion, it's good practice to be greedy with comments. Express your intent clearly in code, so you don't need them.
From an analytical point of view, what's the difference between the block that deals with counter1, LED1, trigger1_s, trigger1 and the block that deals with counter2, LED2, trigger2_s, trigger2? Is the logic the same, or is that completely separate? If it's the same (and always should be the same), then you might want to factor that out (and create a function with a descriptive name).