pcbway

C Keypad okumak.

Başlatan ibrahim626, 19 Ocak 2012, 23:03:54

ibrahim626

19 Ocak 2012, 23:03:54 Son düzenlenme: 19 Ocak 2012, 23:04:39 ibrahim626
Merhaba benım sorunum keypaddan okunan sayıyı isteğiğim gibi göremiyorum , rakamlar sorunsuz okunuyor fakat sayı da is saçmasapan sayılar çıkıyor , örneğin tustakımından 1-2-3 tusuna bastığımda rakamları okuyor fakat sayı değişkeninde 123 yerine çok farklı sayılar gösteriyor , SAYI=SAYI*10+TUS gibi bi mantık kullandm protonda ise yarıyor fakat C de çalışmıyor ? Kodlar :

#include <C:\\Documents and Settings\\İbrahim\\Desktop\\MASSAUSTU\\Chipset_Intel_v9.0.0.1011_XPx86_VISTAx86x64\\main.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#include <exlcd.c>

// Denetleyici konfigürasyon ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(d) //Port yönlendirme komutları D portu için geçerli


#define sut1   pin_c0 // sut1 ifadesi pin_c0 ifadesine eşitleniyor
#define sut2   pin_c1 // sut2 ifadesi pin_c1 ifadesine eşitleniyor
#define sut3   pin_c6 // sut3 ifadesi pin_c6 ifadesine eşitleniyor
#define sut4   pin_c7 // sut3 ifadesi pin_c7 ifadesine eşitleniyor

#define sat1   pin_c2 // sat1 ifadesi pin_c2 ifadesine eşitleniyor
#define sat2   pin_c3 // sat2 ifadesi pin_c3 ifadesine eşitleniyor
#define sat3   pin_c4 // sat3 ifadesi pin_c4 ifadesine eşitleniyor
#define sat4   pin_c5 // sat4 ifadesi pin_c5 ifadesine eşitleniyor

char tus=0; // karakter tipinde değişken tanımlanıyor
int sayi=0;
//*********** Keypad Tarama Fonksiyonu *********
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(20); tus=1; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=2; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=3; }
if (input(sut4))   // 4. sütun okunuyor
{ delay_ms(20); tus=0xA; }
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(20); tus=4; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=5; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=6; }
if (input(sut4))   // 4. sütun okunuyor
{ delay_ms(20); tus=0xB; }
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(20); tus=7; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=8; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=9; }
if (input(sut4))   // 4. sütun okunuyor
{delay_ms(20); tus=0x0C; }
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(20); tus=0xE; }
if (input(sut2))   // 2. sütun okunuyor
{ delay_ms(20); tus=0; }
if (input(sut3))   // 3. sütun okunuyor
{ delay_ms(20); tus=0xF; }
if (input(sut4))   // 4. sütun okunuyor
{delay_ms(20); tus=0xD; }
output_low(sat4); // 3. satır lojik-0 yapılıyor
sayi=sayi*10+tus;

return tus; // Fonksiyon "tus" değeri ile geri döner
}


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);


   // TODO: USER CODE!!
set_tris_b(0x00);   // B portu komple çıkış
set_tris_d(0x0F);   // Yüksek değerlikli 4 bit çıkış, düşük değerlikli 4 bit giriş
output_b(0x00); // İlk anda B portu çıkışı sıfırlanıyor

