Mikroc Buton Okuma

Başlatan Teğmen, 02 Ocak 2017, 12:05:45

Teğmen

Merhaba arkadaşlar
Mikro C menü yapma sorununu aşağıdaki kodlarla çözdük sanırım ama if döngüsünde veya diğer döngülerde şartı sağlamasına bakmaksızın döngüye girip çıkıyor
ya da ben yanlış okutuyorum. if(!buton) demem mi doğru olur if(buton==1)veya 0 demem mi 1 veya 0 dediğimde döngüye girmiyor.ilk şekilde de anlamsızca girip çıkıyor.

void main()
{

   ADCON1 |=0x0F;
   CMCON  |=7;

   Lcd_Init();                        //LCD hazırlanıyor.
   Lcd_Cmd(_LCD_CURSOR_OFF);          //Ekrandan imleç kaldırıldı.
   Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
   Lcd_Out(1,1,"GIRIS ICIN ENTER");
   
   
if (enter==0)     {delay_ms(50);i=0;k=0;}
if (enter && k==0){  delay_ms(50);
switch (i) {
             case 0:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 1.1 enter");
             delay_ms(1000);
             if (enter==0) {delay_ms(50);i=0; k=1;}
             break;
             
             case 1:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 2.1 enter");
             if (enter==1) {delay_ms(50);i=1; k=1;}
             break;
             
             case 2:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 3.1 enter");
             if (enter==1) {delay_ms(50);i=2; k=1;}
             break;
             
             case 3:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 4.1 enter");
             if (enter==1) {delay_ms(50);i=3; k=1;}
             break;
             
             }
             if(yukari==1)    i++;
             }
  if(enter==1 && k==1) {
  switch(i) {
             case 0:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 1.1");
             ///if (enter==1) {i=0; k=1;}
             break;
             case 1:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 2.1");
             ///if (enter==1) {i=0; k=1;}
             break;
             case 2:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 3.1");
             ///if (enter==1) {i=0; k=1;}
             break;
             case 3:
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 4.1");
             ///if (enter==1) {i=0; k=1;}
             break;
             }
             }
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

mehmet

Kodlarınızı "Kod Ekle" eklentisi ile
mesajınıza ilave ediniz.
Önizleme isteyin, kodlarınızı seçip "#"
butonuna basın.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

vitruvius

Anlamsızca girip çıkıyor dediğiniz muhtemelen sizin kodunuzdaki mantık hatasından kaynaklanıyor. Öncelikli olarak butona basıldığını sorunsuz bir şekilde yakalayın. Basit bir

if (buton == 0)
{
  // Aksiyonlar
}


durumunda kullanıcı butonu basıp bıraktığında hemen döngü dışına çıkılmasına sebep olacaktır. Ki sizin durumda da bu oluyor tahminimce. Bunun yerine sorgu mantığını değiştirin:

if(PORTD.F0 == 0)   //If the switch is pressed
{
   Delay_ms(100);    //Switch Debounce
   if(PORTD.F0 == 0)//If the switch is still pressed
   {
      PORTB.F0 = 1; //LED ON
      Delay_ms(1000); //1 Second Delay
      PORTB.F0 = 0; //LED OFF
    }
}


Yada bir bayrak tanımlayın ve bunu yorumlayın. Ben kişisel olarak butona basıldıktan sonra bir while döngüsü ile buton bırakılana kadar beklemeyi tercih ediyorum.

Butonu if (buton == 1) veya if (buton == 0) diye mi okuyacağınız devre şemanıza göre değişir. Butona bastığınız zaman pini lojik-1'e mi lojik-0'a mı çekiyorsunuz, buna bakıp ona göre yazmalısınız kodu.

if (buton) mu if (!buton) mu kısmına gelince de:

https://www.le.ac.uk/users/rjm1/cotter/page_37.htm

Kolay gelsin.

Teğmen

Anlamsızca girip çıkıyor dediğiniz muhtemelen sizin kodunuzdaki mantık hatasından kaynaklanıyor. Öncelikli olarak butona basıldığını sorunsuz bir şekilde yakalayın. Basit bir

Kod: [Seç]
if (buton == 0)
{
  // Aksiyonlar
}

durumunda kullanıcı butonu basıp bıraktığında hemen döngü dışına çıkılmasına sebep olacaktır. Ki sizin durumda da bu oluyor tahminimce. Bunun yerine sorgu mantığını değiştirin:

Kod: [Seç]
if(PORTD.F0 == 0)   //If the switch is pressed
{
   Delay_ms(100);    //Switch Debounce
   if(PORTD.F0 == 0)//If the switch is still pressed
   {
      PORTB.F0 = 1; //LED ON
      Delay_ms(1000); //1 Second Delay
      PORTB.F0 = 0; //LED OFF
    }
}

Yada bir bayrak tanımlayın ve bunu yorumlayın. Ben kişisel olarak butona basıldıktan sonra bir while döngüsü ile buton bırakılana kadar beklemeyi tercih ediyorum.

Butonu if (buton == 1) veya if (buton == 0) diye mi okuyacağınız devre şemanıza göre değişir. Butona bastığınız zaman pini lojik-1'e mi lojik-0'a mı çekiyorsunuz, buna bakıp ona göre yazmalısınız kodu.

if (buton) mu if (!buton) mu kısmına gelince de:

https://www.le.ac.uk/users/rjm1/cotter/page_37.htm





butona basıldığında sanırım ark oluşuyor o yüzden algılayamıyor ama dediğinizi bir deneyeceği teşekkür ederim

Kolay gelsin.
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.

Teğmen

Ark olayından kaynaklanıyormuş
While ile sorunu hallettim
Teşekkür ederim.

if (enter==1&& k==0){ while(!enter);
 switch (i) {
             case 0:
             while(j==1){
             Lcd_Cmd(_LCD_CLEAR);               //Ekran temizlendi.
             Lcd_Out(1,1,"Menu 1.1 enter");
             delay_ms(50);
             if (!enter) {while(!enter);j=0; k=1;}}
             break;
"Girdim ilim meclisine kıldım eyledim talep,   Dediler ilim geride kaldı illa Edep illa Edep" Hz.Yunus Emre K.S.