8051 ile 2X16 Lcd Göstergeli Hesap Makinası

| Mayıs 21, 2023 Tarihinde güncellendi
8051 ile 2X16 Lcd Göstergeli Hesap Makinası

Devrenin Çalışması Devrede görüldüğü gibi 1 tuş takımı ve bir LCD kullanımı vardır 8051 ile. Tuş takımı satır ve sütunlardan oluşmaktadır. Butona basıldığında belli tuşlar birleşerek işlem görür. Örneğin 1 basılması için 1.satır 1.sütun dadır ve 1-5 birleştirilmelidir. Bir sütun yada satıra birden fazla buton bağlandığından hangi butona basıldığını tespit etmek için öncelikle 1.sütuna 0 diğerlerine 1 uygulayarak hangi satıra 0 değerinin buton üzerinden ulaştığının belirlenmesi gerekir.

PCBway Türkiye PCB Manufacturer PCB Assembly

Hesap Makinası isis Devre Şeması

Daha sonra aynı işlem 2. ve 3.cü sütunlar için uygulanırki hangi butona basıldığı belli olsun. Devrede tuş takımı P2 portuna bağlanmıştır. İlk 4 pine sütunlar sonraki pinlerede satırlar bağlanmıştır. Tuştakımından gelen veriyi mikrodenetleyici hex kodu sayesinde işler ve görüntülenmesi için LCD ye aktarır.

LCD 2×16 lıktır. 2sütun ve 16satırdan oluşur. Çok düşük güç harcaması sebebiyle elektronik devrelerde çıkış katlarında genellikle kullanılır. Bizim devremizde de zaten çıkış ünitesinde kullanılmıştır. 1Nolu ucuna toprak 2ye +Vcc 3Kontrast 4-seçici uç 5-okuma yazma ucu 6-yetkilendirme 7..14 arasıda veri yolarıdır. İşte tuş takımından mikro denetleyiciye oradanda işlenerek LCd ye gelen veriler bu uçlar sayesinde görütülenir. Devrenin çalışması bu şekildedir.

Malzeme Listesi

  • AT89C51RD2 (8051)
  • 2 adet kondansatör 33pf
  • OSC 12MHz
  • Keypad
  • 2*16 LCD

C Programı

/********************************************************************

 Fatih Yıldırım
  000303005
 ELEKTRONIK OGRETMENLIGI 4 GECE
 PROGRAM DENETLEYICILER DERSI LAB. ODEVI
 KONU: 8051 ile HESAP MAKINESI
C KODLARI
*******************************************************************/  
  
 

#define sil 1
#define solayaz 4
#define sagayaz 6
#define kursorgizle 12
#define displaykapat 8
#define birincisatir 128
#define ciftsatir4bit 48

//tus takimi tanimlamalari
#define sut1 P2_0
#define sut2 P2_1
#define sut3 P2_2
#define sut4 P2_3
#define sata P2_4
#define satb P2_5
#define satc P2_6
#define satd P2_7

//cikis tanimlamalari
#define Data P1
#define rs P3_4
#define rw P3_1
#define en P3_0

#define maks_karakter 10
  
  
enum ERROR { OK = 0,  HATA = 2};  
  
void tanitim(); // Fatih Yıldırım yzisinin LCD ye yazildigi islev

void hesap_basla(); //hesap makinesi calismaya baslar
 
char tustakimi_tara (void);  
 
void hesap_format (float f); 
void hesap_yaz (char *buf);  //hesaplama sonuclarini LCD ekranina basmak icin kullanilan islev 
 
void hesap_islev (char token);  //matematik islemlerinin yapildigi islev 
  
signed char  rakam_test  (char ch); //tus takimindan girilen karakterin rakam mi? nokta mi? islem operatoru mu? oldugunu belirleyen islev
 
void ekranitemizle(void); //LCD'yi temizler.

void Datakomut(int komut); //LCD'ye komut yazdirmak icin RS ve EN girislerini ayarlar.
 
void Dataveri(char veri); //LCD'ye karakter yazdirmak icin RS ve EN girislerini ayarlar.

void Datayaz(char veri);
 
void lcdkur(void); //LCD'yi kullanima hazirlayan islev

void gecikme(long int sure); //geciktirme islevi

