Hazırlayan: Fatih Yıldırım Projenin Kaynak Dosyaları 8051-2×16-lcd-hesap-makinasi Emeği geçen Kişilere Teşekkürler

Hesap Makinası isis Devre Şeması

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.

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;
}