Counter increases "while" button is clicked. Not "once" button is clicked.

As you see at the topic, the problem is that counter increases continually if button is clicked (even though when I wash my hands of it). However, I want it to do it one by one. The code is below. 'sayac' = 'counter'.

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
const int blueled=13;
const int redled=12;
const int buton1=6;
const int buton2=7;
const int buton3=8;
int sayac = 0;
void setup() 
{
lcd.begin();

pinMode(blueled,OUTPUT);
pinMode(redled,OUTPUT);
pinMode(buton1,INPUT);
pinMode(buton2,INPUT);
digitalWrite(redled,LOW);
digitalWrite(blueled,LOW);
}

void loop() {
  lcd.setCursor(0,0);
  lcd.print("Test Ediliyor...");
  lcd.setCursor(15,0);
  
lcd.setCursor(4,1);
lcd.print("Sayac : ");
lcd.setCursor(12,1);
lcd.print(sayac);
if(digitalRead(buton1)==HIGH)
{
  digitalWrite(redled,LOW);
  digitalWrite(blueled,HIGH);
   sayac=sayac+1;
   delay(2000);
}

if(digitalRead(buton2)==HIGH)
{
  digitalWrite(blueled,LOW);
  delay(5000);
  digitalWrite(redled,LOW);
 digitalWrite(redled,HIGH);
  
}

 if (digitalRead(buton3) == HIGH) 
 {
 sayac = 0;
 }
}

Should I use millis function to avoid repeating?
Is there any code to detect the situation when button is unclicked?

Thank you.

The state change detection tutorial may be just what you need. You may need to add debounce for the switch.

You have to use a boolean variable to memorize the state of the button. Suppose you name it button1State, put in your code before the setup:

bool button1State = false;

Then, keep track of the state change in your if block:

if(digitalRead(buton1)==HIGH) {
  delay (15);  // debounce
  if (!button1State) { // do the following ONLY if the previous state was LOW (or false)
    button1State = true;
    digitalWrite(redled,LOW);
    digitalWrite(blueled,HIGH);
    sayac=sayac+1;
    delay(2000); // <-- this can be removed I think (try it)
  }
} else button1State = false;

Do the same for your other if block if you need so.