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.

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.
Bende denedim gercekten cok basarili bir calisma olmus tavsiyeleriniz cok isime yaradi basarilarinizin devamini dilerim benimde bazi fikirlerim var paylasmak isterim izniniz olursa
YanıtlaSilTabi memnun olurum.Fikirlerinizi sntrkylnz@gmail.com mail adresinden bana ulaştırabilirsiniz.İlginize teşekür ederim.Size de başarılar dilerim.
YanıtlaSiltuşların isiste adları nasıl acaba sorabilirmiyim?
YanıtlaSil(pin_a0) ---> "0"
YanıtlaSil(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.
hocam hangi derleyiciyi kullandınız tam ismi lazım. ccs picc rom size hatası veriyor
YanıtlaSilMalzemeler ve baskı devresi yok hocam
YanıtlaSilMalzemeler: buton, 10K direnç, LCD 12x6, pot 10K, kristal 20MHz, 22pF kondansatör, 7805.
YanıtlaSilBaskı devresi mevcut değildir.
bu projeyi bana satarmısınız...bitirme ödevim için??
Silben 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ıtlaSiliyi 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ıtlaSilbir çözüm bulabildiniz mi acaba
Silgerçekten çok güzel bir program olmuş, buna ek olarak sin ve cos hesabını nasıl ekleyebiliriz??
YanıtlaSil