birden fazla butonun kontrolu

Başlatan selvi, 05 Mayıs 2014, 16:57:08

selvi

05 Mayıs 2014, 16:57:08 Son düzenlenme: 05 Mayıs 2014, 17:01:12 selvi
  bir butonun basilip basilmadigi icin asagidaki sekilde fonksiyon(void scan_key(void))  kurulmus.ben 6 butonu kontrol etmek icin bu fonksiyonu nasil duzenleyebilirim.

kod:

#define  KEY            RC2
void main()

........
key_back=1;
}

  while(
1)
   {      
      if(
Flag.reach_20ms)
      {
         
Flag.reach_20ms 0;
         
scan_key();   
      }
  .......
    }


void scan_key(void)
{
   
unsigned char key_value1,key_value2;
   
key_value1=KEY;
   
delay_1ms(4);
   
key_value2=KEY;
   if(
key_value1==key_value2)
   {
      if((
key_value1==0)&&(key_back==1))
      {
         
key_back=key_value1;
         
tx_data();
      }
      else if((
key_value1==1)&&(key_back==0))
      {
         
key_back=key_value1;
      }
      
key_back=key_value1;
   }
}

void interrupt ISR_timer(void)

    
unsigned char i;
    
   if(
TMR1IF)
      {  
         
TMR1L 0x78;      // timer = 20ms  
         
TMR1H 0xec;
      
Flag.reach_20ms 1
      
rf_timeout++;
      if(
rf_timeout == 25)
      {
         
Flag.rf_reach_timeout 1;   // tx timeout or Rx timeout
      
}                       
       
TMR1IF=0;
   }   
}  
Yaşam anlamlandırıldıkça kutsaldır....

Kabil ATICI

05 Mayıs 2014, 17:11:57 #1 Son düzenlenme: 06 Mayıs 2014, 11:59:12 ambar7
Aynı anda basma yoksa;
key port olarak tanımla,

bu bölüm aynen kalacak,
  key_value1=KEY;
   delay_1ms(4);
   key_value2=KEY;
   if(key_value1==key_value2)



bu noktadan sonra bit bit ayıklaman lazım... butonların portdaki yerleşimine göre 16'sayı sistemine göre karşılaştırabilirsin... 6 ve 7. bit ler sıfırlanırsa (VE işlemi ile)

örneğin bit0 için  (111110)
if((key_value1==0x3E)&&(key_back !=0x3E))
      {
         key_back=key_value1;
         tx_data();
      }
      else if((key_value1==0x3F)&&(key_back==0x3E))
      {
         key_back=key_value1;
      }
      key_back=key_value1;


örneğin bit 1 için (111101)
if((key_value1==0x3D)&&(key_back !=0x3D))
      {
         key_back=key_value1;
         tx_data();
      }
      else if((key_value1==0x3F)&&(key_back==0x3D))
      {
         key_back=key_value1;
      }
      key_back=key_value1;

gibi...

burada key_back biraz işi karıştıracak... bit bit karşılaştırılabilir...

en sora saten key_back=key_value1; yapılacaksa else bile gerek yok...

Ek: kimsede söylemiyor tuşları yanlış bakıyorsun diye, tekrar düzenlendi...
ambar7

selvi

  6 buton icin fonksiyon asagidaki sekilde kurulmus.hocam bunu bir inceleyebilirmisiniz.
kod:

#define  key_1       RC1
#define  key_2       RC2
#define  key_3       RC5
#define  key_4       RC6
#define  key_5       RC7
#define  key_6       RA4

#define  KEY1         0xf4
#define  KEY2         0xf2
#define  KEY3         0xd6
#define  KEY4         0xb6
#define  KEY5         0x76
#define  KEY6         0xe6

....
key_back=0xf6;
....
void scan_key(void)
{
   
unsigned char key_value1,key_value2;
   
key_value1=PORTC&0xe6;
   
key_value1=key_value1|(PORTA&0x10);
   
delay_1ms(4);
   
key_value2=PORTC&0xe6;
   
key_value2=key_value2|(PORTA&0x10);
   if(
key_value1==key_value2)  
   {
      if(
key_value1==0xf6)
      {
         
key_back=key_value1;
      }
      else
      {
         if(
key_back==key_value1)
            return;
         else
         {
            
key_back=key_value1;
            switch(
key_value1)
            {
               case 
KEY1:
                  
//action of key_1
               
break;
               case 
KEY2:
                  
//action of key_2
               
break;
               case 
KEY3:
                  
//action of key_3
               
break;
               case 
KEY4:
                  
//action of key_4
               
break;
               case 
KEY5:
                  
//action of key_5
               
break;
               case 
KEY6:
                  
//action of key_6
               
break;
            }
         }
         
      }
Yaşam anlamlandırıldıkça kutsaldır....

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.