Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

pic c lcd ve keypad

Başlatan harmek, 07 Ocak 2012, 16:48:35

harmek

slm, tuş takımı ve lcd ile uygulama yapıyorum. lcd ye hangi tuşun yazıldığını key_oku() ile alabiliyorum fakat 3 digit(rakam) olarak sayı alamıyorum yani 398 yazıp bununla işlem yapmak istiyorum ama olmuyor yapamadım. yardımcı olabilrmisiniz.

-Hasan-

Programınızı buraya koymazsanız kimse yardımcı olamaz.  :(

ErsinErce

aynı konu defalarca açılmış durumda silinse daha iyi olur...

tekosis

matematikte kullanılan çözümleme yöntemini kullanabilirsiniz. örneğiin :  258 = 2x100  +  5x10  +  8x1 de olduğu tuş takımından gibi aldığınız ilk değeri 100 ile çarpın, ikinci değeri 10 ile çarpın 3. değeride az önceki iki çarpımın sonucu ile toplayıp 16 bitlik bir kaydedicide saklayın. böylece istediğiniz değerde sayıyı elde edersiniz.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

harmek

şimdilik sorun şu. benim keypad oku fonksiyonuda ilk sayıyı alsam 2. sayıda 3. sayıda aynı değer oluyor. keypad e defaoult olarak 0 atasam bu seferde tüm sayılar sıfır oluyor. çözüm bulamadım. kendime göre çözüm ürettim oda sadece ikik sayı için oldu.

justice_for_all

#5
her tusu dizi elemanina alin sizin icin bir program yazdim ki soyle

unsigned char dizi[];

unsigned int hesapla(unsigned char* key,unsigned char uzunluk)
{

	static unsigned int temp=0;
	unsigned char i;
	unsigned int carpan=1;
	
	for(i=uzunluk;i>=1;i--)
	{
		temp+=(unsigned int)key[i-1]*carpan;
		carpan*=10;
	}
	
	return temp; 

}///


sonra tuslari dizi elemanina tek tek okutursun daha sonra hesapla fonksiyonu cagirilir.

deger= hesapla(dizi,sizeof(dizi));


burda gorulen deger degiskenini artik istediginiz gibi kullanabilirsiniz 5 basamaga kadar (max 65535) sifre olusturabilirsiniz.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

Alıntı yapılan: justice_for_all - 08 Ocak 2012, 21:22:18
her tusu dizi elemanina alin sizin icin bir program yazdim ki soyle

unsigned char dizi[];

unsigned int hesapla(unsigned char* key,unsigned char uzunluk)
{

	static unsigned int temp=0;
	unsigned char i;
	unsigned int carpan=1;
	
	for(i=uzunluk;i>=1;i--)
	{
		temp+=(unsigned int)key[i-1]*carpan;
		carpan*=10;
	}
	
	return temp; 

}///


sonra tuslari dizi elemanina tek tek okutursun daha sonra hesapla fonksiyonu cagirilir.

deger= hesapla(dizi,sizeof(dizi));


burda gorulen deger degiskenini artik istediginiz gibi kullanabilirsiniz 5 basamaga kadar (max 65535) sifre olusturabilirsiniz.




yine aynı sorun:)
ben 2 ye bastıığımda bana 222 üreticek o kodlar da..
şöle bi çözüm üretiim bende kendime
while(1)  // Sonsuz döngü
{output_high(pin_a0);  // RB0 pini çıkışı lojik-1 yapılıyor
delay_ms(500);        // 500 ms gecikme veriliyor
output_low(pin_a0);

if(keypad_oku()!=11){
if(keypad_oku()!=12){
lcd_gotoxy(1,2);

printf(lcd_putc,"%d",keypad_oku());
a=keypad_oku();
delay_ms(200);
}}
if(keypad_oku()==11)
{

while(keypad_oku()==11){

delay_ms(150);

if(keypad_oku()==12)
{

while(keypad_oku()==12){

delay_ms(150);





if(keypad_oku()!=12){
lcd_gotoxy(3,2);
printf(lcd_putc,"%d",keypad_oku());
c=keypad_oku();
delay_ms(200);
}
}



}



if(keypad_oku()!=11){
lcd_gotoxy(2,2);
printf(lcd_putc,"%d",keypad_oku());
b=keypad_oku();
delay_ms(200);
}
}



}

k=keypad_oku();
if(k==12){
hane_hesapla(a,b,c);
k=0;
delay_ms(200);
}
}

2 haneli yapmak için * tuşunu kullanıyorum 3 hane için ise * dan sonra kare

Okan AKÇA

