Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Pic ile basit hesap makinesi

Başlatan Recep METE, 26 Mayıs 2014, 11:26:18

Recep METE

Arkadaşlar pic 16f877 , lcd ve tuş takımı ile basit hesap makinesi yapmak istiyorum.Fazla c bilgim yok . C de yazılmış hesap makinesi örneklerini uyarlamada başarılı olamadım.Basit bir toplama ve çıkarma işlemi yaptırmak için aşağıdaki kodda nasıl bir ekleme yapmam lazım.Küçük bir örnek verir misiniz?

Kodlar alıntıdır.
#include <16f877a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

// 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(b) //Port yönlendirme komutları B portu için geçerli


#define LCD_ENABLE_PIN PIN_C4
#define LCD_RS_PIN     PIN_D2
#define LCD_RW_PIN     PIN_D3
#define LCD_DATA4      PIN_C5
#define LCD_DATA5      PIN_C6
#define LCD_DATA6      PIN_C7
#define LCD_DATA7      PIN_D4

#include <lcd.c>   // lcd.c dosyası tanıtılıyor

#define sut1   pin_b0 // sut1 ifadesi pin_d0 ifadesine eşitleniyor
#define sut2   pin_b1 // sut2 ifadesi pin_d1 ifadesine eşitleniyor
#define sut3   pin_b2 // sut3 ifadesi pin_d2 ifadesine eşitleniyor
#define sut4   pin_b3

#define sat1   pin_b4 // sat1 ifadesi pin_d4 ifadesine eşitleniyor
#define sat2   pin_b5 // sat2 ifadesi pin_d5 ifadesine eşitleniyor
#define sat3   pin_b6 // sat3 ifadesi pin_d6 ifadesine eşitleniyor
#define sat4   pin_b7 // sat4 ifadesi pin_d7 ifadesine eşitleniyor

int8 tus=0 , a=4 , tm=3 , i,imlec=7 ;
   
int32   sayi=0; // karakter tipinde değişken tanımlanıyor

//*********** Keypad Tarama Fonksiyonu *********
char keypad_oku()  
{
   output_d(0x00);  

   output_high(sat1);  
   if (input(sut1))    
      {delay_ms(50); while(input(sut1)); tus=1; sayi=sayi*10+tus; }
   if (input(sut2))    
      {delay_ms(50); while(input(sut2)); tus=2; sayi=sayi*10+tus; }
   if (input(sut3))    
      {delay_ms(50); while(input(sut3)); tus=3; sayi=sayi*10+tus; }
   if (input(sut4))   
      {delay_ms(50); while(input(sut4)); tus=0xA; }
   output_low(sat1);  

   output_high(sat2);  
   if (input(sut1))    
      { while(input(sut1)); tus=4; sayi=sayi*10+tus; }
   if (input(sut2))    
      { while(input(sut2)); tus=5; sayi=sayi*10+tus; }
   if (input(sut3))    
      { while(input(sut3)); tus=6; sayi=sayi*10+tus; }
   if (input(sut4))    
      { while(input(sut4)); tus=0xB; }
   output_low(sat2);  

   output_high(sat3);  
   if (input(sut1))    
      { while(input(sut1)); tus=7; sayi=sayi*10+tus; }
   if (input(sut2))    
      { while(input(sut2)); tus=8; sayi=sayi*10+tus; }
   if (input(sut3))    
      { while(input(sut3)); tus=9; sayi=sayi*10+tus; }
   if (input(sut4))    
      { while(input(sut4)); tus=0x0C; }
   output_low(sat3);  

   output_high(sat4); 
   if (input(sut1))    
      { while(input(sut1)); tus=0xE; }
   if (input(sut2))   
      { while(input(sut2)); tus=0; sayi=sayi*10+tus; }
   if (input(sut3))    
      { while(input(sut3)); tus=0xF; }
   if (input(sut4))    
      { while(input(sut4)); tus=0xD; }
   output_low(sat4); 

   return tus;  
}

//********** ANA PROGRAM FONKSİYONU*******

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı

   set_tris_b(0x0F);   
   

   lcd_init();   // LCD hazırlanıyor

   
   while(1) // Sonsuz döngü
   {
     keypad_oku();
     lcd_gotoxy(1,1);
     printf(lcd_putc,"tus=  ");
     lcd_gotoxy(1,1);
     printf(lcd_putc,"tus=%d",tus);
     lcd_gotoxy(1,2);
     printf(lcd_putc,"sayi= %ld",sayi);
     delay_ms(100);
     if(sayi>999999999)
       {  sayi=0;
       lcd_gotoxy(6,2);
       printf(lcd_putc,"           ");
      
       }
   }

}

printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Kabil ATICI

sayi1 ;
isaret  =0;

şeklinde değişken tanımla
Normal sayı giriş işlemelerini yaptın, artı veya eksiye bastığında
sayi1=sayi;
artı işaret için
isaret =1;
eksi sayı için
işaret =2; olsun

Bu noktada "=" tuşu basılana kadar sayıyı gir eşit tuşuna basıldığında

if (isaret==2)
{
sayi=sayi+sayi1;

isaret=0;
}
if (isaret==1)
{
sayi=sayi1-sayi;

isaret=0;
}


artık sonucuda sen göster
ambar7

Recep METE


Alıntı yapılan: ambar7 - 26 Mayıs 2014, 12:07:43
sayi1 ;
isaret  =0;

şeklinde değişken tanımla
Normal sayı giriş işlemelerini yaptın, artı veya eksiye bastığında
sayi1=sayi;
artı işaret için
isaret =1;
eksi sayı için
işaret =2; olsun

Bu noktada "=" tuşu basılana kadar sayıyı gir eşit tuşuna basıldığında

if (isaret==2)
{
sayi=sayi+sayi1;

isaret=0;
}
if (isaret==1)
{
sayi=sayi1-sayi;

isaret=0;
}


artık sonucuda sen göster

Hocam teşekkür ederim.Dediklerinizi uygulamaya çalışacağım.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

sifirzero

@Recep METE  ustam hesap makinasi yapabildinizmi. Bizimle paylaşirmisiniz
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Salih

#4

Tam sayılı işlem yapan örnek hesap makinesi.

#Include  <16F877.h>
#INCLUDE  <ctype.h>
#INCLUDE  <stdlib.h>
#Fuses XT
#Use Delay(clock=4M)
#Include <Lcd.c>


char Tus_Oku()
{      
      Output_High(Pin_B4);
      Output_High(Pin_B5);
      Output_High(Pin_B6); 
      Output_High(Pin_B7);
      Output_Low(Pin_B4);
      Delay_ms(1);
      if (!input(Pin_B0)) Return('7');
      if (!input(Pin_B1)) Return('4');
      if (!input(Pin_B2)) Return('1');
      if (!input(Pin_B3)) Return('C');
      Output_High(Pin_B4);
      Output_Low(Pin_B5);
      Delay_ms(1);
      if (!input(Pin_B0)) Return('8');
      if (!input(Pin_B1)) Return('5');
      if (!input(Pin_B2)) Return('2');
      if (!input(Pin_B3)) Return('0');
      Output_High(Pin_B5);
      Output_Low(Pin_B6);      
      Delay_ms(1);            
      if (!input(Pin_B0)) Return('9');
      if (!input(Pin_B1)) Return('6');
      if (!input(Pin_B2)) Return('3');
      if (!input(Pin_B3)) Return('=');
      Output_High(Pin_B6);
      Output_Low(Pin_B7);      
      Delay_ms(1);            
      if (!input(Pin_B0)) Return('/');
      if (!input(Pin_B1)) Return('*');
      if (!input(Pin_B2)) Return('-');
      if (!input(Pin_B3)) Return('+');
      Return(0);
}
#Define     Topla 1
#Define     Cikar 2
#Define     Carp  3
#Define     Bol   4


