Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC8 => Konuyu başlatan: selvi - 05 Mayıs 2014, 13:57:08

Başlık: birden fazla butonun kontrolu
Gönderen: selvi - 05 Mayıs 2014, 13:57:08
  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;
   }   

Başlık: Ynt: birden fazla butonun kontrolu
Gönderen: Kabil ATICI - 05 Mayıs 2014, 14:11:57
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...
Başlık: Ynt: birden fazla butonun kontrolu
Gönderen: selvi - 08 Mayıs 2014, 20:56:07
  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;
            }
         }
         
      }