Alıntı yapılan: -Hasan- - 07 Ocak 2012, 17:32:44
Programınızı buraya koymazsanız kimse yardımcı olamaz.  :(
?

Murat Mert

S.A.
CCS C nin kendi içindeki örneklerinde keypad var. Keypad değerini Char olarak okursun ve bunu sayısal işlemek içinde karekteri sayısal değişkene çevirmen lazım.
Bunun için atol,atoe,atof komutlarını incelemeni tavsiye ederim. Kolay gelsin.
mert07

justice_for_all

#9
hocam sen uckez tusa bastiktan sonra ve bunlari ayri dizi elemanlarina aldiktan sonra nasil ikisinide ayni cikartir anlamadim butun tuslar girildikten sonra o fonksiyonu cagirmaniz gerek cunku ben manuel dizi elemanlari girdim hic sorun yoktu sizin butona basinca deger atama ile ilgili bit probleminiz var o zaman.

Alıntı yapılan: harmek - 09 Ocak 2012, 01:40:08

yine aynı sorun:)
ben 2 ye bastıığımda bana 222 üreticek o kodlar da..


siz bir tusa bastiktan sonra o fonksiyonu cagirirsaniz tabiki 222 veya 333 gibi sayilar cikartir :)
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

benim yaptığım mantık şöyle çalışıyor. örnek 64 yazıcaz önce * a basıyorum ekrana 44 yazıyor sonra 5 tuşuna basıyorum ardından # e basıyorum sayıyı üretmiş oluyorum:)
sizi dediğiniz mantığı hala anlamış değilim. kod yolluyabilrmisniz?

justice_for_all

#11
valla bende sizin programinizdan bise anlamadim :) 44 ken 5 e basinca nasil 64 oluyo sayi hocam :)keypad_oku() fonksiyonunu gorursem kodu ona gore uydururum.

mesela ben ccsnin keypad driveri ile ornek bir kod yaziyorum...

char karakter[];
int8 sayac=0;
unsigned int16 sayi=0;

unsigned int hesapla(unsigned char* key,unsigned char uzunluk)
{

    static unsigned int temp=0;
    unsigned char i;
    unsigned int carpan=1;
    
    for(i=uzunluk;i>=1;i--)
    {
        temp+=(unsigned int)key[i-1]*carpan;
        carpan*=10;
    }
    
    return temp; 
}//
void main(void)
{
     do
     {
         if(kbd_getc( )!='\0')  //////herhangi bir tusa basildiysa
         {
             karakter[sayac]=kbd_getc( ); /// tus takimindan gelen karakteri dizinin ilgili elemanina ata
             sayac++;
          }
      }while(karakter[sayac]!='#'); //kare tusuna basilana kadar karakter al

      sayi=hesapla(karakter,sizeof(karakter)); ///karakter dizisinin eleman sayisini ve diziyi gondererek sayi uretilir..
 
      while(true)
      {

      }
          
}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

char keypad_oku() // Fonksiyon ismi
{

output_c(0x00); // D portu çıkışı sıfırlanıyor

output_high(sat1); // 1. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{ delay_ms(50); tus=1; }
if (input(sut2))   // 2. sütun okunuyor
{  delay_ms(50); tus=2; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(50); tus=3; }

output_low(sat1); // 1. satır lojik-0 yapılıyor

output_high(sat2); // 2. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{   delay_ms(50); tus=4;}
if (input(sut2))   // 2. sütun okunuyor
{   delay_ms(50); tus=5;}
if (input(sut3))   // 3. sütun okunuyor
{  delay_ms(50);  tus=6;}

output_low(sat2); // 2. satır lojik-0 yapılıyor

output_high(sat3); // 3. satır lojik-1 yapılıyor
if (input(sut1))   // 1. sütun okunuyor
{   delay_ms(50); tus=7;}
if (input(sut2))   // 2. sütun okunuyor
{   delay_ms(50); tus=8;}
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(50);  tus=9;}

output_low(sat3); // 3. satır lojik-0 yapılıyor

output_high(sat4); // 3. satır lojik-1 yapılıyor


if (input(sut1))   // 1. sütun okunuyor
{   delay_ms(50); tus=11; }
if (input(sut2))   // 2. sütun okunuyor
{  delay_ms(50); tus=0; }
if (input(sut3))   // 3. sütun okunuyor
{  delay_ms(50);  tus=12;}

output_low(sat4); // 3. satır lojik-0 yapılıyor
delay_ms(200);
return tus; // Fonksiyon "tus" değeri ile geri döner
}


keypad_oku bu ama orda 5 deilde 6 olucaktı:D yanlışlıkla 5 e basmışım:))

justice_for_all

hocam hic bir tusa basilmadi o zaman ne dondurecek peki :) bence hic bir tusa basilmadigi takdirde fonksiyon 0 dondursun yukarida verdigim kodu inceleyin biraz.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

onu zaten başta tanımladım. 0 dönüyor defaoult olarak.
şimdi soruyu toparlayayım:)
keypad_oku fonksiyonu benim tuşlarımı okuyor. fakat sorun surda başlıyor. ben 2 yada 3 haneli sayıları nasıl okutucam..