birden fazla butonun kontrolu

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

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

#1
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....