char tus,otus;
char satir1[17]={"Hesap Makinesi\0"},satir2[17]={"\0"};
int8 yaz=1,sayac=0,islem=0;
int16 say1,say2,son;
#Int_Timer1
void Timer1_Kesme()
{
   if (yaz)
   Printf(lcd_putc,"\f%s\n%s",satir1,satir2);
   yaz=0;
}
Void Main()
{
   Setup_psp(PSP_DISABLED);
   Setup_spi(SPI_SS_DISABLED);
   setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0,1);   
   Setup_adc_ports(NO_ANALOGS);
   Setup_adc(ADC_OFF);
   Setup_CCP1(CCP_OFF);
   Setup_CCP2(CCP_OFF);
   ENABLE_INTERRUPTS(Global);
   ENABLE_INTERRUPTS(INT_TIMER1);
   Port_B_Pullups(True);
   output_C(0);  
      
   Lcd_init();
   Delay_ms(10);
   //Printf(lcd_putc,"\fHesap Makinesi");
      While(True)
      {         
         tus = tus_oku();
         if ((tus!=otus)&&(tus))
         {
              if (isdigit(tus)) 
                  {
                     satir1[sayac]=tus;
                     satir1[sayac+1]=0;
                     if (sayac < 5 ) sayac++;
                  }
                  
                  if (isamong(tus,"+-/*"))
                     {
                       Switch(tus)
                       {
                        case '+' : islem = topla;break;
                        case '-' : islem = cikar;break;
                        case '*' : islem = carp;break;
                        case '/' : islem = bol;break;
                        default  :;                       
                       }
                        say1        = atol(satir1);
                        satir2[0]   = tus;
                        satir2[1]   = 0;
                        strcopy(satir1,"0\0");
                        sayac       = 0;                        
                     }
                  if  (tus=='=')
                     {
                       say2        = atol(satir1); 
                       if (islem==topla) son = say1 + say2;
                       if (islem==cikar) son = say1 - say2;
                       if (islem==carp)  son = say1 * say2;
                       if (islem==bol)   son = say1 / say2;
                       itoa(son,10,satir1);
                       strcopy(satir2,"=\0");
                     }
                    
                             if (tus=='C') 
                                 {
                                    strcpy(satir1,"0\0");
                                    sayac=0;
                                 }
              yaz=1;
         }
               delay_ms(10);
               otus=tus;
      }
}




https://www.dropbox.com/s/8io85e8q1boe09e/Hesap_Mak.JPG?dl=0

sifirzero

@Salih  çok teekkür ederim sizin yaptığınız bir çalışma mı ? günlerdir uğraşıyorum c kütüphaneleri neden kullandınız azcık açıklama yapabilir misiniz. yada kendim çözmeye çalışayım.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Salih

Alıntı yapılan: serkancetin - 23 Aralık 2017, 00:07:33
@Salih  çok teekkür ederim sizin yaptığınız bir çalışma mı ? günlerdir uğraşıyorum c kütüphaneleri neden kullandınız azcık açıklama yapabilir misiniz. yada kendim çözmeye çalışayım.


Evet, kendimin yazdığı programdır.
Eğer kendin anlamaya çabalarsan daha iyi öğrenirsin.
Yine de takıldığın yer olursa yardımcı olurum.


sifirzero

@Salih  ustam çok saolasın denedim çalışıyor. şimdi sıra anlamaya geldi :)
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

sifirzero

@Salih abi c dilini konuşturmuşsunuz. MaşAllah
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Salih

Alıntı yapılan: serkancetin - 24 Aralık 2017, 00:24:53
@Salih abi c dilini konuşturmuşsunuz. MaşAllah


Abarttığın kadar değil.
Yeni başladığın için sana öyle geliyor.
İlerledikçe bu program basit gelecek.

KısaDevre

Merhabalar konu açmıştım dün akşam ama hafta sonu olduğundan yöneticiler müsait değil herhalde benzer bir uygulama(keypad ile lcd ye veri alma) için sorumu buraya sorsam problem olur mu acaba çünkü mantık olarak aynı ?

sifirzero

Bu sitede olması gerekir. Serdar çiçek hocanin kitabindada mevcut sorduğunuz sorunun cevabı
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Salih

Alıntı yapılan: KısaDevre - 24 Aralık 2017, 15:58:47
Merhabalar konu açmıştım dün akşam ama hafta sonu olduğundan yöneticiler müsait değil herhalde benzer bir uygulama(keypad ile lcd ye veri alma) için sorumu buraya sorsam problem olur mu acaba çünkü mantık olarak aynı ?


Yukarıda verdiğim örnek programda keypad okuma algoritması var.
Ondan yararlanabilirsin.

Göktuğğ

@Salih Hocam iyi günler. Ben Pic16F877 ile hesap makinesi yapmak istiyorum ama elektronik olarak devre şemasını nasıl bağlayacagımı anlayamadım pek. Yazılım yönünden sıkıntı yaşayacağımı düşünmüyorum.Bana elektroniksel bağlantılar için yardım alabileceğim hazır bir fiziksel şema veya benzeri birşeyler konusunda yardımcı olur musunuz acaba? https://www.dropbox.com/s/8io85e8q1boe09e/Hesap_Mak.JPG?dl=0 bu lnkinize baktım ama bağlantıları anlayamadım pek. Tekrardan iyi günler hocam

   
     
   
         
                 
             
                     
                     

ibrahim96

Dosyaları ibrahimk0@hotmail.com yollayın detayları görüşelim