En Fazla 4 Basamaklı Sayılar Üzerinde 4 İşlem Yapan Hesap Makinesi(Picbasic Pro vs LCD vs KeyPad)
Öncelikle bu iş için kullanılacak olan ISIS bileşenlerine bakalım.
16F877 mikrodenetleyicisi
LM016L(LCD)
PullDown
KEYPAD-SMALLCALC
Power(güç kaynağı)
Bu bileşenlerden oluşan ISIS devresi ise aşağıdaki gibidir.
Bu yazıda işin yazılımsal kısmıyla ilgileniyoruz.Bu bileşenler hakkında daha çok bilgi elde etmek için bileşen üzerine sağ tıklayıp "Display Datasheet" seçeneyi kullanılabilir.Bu devre üzerindeki bileşenlerin microdenetleyici ile etkileşimde buluna bilmesi için bu bileşenlerin microdenetleyiciye tanıtılması gerekmektedir.Yukarıdaki bileşenler arasında buna ihtiyacı olan bileşen lcd dir.Dolayısıyla lcd yi 16F877 microdenetleyicisine tanıtmak için aşağıdaki PicBasic kodu kullanılabilir.
lcd_tanim.pbp
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [heydar] *
'* Notice : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 04.12.2015 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
DEFINE LCD_DREG PORTD 'lcd'in veri giriş/çıkışı için kullanılacak olan
'mikrodenetleyici port'u
DEFINE LCD_DBIT 0 'başlangıç veri bitini değiş,o-bit bus için
DEFINE LCD_RSREG PORTE 'lcd nin registrları için porte yi kullan
DEFINE LCD_RSBIT 0 'registr seçme bitini porte.0 a bagla
DEFINE LCD_EREG PORTE 'lcd yi kullanılabilir(enable) yapmak için
'porte yi kullan
DEFINE LCD_EBIT 2 'lcd yi enable yapmak için porte.2 yi kullan
DEFINE LCD_BITS 8 'lcd nin veri yolunu(bus) 8 bit yap
pause 100
Pic e gömeceyimiz PicBasic kodu ise aşağıdaki gibidir.
hesap_makinesi.pbp
'****************************************************************''* Name : hesap_makinesi.pbp *''* Author : [heydar] *''* Notice : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *''* : All Rights Reserved *''* Date : 04.12.2015 *''* Version : 1.0 *''* Notes : *''* : *''****************************************************************'
include "lcd_tanim.pbp"'--------Tanımlamalar----------------------------------'
ADCON1=7'16F8xx ailesinin portları veri giriş-çıkışı''default olarak analog modda tanımlanmışdır.''biz ise Pic i sayısal modda kullanıcağımız için''bu tanımlamayı eklememiz lazım'
trisd=%00000000'bütün D portları çıkış portu yap'
trisb=%11110000'B nin ilk 0-3 port çıkış,4-7 portları giriş'
islem var byte 'hangi işlem yapılacak'
birinci_sayi_bul var byte 'birinci sayı bulunsunmu'
birinci_sayi_bul="h"
ikinci_sayi_bul var byte 'ikinci sayı bulunsunmu'
ikinci_sayi_bul="h"
sonuc var word 'işlem sonucunu tut'
sayi1 var word:sayi1=0'birinci sayıyı tut'
sayi2 var word:sayi2=0'ikinci sayıyı tut'
basamaklar var byte[4] 'basamakları bu dizide tut'
index var byte 'dizinin index ni tut'
index=0
bekle con 5'---------Butun işlemlerin gerçekleştirilecegi Ana Label-----------------------'
main:
'butun portlar sırasıyla aktif edilir'
portb.0=1:portb.1=0:portb.2=0:portb.3=0'0. ve 4. portun degeri 1 ise demekki 7 tuşuna basılmış'if portb.4=1then basamaklar[index]=7:index=index+1:lcdout "7"if portb.5=1then basamaklar[index]=8:index=index+1:lcdout "8"if portb.6=1then basamaklar[index]=9:index=index+1:lcdout "9"'eger / tuşuna basılmışsa demekki birinci sayı bulunmus ''sayı_bul a git ve 1. sayıyı bul'if portb.7=1then islem="/":lcdout "/":birinci_sayi_bul="e":gosub sayi_bul
pause bekle '5 millisaniye bekle.microdenetleyiciye 5''millisaniye hiçbir işlem yaptırmıyoruz'
portb.0=0:portb.1=1:portb.2=0:portb.3=0'4 tuşuna basılmışsa basamaklar dizisine 4ü ekle''örn:basamaklar[0]=4 'if portb.4=1then basamaklar[index]=4:index=index+1:lcdout "4"if portb.5=1then basamaklar[index]=5:index=index+1:lcdout "5"if portb.6=1then basamaklar[index]=6:index=index+1:lcdout "6"if portb.7=1then islem="x":lcdout "x":birinci_sayi_bul="e":gosub sayi_bul
pause bekle
portb.0=0:portb.1=0:portb.2=1:portb.3=0if portb.4=1then basamaklar[index]=1:index=index+1:lcdout "1"if portb.5=1then basamaklar[index]=2:index=index+1:lcdout "2"if portb.6=1then basamaklar[index]=3:index=index+1:lcdout "3"if portb.7=1then islem="-":lcdout "-":birinci_sayi_bul="e":gosub sayi_bul
pause bekle
portb.0=0:portb.1=0:portb.2=0:portb.3=1if portb.4=1then islem="o":gosub ekrani_temizle
if portb.5=1then basamaklar[index]=0:index=index+1:lcdout "0"'= tuşuna basılmışsa demekki ikinci sayıda girilmiş,sayı_bula git ve sayiyi bul''ve sonucu hesaplayıp yaz'if portb.6=1then lcdout "=":ikinci_sayi_bul="e":gosub sayi_bul:gosub hesapla_ve_yaz
if portb.7=1then islem="+":lcdout "+":birinci_sayi_bul="e":gosub sayi_bul
pause bekle
goto main
sayi_bul:
'girilen sayıları onların basamakları şeklinde bir dizide''tutuldugu için bu basamakların girilen gerçek sayıya''dönuşturulmesi gerekir,decimal sayı sistemi kullandıgımız ''için 10 nun katlarını kullanıcagız. ''örn:diyelimki 4 ve 5 tuşlarına basılmış ''o zaman basamaklar[0]=4 ve basamaklar[1]=5 olur''ve biz 45 sayısını elde etmek için 4*10+5 işlemini''yapmamız lazım.onluk_tabani degişkeni burada 10 nun 1.katıdır.''4 basamaklı bir sayı girilseydi eger mesela 4,5,6,7 ''sayımız 4567 olurdu ve onu bulmak için 4*1000+5*100+6*10+7''işlemini yapmak gerekecekdi'
onluk_tabani var word:onluk_tabani=1
i var byte
for i=0 to index-1
onluk_tabani=onluk_tabani*10next i
'örn:4 basamak girilmişse onluk_tabani=10000 olur''fakat 1000 olmalıdır,o yuzden 1 kat azaltmamız lazım'
onluk_tabani=onluk_tabani/10if birinci_sayi_bul="e"thenfor i=0 to index-1'orn:0+4*1000+5*100+6*10+7 '
sayi1=sayi1+basamaklar[i]*onluk_tabani
onluk_tabani=onluk_tabani/10next i
index=0
birinci_sayi_bul="h"
endif
if ikinci_sayi_bul="e"thenfor i=0 to index-1
sayi2=sayi2+basamaklar[i]*onluk_tabani
onluk_tabani=onluk_tabani/10next i
ikinci_sayi_bul="h"
endif
return'-----hesaplama ve lcd ye yazma işlemlerinin yapılağı label------ '
hesapla_ve_yaz:
select case islem
case "+"
sonuc=sayi1+sayi2
lcdout #sonuc
case "x"
sonuc=sayi1*sayi2
lcdout #sonuc
case "-"
sonuc=sayi1-sayi2
lcdout #sonuc
case "/"
sonuc=sayi1/sayi2
lcdout #sonuc
end select
return'----------lcd ekranını temizleyip ve gereken değişkenlere''default değerlerinin atandığı Label---------------------'
ekrani_temizle:
lcdout $fe,1
sayi1=0:sayi2=0:sonuc=0:islem=" ":index=0return
Aşağıdaki videoda bu kodun derlenip pic e gömülerek çalıştırılması vardır.
Hiç yorum yok:
Yorum Gönder