char tus(void); //tus takimi kontrolunun yapildigi islev


//Program  Kısmı

#include <89c51rd2.H>
#include "hesap.h"
#include "stdio.h"
#include "math.h"
#include "stdlib.h"

//Genel degiskenler
static float sondeger;
static float yenideger;
static char sonislem;

void main (void)
//Degiskenler kurulur ve LCD icin kurulum islevi cagirilir.
 { lcdkur();
tanitim();
hesap_basla();
 }
void hesap_basla()
 { char sayi[maks_karakter+1], rakam;
signed char pos;
float k;

// statik degerlerin baslangic degeri atandi:
sondeger = 0;
yenideger = 0;
sonislem = 0;

// Display acildiginda ekranda ilk olarak 0 gozukmesi icin. 
hesap_format(0);

// Baslamadan once sayi dizisi (buf) temizlenir.
pos = 0;

for (;;)
 { rakam = tustakimi_tara();
if (rakam_test(rakam))
 { // rakamin + olup olmadigi test edilir buf dizisine kaydedilir
 // ve LCD'ye yazilir.
 // Sayinin boyutu en fazla 8 dir.
// eger sonuc - ise onune - isareti konmasi icin dizide bosluk birakilir.
if (pos != maks_karakter - 2)
 { sayi[pos++] = rakam;
sayi[pos] = 0;
hesap_yaz(sayi);
 }
 }
else 
 {  //sondeger saklanir, eger yeni bir islem secilirse 
 // saklanan sayi ile islem yapilir.
if (pos != 0)
 { k = atof(sayi); 
	/////*********sayi string bilgisi double tipinde cift duyarli bir sayiya donusturulur *********/////
if (sonislem == 0)
sondeger = k;
else
yenideger = k;
 }

// sayi dizisi sifirlanir.
pos = 0;

//sonislem degiskeninde en son secilen islem operatoru saklanir ve komut islenir
if (sonislem != 0)
hesap_islev(sonislem);  
if (rakam != '=')
sonislem = rakam;
else 
sonislem = 0;  
 }
 }
 }

void hesap_islev (char token)
// Islemler yerine getirilir. "sondeger", "sonuc" degiskeninde tutulur ve 
//ardisik islemler icin tuslar test edilir.
 { signed char sonuc = OK;
switch (token)
 { case '+' : sondeger += yenideger; break;
case '-' : sondeger -= yenideger; break;
case '*' : sondeger *= yenideger; break;
case '/' : 
if (yenideger != 0) 
sondeger /= yenideger;
else
sonuc = HATA;
break;
  }

if (sonuc == OK)
hesap_format(sondeger);
else if (sonuc == HATA)
hesap_yaz("*BOLME HATASI*"); 
 }

 
/****
*********************  Yardimci programlar*********************
*****/

void hesap_format (float f)
 { 
char buf [maks_karakter+1];
float bolen = 100000000;
float l;
signed char boy=0, p=0;

// isaret arti mi? eksi mi?
if (f >= 0)
buf[p++] = ' ';
else
 { buf[p++] = '-';
f = -f;
 }

if (f >= bolen) //eger hesaplanan islemin sonucu 100000000 den buyukse hata veririr.
buf[p++] = 'E';
else
while (p < maks_karakter && (bolen > 1 || f >= 0.0000001))
 { bolen /= 10;
l = floor(f/bolen); //sonuc basamaklarina ayrilir.
if (bolen < 1 && bolen > 0.01) //sayinin varsa noktali kismi belirlenir 
buf[p++] = '.';
if (l != 0 || bolen < 10)//LCD ye gonderilecek karakterler sirasiyle diziye aktarilir.  
 { buf[p++] = l + '0';//
boy = 1;  //
 }
else if (boy)
buf[p++] = '0';
f -= l*bolen;
 }
buf[p] = 0;  
hesap_yaz(buf);
 }

signed char rakam_test (char rakam) 
//tus takiminden girilen hane bir rakam,nokta veya islem operatoru olabilir. 
//Eger 1 donuyorsa rakam veya nokta , 0 ise islem operatoru 
 { if ((rakam == '.')|| ((rakam >= '0') && (rakam <= '9')))
return 1;
else
return 0;
 }

/****
******************  giris/cikis programlari  **************
****/

