4 Temmuz 2013 Perşembe

16F877A MİKRODENETLEYİCİ İLE YAPILMIŞ HESAPMAKİNESİ

  Merhaba arkadaşlar yayınladığım ilk projede PIC16F877A ile yapılmış beş farklı işlem yapabilen hesapmakinesini sizlerle paylaşacağım.Hesapmakinesinin kodlarını c pic programlama diliyle yazdım.
Hesapmakinesinin ekranı 2x16 karakter LCD ile yapılmıştır.


Lcd ekranın pin bağlantıları aşağıdaki gibidir.Datasheetinede bakarak detaylı bilgi bulabilirsiniz.


                       

  Hesapmakinesi beş farklı işlem yapabilmekte ve yaptığı bir işlemin sonucunu hafızaya alarak,hafızadaki bu değerin üzerine yeni bir işlem yapabilmektedir.Hesap makinesinin tuşları pic16f877a'nın belirli portlarına buttonlar bağlanarak yapılmıştır.Button basıldığında belirlili pine/pinlere 5V-lojik 1 gitmekdedir, basılmadığında ise 0V-lojik 0 gitmekdedir.Bu pinlere button yolu ile giden lojik bilgiler 16f877a tarafından değerlendirilerek çıkışta belirli işlemler gerçekleştirilir.Bu işlemler tabiki lcd ekrana rakamlar,aritmetk semboller yazdırmak ve sonucu 2.satıra yazdırmak olacaktır.
 Şimdi devremizin isis şemasına bakalım.İsisde Pıc16F877A ,2x16lcd(LM016L),button,buttonlara bağlı 10K ohm dirençler,13 ve 14 osc pinleri için 22pF kondansatör ve 20MHz kristal,lcdnin 3 pini olan kontrast  ayarı için 5K ohm potansiyometre kullanılmıştır.Genel olarak isis devresi aşağıdaki gibidir.



Şimdide ccs c de yazdığım hesapmakinesinin kodlarına bakalım.
////////
#include "C:\Documents and Settings\İlçin\Desktop\düzhes\düzhes.h"
#include <lcd.c>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>


void main()
{
int i,k=0,l,t,z,z1,x,y,n,ek,esk,at,cp,bk,uk,p,ask;
int d1=1,c1=0,d2,c2=0,d11=0,c11=0,d12,c12=0,sayici=0,aart=0;
int aeks=0,abol=0,acarp=0,aus=0,anokta=0;
int d13=0,c13=0,d14,c14=0,d15=0,c15=0,d16,c16=0,d17=0,c17=0,d18,c18=0,d19=0,c19=0,d20,c20=0;
char ifade[20],say1[20],say2[20];
float sonuc;

   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);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);

set_tris_a(0xFF);
set_tris_b(0xFF);
set_tris_c(0xFF);
set_tris_e(0xFF);
set_tris_d(0x00);
 
 lcd_init();
 lcd_gotoxy(1,1);
 lcd_send_byte(0,0x0d);
