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;
}
}
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...
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;
}
}
}