char tustakimi_tara (void)
{ char key;
  while ((key = tus()) == 0x00)
  /* 0 ise tekrar tara */;
  return key;
 }

void hesap_yaz (char *buf)
// Islemin sonucu ekrana basilir. 
 { signed char i;
ekranitemizle(); // Once ekran temizlenir.
for (i=0 ; buf[i] != 0; i++)
 { Dataveri(buf[i]); } 
}


/***********
****************** giris/ cikis yardimci programlar  ******************
******/
void tanitim()
{
char ad[]="FATIH  ",soyad[]="YILDIRIM  ";
signed char i;
ekranitemizle(); // Once ekran temizlenir.
for (i=0 ; ad[i] != 0; i++){ Datayaz(ad[i]); } 
gecikme(9000);
for (i=0 ; soyad[i] != 0; i++){ Datayaz(soyad[i]); } 
gecikme(9000);


}

void gecikme(long int sure)
{long int i;
for(i=0;i<=sure;i++);
}

void Datakomut(int komut)
{ rs=0;
  rw=0;
  en=1;
  Data=komut;
  en=0;
  gecikme(150);
}

void datayaz(char veri) // tanitim() islevindeki isimlerin yavasca kaymasini saglar 
{
	rs=1;
	rw=0;
	en=1;
	Data=veri;
	en=0;
	gecikme(1000);
}
void Dataveri(char veri)
{
  rs=1;
  rw=0;
  en=1;
  Data=veri;
  en=0;
  gecikme(50);
}

void ekranitemizle(void)
{
	Datakomut(sil);  //ekrani temizler,kursoren sola gelir.  
	Datakomut(birincisatir+15);  // kursor en sagda.
}

void lcdkur(void)
{
Datakomut(ciftsatir4bit); // 8-bit ara birim - 1 satir.
Datakomut(kursorgizle);// Display'i ac - kursor gozukmesin.
Datakomut(solayaz+3);  // kendiliginden arttirma- display sola kaysin.
Datakomut(birincisatir+15);  // kursor en sagda.
}

char tus(void)
{	char don;	

sut1=0;//1.sutunu kontrol et
while(!sut1)
{
while (sata==0) {while (sata==0) if(sata==1);don='1';}
while (satb==0) {while (satb==0) if(satb==1);don='4';}
while (satc==0) {while (satc==0) if(satc==1);don='7';}
while(satd==0) {while (satd==0) if(satd==1);don='.';}
sut1=1;  	
}
	
sut2=0;//2.sutunu kontrol et
while(!sut2)
{
while (sata==0) {while (sata==0) if(sata==1);don='2';}
while (satb==0) {while (satb==0) if(satb==1);don='5';}
while (satc==0) {while (satc==0) if(satc==1);don='8';}
while (satd==0) {while (satd==0) if(satd==1);don='0';}
sut2=1;

}

sut3=0;//3.sutunu kontrol et
while(!sut3)
{
while (sata==0) {while (sata==0) if(sata==1);don='3';}
while (satb==0) {while (satb==0) if(satb==1);don='6';}
while (satc==0) {while (satc==0) if(satc==1);don='9';}
while (satd==0) {while (satd==0) if(satd==1);don='=';}
sut3=1;

}

sut4=0;//4.sutunu kontrol et
while(!sut4)
{
while (sata==0) {while (sata==0) if(sata==1);don='/';}
while (satb==0) {while (satb==0) if(satb==1);don='*';}
while (satc==0) {while (satc==0) if(satc==1);don='-';}
while (satd==0) {while (satd==0) if(satd==1);don='+';}
sut4=1;
}
	
 return don;
}

Hazırlayan: Fatih Yıldırım Emeği geçen Kişilere Teşekkürler

8051-ile-2x16-lcd-gostergeli-hesap-makinasi

Şifre-Pass: 320volt.com

Yayım tarihi: 2008/10/04 Etiketler: , , , , , ,



