8051 ile 2X16 Lcd Göstergeli Hesap Makinası

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;
}
10/01/2009 23:11
biliyorum bu laf bi elektronikçinin en uyuz olduğu laf ama “1ytl ye satıyorlar” be kardeş
10/01/2009 23:37
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
25/05/2009 20:22
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!
27/06/2009 14:35
Hocam merabalar. bana bu devre lazımda bi kaç bilgi almak istiyordum özel görüşebilirmiydik. tşk ler