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," ");
}
}
}
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
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.
@Recep METE ustam hesap makinasi yapabildinizmi. Bizimle paylaşirmisiniz
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)
https://www.dropbox.com/s/8io85e8q1boe09e/Hesap_Mak.JPG?dl=0 (https://www.dropbox.com/s/8io85e8q1boe09e/Hesap_Mak.JPG?dl=0)
@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.
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.
@Salih ustam çok saolasın denedim çalışıyor. şimdi sıra anlamaya geldi :)
@Salih abi c dilini konuşturmuşsunuz. MaşAllah
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.
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ı ?
Bu sitede olması gerekir. Serdar çiçek hocanin kitabindada mevcut sorduğunuz sorunun cevabı
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.
@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
Dosyaları ibrahimk0@hotmail.com yollayın detayları görüşelim