Slm ben menu yapıyorum ama buttonlar bazen normal calisiyor bazende cok hızlı calisiyor ilgili fonkisiyonu asagida veriyorum sorun acaba scakey() mı?
[code]
scankey()
{
while(1)
{
if(s2==1)
{
delay_ms(200);
if(s2==1)
return 1;
}
if(s3==1)
{
delay_ms(200);
if(s3==1)
return 2;
}
}
}
asagidaki kısım mainden bir parca
while(1)
{
while(s2&&!s3)
{
hour=hour+1;
if(hour==24)
hour=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"Saati gir");
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d",hour);
scankey();
}
yani ekranda saati bazen normal arttırıyor bazenden 5er 5 er falan arttıyor
simdeden hrkeze tsk
Benim yazdığım bir buton fonksiyonu.
void f_saat(){
if (!bsaat){
delay_ms(3);
if (++but0 > 25) { but0 = 0;if (++saat>23) saat=0;goto son;}
if (!bb_saat) {if (++saat>23) saat=0;}
bb_saat = 1;
} else{
But0 = 0;
bb_saat = 0;}
son:;
}
Burada
bsaat -> butonun bağlı olduğu pin
bb_saat -> dahili bir bit butonun önceki durumunu saklıyor
but0 -> int8 tipinde bir değişken. butona daima basılınca otomatik artma
hızını belirliyor.
Bu fonksiyonu ana program döngüsüne koyarsanız çalışır.
Alıntı yapılan: "muahaha"Slm ben menu yapıyorum ama buttonlar bazen normal calisiyor bazende cok hızlı calisiyor ilgili fonkisiyonu asagida veriyorum sorun acaba scakey() mı?
[code]
scankey()
{ while(1)
{if(s2==1)
{delay_ms(200);
if(s2==1) return 1;
}
if(s3==1)
{delay_ms(200);
if(s3==1) return 2;
}
}
}
asagidaki kısım mainden bir parca
while(1)
{
while(s2&&!s3)
{
hour=hour+1;
if(hour==24)
hour=0;
lcd_gotoxy(1,1);
printf(lcd_putc,"Saati gir");
lcd_gotoxy(1,2);
printf(lcd_putc,"%02d",hour);
scankey();
}
yani ekranda saati bazen normal arttırıyor bazenden 5er 5 er falan arttıyor
scankey içerisinde dondürmek istediğin sayıyı bir değişkene aktar. 200 ms bekledikten sonra tuşu tekrar kontrol etmenin anlamı yok. saten o tuş bir kere aktiflendimi debounce süresini beklemene gerek yok çünkü o tuşa basıldı. altprogramdan çıkmadan önce bir delay koyman yeterli. Delay rutinleri genelde fazla stack space kullanırlar ve o nedenle mümkünse scankey alt rutinini çağırdıktan sonra (bu rutinden dönünce) kullanman daha sağlıklı olur.
ana programda saati arttırdığının döngüye giriş şartın while(s2&&!s3) ile. Ama scankeyi fonksiyon tanımlamışsın ve dönüş değerini ana programda kullanmamışsın. s2 yada s3 durumu scankeyde ne olmuş ise ana programda onu kullanmışsın. O while döngüsüne de de ancak s2 1 yapıldığında girersin.
onun yerine
while (s2 || s3)
{ deger = scankey(); delay_ms(200);
if (deger==1) hour++; if(hour==24) hour=0;
LCD yazdırma işlemleri
}
scankey deki while(1) de gereksiz. Tuşa basılmışsa çağır scankey i.