Timer Interrupt Does not stop

#include <avr/io.h>
#include <avr/interrupt.h>

boolean knt = false;

void setup()
{
  pinMode(8, INPUT);
  pinMode(13, OUTPUT);
  timer_on();
}

ISR(TIMER1_COMPA_vect)
{
  digitalWrite(13, !digitalRead(13));
}

void loop()
{
  if (digitalRead(8) == 1 && knt == false)
  {
    timer_off();
    knt = true;
    delay(500);
  }
  else if (digitalRead(8) == 1 && knt == true)
  {
    timer_on();
    knt = false;
    delay(500);
  }
}

void timer_on() // Timer1 kesmesi saniyede bir çalışacak şekilde ayarlanacaktır (1 Hz)
{
  cli();
  TCCR1A = 0;
  TCCR1B = 0;
  TCNT1  = 0;
  OCR1A = 15624;

  TCCR1B |= (1 << WGM12);
  TCCR1B |= (1 << CS12) | (1 << CS10); /* Adımlar arasında geçen süre kristal hızının 1024'e bölümü olarak ayarlandı */
  TIMSK1 |= (1 << OCIE1A);  /* Timer1 kesmesi aktif hale getirildi */
  sei();
}

void timer_off()
{
  cli();
  TCCR1B &=~ (1 << CS10);
  TCCR1B &=~ (1 << CS12);
  digitalWrite(13, 0);
}

How to stop timer interrupt in this program? LED blinks properly each second but when ı press button, blink does not stop...

The only obvious problem I see is that you forgot to turn interrupts back on at the end of 'timer_off()'. That would not cause the timer to keep running. Are you sure the button is working?

void timer_off()
{
  cli();
  TCCR1B &= ~ (1 << CS10);
  TCCR1B &= ~ (1 << CS12);
  digitalWrite(13, 0);
}

You code requires an external pull-up resistor on pin 8 for your button. Do you have one installed? A more common method is one side of the button to a pin and the other side of the button to ground and declare that pin as INPUT_PULLUP. This will make the pin HIGH when not pressed or LOW when pressed.

Besides the other issues mentioned, I don't like that if the button is held down for more than half a second it repeats. Much better to write loop like this:

boolean knt = false;
boolean lastButton = false;

void loop(void) {
      boolean buttonState = digitalRead(8);
      if (buttonState && !lastButton) {
          if (knt) {
               timer_on();
          } else {
               timer_off();
          }
          knt = !knt;
      }
     lastButton = buttonState;
     delay(20); // avoid contact bounce
}