Notlar..

320volt / Mikrodenetleyici Projeleri/

8051 ile 2X16 Lcd Göstergeli Hesap Makinası

Mikrodenetleyici Projeleri, blog arşivinde 8051 ILE 2X16 LCD GÖSTERGELI HESAP MAKINASI konusu "2X16 LCD* 8051* AT89C51* atmel avr projeleri* C program* hesap* makina* " ile etiketlendi

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.

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 Projenin Kaynak Dosyaları 8051-2x16-lcd-hesap-makinasi.rar Emeği geçen Kişilere Teşekkürler

  • ali

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

  • http://320volt.com gevv

    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

  • isotech

    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! :D

  • Nebi CİRİT

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

  • Nebi 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..

  • ali deli

    Emeğinize sağlık. Teşekkür ederim…

  • erenet

    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

  • osman

    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…

  • enes

    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 .

  • B_______ 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

  • 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