Mobile Keypad-Pic 16F877A

darakilinc

Üye
Katılım
26 Ağu 2009
Mesajlar
33
Puanları
1
Yaş
38
Arkadaşlar merhaba.. Bir kaç haftadır, 4x4 keypad'den mobile keypad yapmaya çalışıyorum. Yani mantık olarak herkezin tahmin edeceği üzere, 2'ye bir kaç saniye içinde 2 kere basıldığında B harfini gösterecek cinsten.. Bir kod yazdım ama çalıştıramadım. Yardımlarınızı bekliyorum. Çok teşekkür ederim..

unsigned short kp, a = 65, oldstate = 0;
char txt[5];

void main() {
Keypad_Init(&PORTB);
Lcd_Init(&PORTD);
Lcd_cmd(LCD_CLEAR);
Lcd_cmd(LCD_CURSOR_OFF);

Lcd_Out(1,1, "M: ");

do {
kp = 0;
do
kp = Keypad_Released();
while(!kp);
do {
switch(kp) {
if case ==4 ;
kp = a; break;
Lcd_Cmd(LCD_MOVE_CURSOR_RIGHT)
if case == 8;
kp = a+1;
delay_ms(1000);
elseif (case != oldstate)
kp = a+2;
delay_ms(1000);
elseif (case != oldstate)
kp = a+3;
Lcd_Cmd(LCD_MOVE_CURSOR_RIGHT)
else {
if case == 12;
kp = a+4;
delay_ms(1000)
elseif (case != oldstate)
kp = a+5;
delay_ms(1000)
elseif (case != oldstate)
kp = a+6;
Lcd_Cmd(LCD_MOVE_CURSOR_RIGHT)
else {
if case == 16;
kp = a+7;
delay_ms(1000)
elseif (case != oldstate)
kp = a+8;
delay_ms(1000)
elseif (case != oldstate)
kp = a+9;
else {
if case == 3;
kp = a+10;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +11;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 12;
else {
if case == 7;
kp = a+13;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +14;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 15;
else {
if case == 11;
kp = a+16;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +17;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 18;
else {
if case == 15;
kp = a+19;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +20;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 21;
else {
if case == 2;
kp = a+22;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +23;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 24;
else {
if case == 6;
kp = a+25;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +26;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 27;
else {
if case == 10;
kp = a+28;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +29;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 30;
else {
if case == 14;
kp = a+31;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +32;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 33;
else {
if case == 1;
kp = a+34;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +35;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 36;
else {
if case == 5;
kp = a+37;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +38;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 39;
else {
if case == 9;
kp = a+40;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +41;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 42;
else {
if case == 13;
kp = a+43;
delay_ms(1000)
elseif (case !=oldstate)
kp = a +44;
delay_ms(1000)
elseif (case !=oldstate)
kp = a + 45;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
} while(1)
Lcd_Chr(1,10,kp);
WordtoStr(kp, txt);
}
 
arkadaşlar kimse yorum dahi getiremiyor mu konuyla alakalı :S
 
Yazmayınca da açtığım konu arkadalara doğru gidiyor...

Arkadaşlar yardım edebilecek olan yok mu aranızda...????
 
arkadaşım selam bende ccs de acemiyim fakat bence yanlış olan
delay_ms(1000) // burda gecikme yapıyor fakat gecikme esnasında sadece bekliyor
beklerken aynı zamanda ikinci gelecek buton bilgisini kontrol etmen lazım
bunuda ya kesme kullanarak yaparsın yada for döngüsünü kullanarak bekleme yap döngü içerisindede ikinci gelecek butonu kontrol et. aksi taktirde ikinci butonun zamanını tutturamassın.

kolaygelsin.
 
teşekkür ederim sonunda birinin konuyla ilgili yorum getirdiği için..

Açıkcası mantık olarak tahmin ediyorum nası yapılması gerektiğini ama, MicroC'ye başlıyalı 1.5 ay falan oldu ve nasıl yapabileceğimi bilmiyorum. Hani yazdığım bu kod bir çoğuna çok acemice gelicektir çünkü öyleyim. Yardım arıyorum ondan dolayı..

Yani, gecikme içinde for döngüsü nasıl döndürebilirim mesela, hani direk delay_ms(1000), ardından gelen satıra for satırı mı yazıcam.. Nasıl olucak??

Cevabın için tekrar teşekkür ederim..
 
arkadaşım açıkcası bende başlayalı 15-20 gün oldu bu siteden bende bir soru sordum fakat hiç cevap yazan olmadı. sana tavsiyem bol miktarda örnek programları incele.
tekrardan kolaygelsin.
 
aynı ilgisizlikten bende muzdabiribim ne yazık ki!

çok teşekkür ederim tekrardan..
 
Kardeşim, projene yardımcı olmak istiyorum ama bu hemen yapılacak bişey değil. Notları açıp kurcalamak gerekiyor. Lcd ışıklı kürsördür, alt tiredir. Pazar yapalım diyeceğim ama o gün birikmiş işlerim var. Sen hocandan ekstra 1 hafta daha koparabilirsen önümüzdeki hafta yıllık izine çıkıyorum. O zaman yardımcı olabilirim. Tabi istersen.
 
#define DELAY_FOR_NEXT 1000 // Delay before orginal Key is returnd time depends on how foten the "Call_Me_Every_1ms()" rutine is called

// Key_list[number of keys][number of characters/key]
// if you whant to have more characters on some keys then use a null on empty spots like below
//const unsigned char Key_list[9][6]={{'A','B','C','1',!,¤},{'D','E',0,0,'F','2',%,0},{'G','H','I','3','<','>'},{'J','K','L','4',0,0},{'M','N','O','5',0,0},{'P','Q','R','6',0,0},{'S','T','U','7',0,0},{'V','W','X','8',0,0},{'Y','Z','9',' ',0,0}};

const unsigned char Key_list[9][4]={{'A','B','C','1'},{'D','E','F','2'},{'G','H','I','3'},{'J','K','L','4'},{'M','N','O','5'},{'P','Q','R','6'},{'S','T','U','7'},{'V','W','X','8'},{'Y','Z','9',' '}};
unsigned short Delay_Timer= 0; // Timer for delay
unsigned char NewKey= 0; // use this as a way to see if the value is stepped or a new Key were pressed

void Call_Me_Every_1ms(){ // call this rutine at a steddy pase, if not value will step every time the DoKey() rutine is called whit the same value
if( Delay_Timer < 0xffff ) Delay_Timer++;
}

unsigned char DoKey(unsigned char Key) { // call this rutine with the Key pressed "as a character 0-9" and it returnes the value to display if called whit any other it returns null
static unsigned char step, last; // local

if( Key < '0' || Key > '9' ) return 0; // if not a valid value return null
if( Key == last && (Delay_Timer < DELAY_FOR_NEXT) ) { step++; NewKey= 1; } else { NewKey= 0; last= Key; step= 0; Delay_Timer= 0; } // check if same Key and the amount of time is less then time before next Key should be displayd
if( (step >= sizeof(Key_list[0])) || (Key_list[Key-'0'][step] == 0 ) ) step= 0; // if step is bigger than amount of chars in list or if null go to beginning of list

return Key_list[Key-'0'][step]; // return the value for the Key as a character
}

unsigned char tstkey= 0; // only for test of this
unsigned char display_char; // only for test of this

void main( void )
{
Keypad_Init(&PORTB);
Lcd_Init(&PORTD);
Lcd_Cmd(LCD_CLEAR);
Lcd_Cmd(LCD_CURSOR_OFF);
do{
display_char= DoKey('1');
if( NewKey ) // this is a check if display should move to new position and desplay character, remove if not needed
display_char;
else
display_char;
Call_Me_Every_1ms(); // update timer
Delay_ms(1);
}while(1);
}


vakti olan baksın lütfen..
 
Buyrun arkadaşlar, mobile keypad için, microC kodu.. Denendi çalışıyor..




#define DELAY_FOR_NEXT 1000

// Key_list[number of keys][number of characters/key]

//const unsigned char Key_list[9][6]={{'A','B','C','1',0,0},{'D','E',0,0,0,0},{'G','H','I','3','<','>'},{'J','K','L','4',0,0},{'M','N','O','5',0,0},{'P','Q','R','6',0,0},{'S','T','U','7',0,0},{'V','W','X','8',0,0},{'Y','Z','9',' ',0,0}};
const unsigned char Key_list[16][4]={{'0','0',0,0} // key 0
,{'A','B','C','1'} // key 1
,{'D','E','F','2'} // key 2
,{'G','H','I','3'} // key 3
,{'J','K','L','4'} // key 4
,{'M','N','O','5'} // key 5
,{'P','Q','R','6'} // key 6
,{'S','T','U','7'} // key 7
,{'V','W','X','8'} // key 8
,{'Y','Z','9',} // key 9
,{'#',0,0,} // key #
,{'*',0,0,} // key *
,{'a',0,0,0} // key A
,{'b',0,0,0} // key B
,{'c',0,0,0} // key C
,{'d',0,0,0}}; // key D

unsigned int Delay_Timer= 0; // delay

unsigned char NewKey= 0; // yeni tuş basıldı mı basılmadı mı diye kontrol edecek komut

void Call_Me_Every_1ms(){ // bekleme komutu, tuşa basılmadığında aynı sayıyı ekranda göstericek
if( Delay_Timer < 0xffff ) Delay_Timer++;
}

unsigned char DoKey(unsigned char Key) { // karakter girimi

static unsigned char step, last; // local

if( Key < '0' || Key >= '0'+sizeof(Key_list)/sizeof(Key_list[0]) ) return 0;

if( Key == last && (Delay_Timer < DELAY_FOR_NEXT) ) { step++; NewKey= 0; } else { NewKey= 1; last= Key; step= 0; Delay_Timer= 0; } // aynı tuşa basıldı mı basılmadı, basıldıysa, geçen zamanı kontrol

if( (step >= sizeof(Key_list[0])) || (Key_list[Key-'0'][step] == 0 ) ) step= 0;

return Key_list[Key-'0'][step]; // değeri karaktere çevir
}

void main() {
unsigned short kp;
//Init ports here
Keypad_Init(&PORTB);
Lcd_Init(&PORTD);

Lcd_cmd(LCD_CLEAR);
Lcd_cmd(LCD_CURSOR_OFF);

Lcd_Out(1,1, "M: ");

do{
do{
kp = Keypad_Read();
Call_Me_Every_1ms();
Delay_ms(1);
}while(!kp);
while(Keypad_Read() != 0 ); // tekrar tuşa basıldığına bakıyor
kp= DoKey(kp+47);

if( !NewKey ) // eğer 1 saniye içinde tuşa tekrar basılırsa cursor'u geri al
Lcd_Cmd(LCD_MOVE_CURSOR_LEFT);

Lcd_Chr_Cp(kp);
}while(1);
}
 

Forum istatistikleri

Konular
129,837
Mesajlar
930,659
Kullanıcılar
452,670
Son üye
fearles3422

Yeni konular

Geri
Üst