11 Yorum “8051 ile 2X16 Lcd Göstergeli Hesap Makinası

  1. aliali

    biliyorum bu laf bi elektronikçinin en uyuz olduğu laf ama “1ytl ye satıyorlar” be kardeş

    CEVAPLA
  2. gevvgevv Yazar

    Bu yazıda amac bir hesap makinesi yapıp kullanmaktan ziyade donanım ve programsal olarak işleyiş hakkında bilgi vermektir mikro denetleyici programlama ile uğraşan kişiler için faydalı olacak bilgiler

    CEVAPLA
  3. isotechisotech

    hocam süper bi çalışma çok makbule geçti tamda proje aradığım dönemde bunu buldum.Emeği geçen arkadaşa çok teşekkürler! 😀

    CEVAPLA
  4. Nebi CİRİTNebi CİRİT

    Hocam merabalar. bana bu devre lazımda bi kaç bilgi almak istiyordum özel görüşebilirmiydik. tşk ler

    CEVAPLA
  5. Nebi CiritNebi Cirit

    Bu Devrenin C Haricinde ASM Yazılımı Var mı Varsa Yardımcı Olursanız Sevınırım… vadideki_sessizlik @ hot… Yardımlarınızı Beklıyorum..

    CEVAPLA
  6. ereneterenet

    iyi günler hocam çok güzel ve yararlı bir proje fakat hesap.h kütüphanesi bizde kayıtlı değil acaba o kütüphaneyi kendinizmi onuda paylaşırsanız çok makbüle geçer

    CEVAPLA
  7. osmanosman

    hocam işlensel kuvvetlendiriciler dersinden hocamız bize hesap makinası tasarımı ödevi verdi.

    Fonksiyonları şu şekilde:

    -Dört İşlem (toplama-çıkarma-çarpma-bölme)
    -Üst alma
    -Ondalık logaritma (log10x)
    -Tabii logaritma (lnx)

    ve bu devre hakkında rapor.

    Sizden ricam böyle bir tasarım yapma durumunuz varsa acaba yayınlayabilir misiniz.
    Özelliklerde yapabildiğinizi hiç değilse.
    Şimdiden çok teşekkürler…

    CEVAPLA
  8. enesenes

    güzel bir çalışma olmuş teşekkür ederim ben bunu ödev olarak aldım ama devrenin akış şemasını yapamıyorum yardımcı olurmusunuz .

    CEVAPLA
  9. B_______ JB_______ J

    { char don;

    sut1=0;//1.sutunu kontrol et
    while(!sut1)
    {
    while (sata==0) {while (sata==0) if(sata==1);don=’7′;}
    while (satb==0) {while (satb==0) if(satb==1);don=’4′;}
    while (satc==0) {while (satc==0) if(satc==1);don=’1′;}
    while(satd==0) {while (satd==0) if(satd==1);don=’.’;}
    sut1=1;
    }

    sut2=0;//2.sutunu kontrol et
    while(!sut2)
    {
    while (sata==0) {while (sata==0) if(sata==1);don=’8′;}
    while (satb==0) {while (satb==0) if(satb==1);don=’5′;}
    while (satc==0) {while (satc==0) if(satc==1);don=’2′;}
    while (satd==0) {while (satd==0) if(satd==1);don=’0′;}
    sut2=1;

    }

    sut3=0;//3.sutunu kontrol et
    while(!sut3)
    {
    while (sata==0) {while (sata==0) if(sata==1);don=’9′;}
    while (satb==0) {while (satb==0) if(satb==1);don=’6′;}
    while (satc==0) {while (satc==0) if(satc==1);don=’3′;}
    while (satd==0) {while (satd==0) if(satd==1);don=’=’;}
    sut3=1;

    }

    sut4=0;//4.sutunu kontrol et
    while(!sut4)
    {
    while (sata==0) {while (sata==0) if(sata==1);don=’/’;}
    while (satb==0) {while (satb==0) if(satb==1);don=’*’;}
    while (satc==0) {while (satc==0) if(satc==1);don=’-‘;}
    while (satd==0) {while (satd==0) if(satd==1);don=’+’;}
    sut4=1;
    }

    return don;
    }

    //çok hoş olmuş sadece bu kısmı değiştirmenız yeterli

    CEVAPLA
  10. barışbarış

    bu kodları kullanıp devreyi kurdum, fakat lcd de yazılar çıkarken arkada beyaz kareler oluyor onu nasıl düzeltebilrim ? yardımcı olursanız sevinirim

    CEVAPLA

Nebi CİRİT için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir