pic c lcd ve keypad

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

justice_for_all

hocam mesela kare tusuna basana kadar istediğiniz basamaklı girebilirsiniz kare tusuna bastıktan sonra sayınız uretilir.benim verdiğim kodda bu iş yapılıyor.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

anlıyorum hocam sizin mantığı fakat benim sorunum şöyleki.
keypad_oku tuşu hep değer döndürdüğü için sizin verdiğiniz kodda dizmin elemanları 55555555 444444 gibi tekrar ederek alıcak ve böylece sonsuz döngüye giricek. bir tuşu basmamla kesicek ve sadece o sayıyı vericek bi kod lazım:S

justice_for_all

hangi entegreyle yaptiginizi bilmedigim icin 16f877a ile bir ornek yaptim calisiyor sadece entegrenizi degistirin veya kodu kopyalayin

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use fast_io(B)

#define sat1 pin_b0
#define sat2 pin_b1
#define sat3 pin_b2
#define sat4 pin_b3

#define sut1 pin_b4
#define sut2 pin_b5
#define sut3 pin_b6


#define use_portb_kbd

char keypad_oku();

#include <LCD.C>
#include <KBD.C>
#int_RTCC
void  RTCC_isr(void) 
{

}

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

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

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

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   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);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   output_b(0xF0);
   set_tris_b(0b01110000);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   //printf(lcd_putc,"hosgeldiniz!!!");
   do
   {
	 keytemp=keypad_oku();
         if(keytemp!='\0')  //////herhangi bir tusa basildiysa
         {
	         karakter[sayac]=keytemp-48; 
                 printf(lcd_putc,"*");
                 sayac++;
             
          }
    }while(keytemp!='#'); //kare tusuna basilana kadar karakter al

    sayi=hesapla(karakter,sayac-1); ///karakter dizisinin eleman sayisini ve diziyi gondererek sayi uretilir..

    printf(lcd_putc,"\f%LU",sayi);

    while(true)
    {

    }

}

char keypad_oku() // Fonksiyon ismi
{
	char tus;
	
	tus='\0';
	
	delay_ms(100);
      
      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='*';
      }
      if (input(sut2))   // 2. sütun okunuyor
      {  
         delay_ms(50);
         tus='0';
         
      }
      if (input(sut3))   // 3. sütun okunuyor
      {  
         delay_ms(50);
         tus='#';
      }
      
      output_low(sat4); // 3. satır lojik-0 yapılıyor
      delay_ms(200);
      
      return tus; // Fonksiyon "tus" değeri ile geri döner
}
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

tşkler 16f877 kullanıyorum lakin clock hızı 20k ben 4 k yapsam yine değişen bişey olurmu?

skara1214

fuseslarda hs yi xt yapacaksın ve #use delay(clock=20000000) 20000000 yerine 4M yazacaksın
Herkes ölür ama herkes gerçekten yaşamaz

harmek

yok yani tuşlarda atlama yada lcd de sorun olurmu manasında sordum:)

justice_for_all

sorun olmaz delay_ms lerin zaten senin clock diye verdiğin sayıya göre işlem yapıyor ama yukarıda denildiği gibi #fuses osc= xt yazman gerek devrede ise 4mhz kristal kullanmalısın.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

harmek

#22
uygulmayı çalıştırdım fakat 2. bi rakam okumaya çalıştığımda yazmıyor. sanırsam içerdeki sayi değişkenini sıfırlamak gerekiyor. sıfıra eşitliyorum ama işe yaramıyorum. atom hesapla die bi fonksiyon yazdım. fonksiyon program ilk çalıştığında algılıyor ama 2. cide algılamıyor..

fuzulidark

Alıntı yapılan: justice_for_all - 11 Ocak 2012, 21:25:54
hangi entegreyle yaptiginizi bilmedigim icin 16f877a ile bir ornek yaptim calisiyor sadece entegrenizi degistirin veya kodu kopyalayin

#include <16F877A.h>
#device adc=8

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected
#FUSES RESERVED                 //Used to set the reserved FUSE bits

#use delay(clock=20000000)
#use fast_io(B)

#define sat1 pin_b0
#define sat2 pin_b1
#define sat3 pin_b2
#define sat4 pin_b3

#define sut1 pin_b4
#define sut2 pin_b5
#define sut3 pin_b6


#define use_portb_kbd

char keypad_oku();

#include <LCD.C>
#include <KBD.C>
#int_RTCC
void  RTCC_isr(void) 
{

}

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

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

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

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   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);
   setup_ccp1(CCP_OFF);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   lcd_init();
   output_b(0xF0);
   set_tris_b(0b01110000);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   //printf(lcd_putc,"hosgeldiniz!!!");
   do
   {
	 keytemp=keypad_oku();
         if(keytemp!='\0')  //////herhangi bir tusa basildiysa
         {
	         karakter[sayac]=keytemp-48; 
                 printf(lcd_putc,"*");
                 sayac++;
             
          }
    }while(keytemp!='#'); //kare tusuna basilana kadar karakter al

    sayi=hesapla(karakter,sayac-1); ///karakter dizisinin eleman sayisini ve diziyi gondererek sayi uretilir..

    printf(lcd_putc,"\f%LU",sayi);

    while(true)
    {

    }

}