lcd_init();
printf(lcd_putc,\"\\f merhaba\\f\");
delay_ms(250);


while(1)  // Sonsuz döngü
{




keypad_oku();

lcd_gotoxy(2,1);
printf(lcd_putc,\"TUS=%u\",tus);
lcd_gotoxy(2,2);
printf(lcd_putc,\"\\n SAYI=%u\",sayi);
while((keypad_oku()==14)){
printf(lcd_putc,\"\\f\");
sayi=0;
tus=0;
delay_ms(10);
keypad_oku();
}
}


}

yazici67

Tuş okuma algoritması bana biraz karışık geldi. Daha basit hale getirilebilir. Sorun algoritmada olabilir. Ayrıca birlik onluk vs kısımları birleştirmede kullandığınız yöntem hatalı gibi geldi daha gelişmiş şekilde olabilir. Okunan değerler doğru olup yansımalar yanlış olduğuna göre farklı bir algoritma kullanılabilir.

ibrahim626

Daha farklı nasıl yapabilirim ?

ogoculu

tus değişkenini char olarak tanımlamışsın ama sayı işlemi yapmaya çalışıyorsun. tuş için unsigned int diyebilirsin yada değişkenden 0x30 çıkarabilirsin.

yazici67

Oops !!! @ogoculu haklı orayı görmemişim char olarak belirleyip int atmaya çalışıyorsun doğal olarak değişkene rakamın ANSI karşılığı atılıyor. CHAR kısmını \"unsigned int\" olarak belirlersen yeterli olur. Ayrıca daha stabil algoritmalar kullanılabilir.

ibrahim626

Serdar çiçek\'in kitabında char olarak tanımlanmıs , ben unsignet int olarak da denedim olmadı ?

yazici67

İşe yaramadıysa başka birşey gelmiyor aklıma... Farklı şekilde denemeler yapın kodu değiştirin vs...

hikko

merhaba!

örnek uygulama ekde, açık kodu yakında gönderirim...

hikko

MikroC ve PIC18F4550

#define klavye          PORTB
#define klavye_tris     TRISB
#define sutun3          RB0
#define sutun2          RB1
#define sutun1          RB2
#define satir1          RB3
#define satir2          RB4
#define kl_int          RB5

unsigned char key;

// LCD module baðlantýlarý
sbit LCD_RS at RD2_bit;
sbit LCD_EN at RD3_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD2_bit;
sbit LCD_EN_Direction at TRISD3_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
// End LCD module baðlantýlarý

void init()
{
   ADCON1 |= 0x0F;             // AN pinleri dijital I/O yapýlandýrýldý
   CMCON  |= 7;                // Comparators (karþýlaþtýrýcýlar) pasif edildi
   LCD_Init();                 // LCD display yapýlandýrýldý
   LCD_CMD(_LCD_CURSOR_OFF);
   LCD_OUT(1,1,\"Tusa basiniz!..\");
   LCD_CMD(_LCD_SECOND_ROW);
   klavye = 0;
   klavye_tris.sutun1 = 0;
   klavye_tris.sutun2 = 0;
   klavye_tris.sutun3 = 0;
   klavye_tris.satir1 = 1;
   klavye_tris.satir2 = 1;
   klavye_tris.kl_int = 1;
}

void sutun_tara (unsigned short sut1, unsigned short sut2, unsigned short sut3)
{
       klavye.sutun1 = sut1;
       klavye.sutun2 = sut2;
       klavye.sutun3 = sut3;
}

void tarama_yap(unsigned short sat1, unsigned short sat2, unsigned short sut1, unsigned short sut2, unsigned short sut3, char key_in)
{
      sutun_tara(sut1, sut2, sut3);
      while ((!klavye.kl_int) && (klavye.satir1 == sat1) && (klavye.satir2 == sat2))
      {
         LCD_Chr_Cp(key_in);
         key = key_in;
         sutun_tara(0, 0, 0);
         while (!klavye.kl_int);
      }
      sutun_tara(0, 0, 0);
}

void tus()
{
     tarama_yap(0, 0, 0, 1, 1, \'1\');
     tarama_yap(0, 0, 1, 0, 1, \'2\');
     tarama_yap(0, 0, 1, 1, 0, \'3\');
     tarama_yap(0, 1, 0, 1, 1, \'4\');
     tarama_yap(0, 1, 1, 0, 1, \'5\');
     tarama_yap(0, 1, 1, 1, 0, \'6\');
     tarama_yap(1, 0, 0, 1, 1, \'7\');
     tarama_yap(1, 0, 1, 0, 1, \'8\');
     tarama_yap(1, 0, 1, 1, 0, \'9\');
     tarama_yap(1, 1, 0, 1, 1, \'*\');
     tarama_yap(1, 1, 1, 0, 1, \'0\');
     tarama_yap(1, 1, 1, 1, 0, \'#\');
}

void main() {
   init();
   while(1)
   {
       sutun_tara(0, 0, 0);
       while (!klavye.kl_int) tus();
   }
}

kalemim_3460

Ben devremde keypad kullanacağım ve keypad algoritması lazım  bana yardım edebilirmisinz

yazici67

Kullanacağın keypad için CCS C de sürücü vardır.Buradaki algoritma sadece istenen değerleri vermesi için yazıldı.Eğer istersen ( uygulaman için ) özel tuş kodları gerekiyorsa yazabilir(im/sin).