while(1){
if(input(pin_a0)){printf(lcd_putc,"0");    delay_ms(300);}
if(input(pin_a1)){printf(lcd_putc,"1");    delay_ms(300);}
if(input(pin_a2)){printf(lcd_putc,"2");    delay_ms(300);}
if(input(pin_a3)){printf(lcd_putc,"3");    delay_ms(300);}
if(input(pin_a4)){printf(lcd_putc,"4");    delay_ms(300);}
if(input(pin_a5)){printf(lcd_putc,"5");    delay_ms(300);}
if(input(pin_e0)){printf(lcd_putc,"6");    delay_ms(300);}
if(input(pin_e1)){printf(lcd_putc,"7");    delay_ms(300);}
if(input(pin_e2)){printf(lcd_putc,"8");    delay_ms(300);}
if(input(pin_b0)){printf(lcd_putc,"9");    delay_ms(300);}
if(input(pin_b1)){printf(lcd_putc,"+");    delay_ms(300);}
if(input(pin_b2)){printf(lcd_putc,"-");    delay_ms(300);}
if(input(pin_b3)){printf(lcd_putc,"*");    delay_ms(300);}
if(input(pin_b4)){printf(lcd_putc,"/");    delay_ms(300);}
if(input(pin_b5)){printf(lcd_putc,"^");    delay_ms(300);}
if(input(pin_b6)){printf(lcd_putc,".");    delay_ms(300);}
if(input(pin_c1)){bas:{
at=0;cp=0;uk=0;bk=0;ek=0;esk=0;ask=0;
k=0;aeks=0;abol=0;acarp=0;aus=0;anokta=0;aart=0;
c1=0;c2=0;c11=0;c12=0;c13=0;c14=0;c15=0;c16=0;c17=0;c18=0;c19=0;c20=0;                                                                                                                                                                                                           
for(p=0;p<20;p++){ifade[p]=' ';say1[p]=' ';say2[p]=' ';}
lcd_send_byte(0,0x01);  delay_ms(300);}}
if(input(pin_c0)){
at=0;cp=0;uk=0;bk=0;ek=0;esk=0;ask=0;
k=0;aeks=0;abol=0;acarp=0;aus=0;anokta=0;aart=0;
c1=0;c2=0;c11=0;c12=0;c13=0;c14=0;c15=0;c16=0;c17=0;c18=0;c19=0;c20=0;                                                                                                                                                                                                           
for(p=0;p<20;p++){ifade[p]=' ';say1[p]=' ';say2[p]=' ';}
   printf(lcd_putc,"\f%.3f",sonuc);    delay_ms(300);  }
if(input(pin_b7)){
for(i=1;i<=16;i++){
        ifade[k]=lcd_getc(i,1);
        k++;} //printf(lcd_putc,"\n%s",ifade);    delay_ms(300);
        for(sayici=0;sayici<=16;sayici++){ if(ifade[sayici]=='+') aart+=1;
                                      if(ifade[sayici]=='-') aeks+=1;
                                      if(ifade[sayici]=='/') abol+=1;
                                      if(ifade[sayici]=='*') acarp+=1;
                                      if(ifade[sayici]=='^') aus+=1;
                                      if(ifade[sayici]=='.') anokta+=1;
          }
        for(l=0;l<=16;l++){
          if(ifade[l]=='-') ek=l; if(ifade[l]=='-') break; } 
        for(t=ek;t<=16;t++){if(ifade[t]=='-') esk=t;}
        for(z=0;z<=16;z++){
        if(ifade[z]=='+') at=z; if(ifade[z]=='+') break;} 
        for(z1=at;z1<=16;z1++){if(ifade[z1]=='+') ask=z1;}
        for(x=0;x<=16;x++){ if(ifade[x]=='*') cp=x;
        }
        for(y=0;y<=16;y++){if(ifade[y]=='/') bk=y;
        }
        for(n=0;n<=16;n++){if(ifade[n]=='^') uk=n;
        }
if((bk>0&&cp>0)||(bk>0&&uk>0)||(cp>0&&uk>0)||(esk-ek==1)||(ask-at==1)||aart>2||aeks>2||acarp>1||abol>1||aus>1||anokta>2||(ifade[0]=='*')||(ifade[0]=='/')){
      printf(lcd_putc,"\fhatali dizim"); delay_ms(500); goto bas;}
else if((ek>0&&ek<cp)||(at>0&&at<cp)||(ek>0&&ek<uk)||(at>0&&at<bk)||(ek>0&&ek<bk)||(at>0&&at<uk)||(ek>0&&esk>ek)||(at>0&&ask>at)||(at>0&&ek>at)||(ifade[0]=='^')){
      printf(lcd_putc,"\fhatali dizim"); delay_ms(500); goto bas;}
else if((cp>0&&((esk>cp&&esk-cp>1)||(ask>cp&&ask-cp>1)))||(uk>0&&((esk>uk&&esk-uk>1)||(ask>uk&&ask-uk>1)))||(bk>0&&((esk>bk&&esk-bk>1)||(ask>bk&&ask-bk>1)))){
      printf(lcd_putc,"\fhatali dizim"); delay_ms(500); goto bas;}
   
   else if(uk!=0){
        for(d19=0;d19<uk;d19++){ say1[c19]=ifade[d19]; c19++;}
        for(d20=uk;d20<16;d20++){ say2[c20]=ifade[d20+1]; c20++; }
        sonuc=pow(atof(say1),atof(say2));} 
    else if(cp!=0){
        for(d17=0;d17<cp;d17++){ say1[c17]=ifade[d17]; c17++;}
        for(d18=cp;d18<16;d18++){ say2[c18]=ifade[d18+1]; c18++; }
        sonuc=atof(say1)*atof(say2);}
   else if(bk!=0){
        for(d15=0;d15<bk;d15++){say1[c15]=ifade[d15]; c15++;}
        for(d16=bk;d16<16;d16++){say2[c16]=ifade[d16+1]; c16++; }
       sonuc=atof(say1)/atof(say2); }
   else if(at!=0){
        for(d11=0;d11<at;d11++){
        say1[c11]=ifade[d11]; c11++;}
        for(d12=at;d12<16;d12++){
        say2[c12]=ifade[d12+1]; c12++; }
       sonuc=atof(say1)+atof(say2);}
   else   if((ek==0)&&(esk!=ek)){
        for(d1=1;d1<esk;d1++){
       say1[c1]=ifade[d1]; c1++;} 
        for(d2=esk;d2<16;d2++){
        say2[c2]=ifade[d2+1]; c2++;} 
        sonuc=-(atof(say1)+atof(say2));}
   else if(ek!=0){
         for(d13=0;d13<ek;d13++){say1[c13]=ifade[d13]; c13++;}
        for(d14=ek;d14<16;d14++){say2[c14]=ifade[d14+1]; c14++; }
       sonuc=atof(say1)-atof(say2); } 
  else if(ek==0&&esk==0&&uk==0&&cp==0&&bk==0&&at==0){
  sonuc=atof(ifade);}
    printf(lcd_putc,"\n%.3f",sonuc); delay_ms(300); }
}
}
//////////
Programı biraz incelerseniz algoritmayı kısa sürede anlayabilirsiniz. 
Hesap makinesinin son olarak bitmiş hali aşağıdaki video ve resimlerdeki  gibidir.