char keypad_oku() // Fonksiyon ismi
{
	char tus;
	
	tus='\0';
	
	delay_ms(100);
      
      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='*';
      }
      if (input(sut2))   // 2. sütun okunuyor
      {  
         delay_ms(50);
         tus='0';
         
      }
      if (input(sut3))   // 3. sütun okunuyor
      {  
         delay_ms(50);
         tus='#';
      }
      
      output_low(sat4); // 3. satır lojik-0 yapılıyor
      delay_ms(200);
      
      return tus; // Fonksiyon "tus" değeri ile geri döner
}


bu kodu kendi programima uygulamaya calistim fakat duzgun calismiyor. Bu islerde yeniyim belkide ondan yapamiyorum ama, program sadece 1 kez sayi aliyor aldigi sayiyida duzgun olarak gostermiyor. kodlar;
#include<16f877.h>



#fuses XT, NOWDT, NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT, NODEBUG,NOCPD

#use delay (clock=4000000)

#use fast_io(b)
#use fast_io(d)

#define use_portb_lcd TRUE

#define use_portd_kbd

#include <lcd.c>
#include <kbd.c>

#define sut1 pin_d0
#define sut2 pin_d1
#define sut3 pin_d2

#define sat1 pin_d4
#define sat2 pin_d5
#define sat3 pin_d6
#define sat4 pin_d7


#int_RTCC
void RTCC_isr(void)
{

}

char karakter[5];
char keytemp;
int sayac=0;
unsigned int16 sayi=0;
unsigned int16 hesapla(unsigned char* key,unsigned char uzunluk)
{

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

char tus=0;

char keypad_oku()
{
output_d(0x00);
tus='\0';
delay_ms(100);

output_high(sat1);
if(input(sut1))
   { delay_ms(20); tus='1';} 
if(input(sut2))
   {delay_ms(20); tus='2';}
if(input(sut3))
   {delay_ms(20); tus='3';}
output_low(sat1);

output_high(sat2);
if(input(sut1))
   {delay_ms(20); tus='4';}
if(input(sut2))
   {delay_ms(20); tus='5';}
if(input(sut3))
   {delay_ms(20); tus='6';}
output_low(sat2);

output_high(sat3);
if(input(sut1))
   {delay_ms(20); tus='7';}
if(input(sut2))
   {delay_ms(20); tus='8';}
if(input(sut3))
   {delay_ms(20); tus='9';}
output_low(sat3);

output_high(sat4);
if(input(sut1))
   {delay_ms(20); tus='*';}
if(input(sut2))
   {delay_ms(20); tus='0';}
if(input(sut3))
   {delay_ms(20); tus='#';}
output_low(sat4);

return tus;
    }
    
void main ()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_b(0x01);
set_tris_d(0x0f);

lcd_init();

enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
printf(lcd_putc,"\f MERHABA");

while(1)
{
do
{
keytemp=keypad_oku();
   
if(keytemp!='\0')
{
karakter[sayac]=keytemp-48;
   printf(lcd_putc,"*");
   sayac++;
}
}while(keytemp!='#');
sayi=hesapla(karakter,sayac-1);
printf(lcd_putc,"\f%LU",sayi);
   
   while(true)
   {
   }
}
}


bende ayni sekilde 5 basamakli veya daha az basamakli bir sayi girip bunu ekranda gormek istiyorum. hatta mumkunse tusa basar basmaz ekranda gormek istiyorum nasil yapabilirim yardimci olurmusunuz?

harmek

ben en son o işi sayıyı aldırıp sonra reset atma işi ile yaptım. yani sayıyı bi kere okuyor. sonra işlemimi yapıyorum sonra ise pic e reset atıyorum:)

halilgalic

#25
ben söyle yapmıştım her bir tuşa  bastıgımda bir değişkeni arttırıyorum ve bu değişkenlede dizi değişkenin dizinini arttırıyorum.örnek vermek gerekirse ilk olarak keypad te 4 bastım i++;   sayi (i)=4 sonra, keypad de 2 ye bastım i++; sayi (i)=2 .vermiş oldugum dosyada 4 tane sayı girilip # basıldığında 4 sayının toplamını veren bir örnek var yararı olması dileğiyle...   
http://www.dosya.tc/server20/qYVYfR/key_pad.rar.html

harmek

baya geç oldu ama teşekkürler dostum:)

cooldesire

"halilgalic" kardeş
tekrar upload etmen imkanın var mı acaba...