#define PIN_A 16
#define PIN_B 17
#define PIN_C 18
#define PIN_D 19
#define PIN_DA 15
char keys[16] = {
'1','2','3','A',
'4','5','6','B',
'7','8','9','C',
'*','0','#','D'
};
// Kesme ile paylaşılacağı için volatile şarttır
volatile bool yeniTusVar = false;
// Sadece bayrağı kaldıran ultra kısa kesme fonksiyonu
void IRAM_ATTR handleKeypadInterrupt() {
yeniTusVar = true;
}
void setup() {
Serial.begin(115200);
pinMode(PIN_A, INPUT);
pinMode(PIN_B, INPUT);
pinMode(PIN_C, INPUT);
pinMode(PIN_D, INPUT);
pinMode(PIN_DA, INPUT);
// DA pini RISING olduğunda kesmeyi tetikle
attachInterrupt(digitalPinToInterrupt(PIN_DA), handleKeypadInterrupt, RISING);
Serial.println("74C922 Optimize Kesme Modu Basladi!");
}
void loop() {
checkKey();
}
void checkKey() {
// Kesme bayrağı kaldırdıysa okuma işlemlerini burada güvenle yap
if (yeniTusVar) {
yeniTusVar = false; // Bayrağı hemen sıfırla
// Pinleri okuma ve hesaplama işlemleri güvenli bölgede (loop içinde) yapılıyor
int a = digitalRead(PIN_A);
int b = digitalRead(PIN_B);
int c = digitalRead(PIN_C);
int d = digitalRead(PIN_D);
uint8_t key_val = (d << 3) | (c << 2) | (b << 1) | a;
Serial.printf("Basilan Tus: %c (Binary: %d%d%d%d)\n", keys[key_val], d, c, b, a);
// Tuş bırakılana kadar bekle
while (digitalRead(PIN_DA) == HIGH) {
delay(5);
}
}
}