Başarılar dilerim kolay gelsin.

13 yorum:

  1. Bende denedim gercekten cok basarili bir calisma olmus tavsiyeleriniz cok isime yaradi basarilarinizin devamini dilerim benimde bazi fikirlerim var paylasmak isterim izniniz olursa

    YanıtlaSil
  2. Tabi memnun olurum.Fikirlerinizi sntrkylnz@gmail.com mail adresinden bana ulaştırabilirsiniz.İlginize teşekür ederim.Size de başarılar dilerim.

    YanıtlaSil
  3. tuşların isiste adları nasıl acaba sorabilirmiyim?

    YanıtlaSil
  4. (pin_a0) ---> "0"
    (pin_a1) ---> "1"
    pin_a2) --->"2"
    (pin_a3) --->"3"
    (pin_a4)"--->"4"
    (pin_a5)--->"5"
    (pin_e0)--->"6"
    (pin_e1)--->"7"
    (pin_e2)--->"8"
    (pin_b0)--->"9"
    (pin_b1)--->"+"
    (pin_b2)--->"-"
    (pin_b3)--->"*"
    (pin_b4)--->"/"
    (pin_b5)--->"^"
    (pin_b6)--->"."
    Programda da if ler ile butonlara basınca lcd ye ne yazdırılacağı yer almaktadır.

    YanıtlaSil
  5. hocam hangi derleyiciyi kullandınız tam ismi lazım. ccs picc rom size hatası veriyor

    YanıtlaSil
  6. Malzemeler ve baskı devresi yok hocam

    YanıtlaSil
  7. Malzemeler: buton, 10K direnç, LCD 12x6, pot 10K, kristal 20MHz, 22pF kondansatör, 7805.
    Baskı devresi mevcut değildir.

    YanıtlaSil
    Yanıtlar
    1. bu projeyi bana satarmısınız...bitirme ödevim için??

      Sil
  8. hex dosyasını paylaşma şansınız varmıdır

    YanıtlaSil
  9. ben mplab üzerinden kodu yazarak yapmaya çalışıyorum şuan algoritmayı kısmen çıkardım fakat işlem butonuna bastıktan sonra 2. sayıyı nasıl isteyeceğim onu bulamadım mantıkta yardımcı olabilir misiniz. lcd ile değil 4lü 7segment display ile yapıyorum.

    YanıtlaSil
  10. iyi akşamlar projenizde var olan bu #include "C:\Documents and Settings\İlçin\Desktop\düzhes\düzhes.h" kütüphane nedir acaba acıklama imkanınız varmı ve yaptığınız uygulamayı bizde yapmaya çalışiyoruz devre tamamen aynı fakat kod kısmında hata veriyor lcd ile alakalı acaba bu kütüphaneden dolayımı?

    YanıtlaSil
  11. gerçekten çok güzel bir program olmuş, buna ek olarak sin ve cos hesabını nasıl ekleyebiliriz??

    YanıtlaSil