Multiplex Yöntemi Ve Birleşik Display Kullanımı

guclusat

Tanınmış Üye
Süper Moderatör
Display kontrol etmenin iki yöntemi var birincisi tarama yöntemi ikincisi ise shiftregister kullanmaktır ilk önce tarama yöntemini kullanalım. Bu yöntemde ortak katot 2 li birleşik display kullanacağız.birleşik displayın çalışma mantığı şu şekilde

Bütün segmentler için bir tek data girişi bulunur ve her bir segment için bir katot çıkışı bulunur yukarıdaki örnekte olduğu gibi 2 sayısının bilgisi gönderildiğinde tüm segmentlerde 2, 7 sayısının bilgisi gönderildiğinde tüm segmentlerde 7 görünür bu sayıyı 27 yapmak istediğimizde 2 bilgisi gelince 1 numaralı katot ucunu 0,2 numaralı katot ucunu 1 yaparız bu şekilde yalnızca 1. segmentte 2 görünür. Aynı işi 7 bilgisi gönderildiğinde 2. katoda 0 vererek yaparız, böylece 2. segmentte 7 rakkamı görünür. Bu işlem belirli bir müddet çok hızlı bir şekilde gerçekleşince gözümüz aldanır ve sanki 27 yazıyormuş gibi algılarız bu tarama yöntemidir ve birleşik display bu şekilde kullanılır.

Şimdi örnek bir 0-99 sayıcı devre yapalım devremiz bir ileri geri tuşu ile birkez basınca ileri tekrar basınca geri sayıyor. Bu sayma işlemi resetle sıfırlanıyor.sayılar 99?a gelince tekrar sıfır olarak saymaya devam ediyor, tersine saymada ise 0 dan sonra 99 olarak tekrar geri sayıyor.

sayıcı-devre-şeması111.jpg

Kod:
include”modedefs.bas”                                  ?seri iletişim dosyalarını dahil et


@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT      ?dahili osilatör devrede
@ DEVICE pic16F628a, MCLR_OFF                ?mclr pini pasif
cmcon=7                                      ?komperatör pinleri devre dışı
TRISA=%00001100                              ?porta.2 ve 3 giriş olarak ayarlandı
porta=%00001100
TRISB=%00000000                              ?portb çıkış
portb=0
a var WORD                                   ?a değişkeni word olarak tanımlandı
b var byte                                   ?b değişkeni byte olarak tanımlandı
i var word                                   ?i değişkeni word olarak tanımlandı
d var byte                                   ?d değişkeni byte olarak tanımlandı
k var byte                                   ?k değişkeni byte olarak tanımlandı
a=0 : b=0 : i=0  :k=0                        ?değişkenlere 0 atandı
low porta.0:low porta.1                      ?display çıkışları low yapıldı
'---------------------------------------------------------------------------
basla:
if porta.2=0 then yukari                     ?porta.2 ye basılırsa yukari etiketine git
portb=%00111111                              ?portb den sıfır bilgisini gönder
porta.0=1                                    ?1. segmentte sıfırı göster
porta.1=1                                    ?2. segmentte sıfırı göster
goto basla                                   ?basla etiketine dön
yukari1:
pause 300                                    ?porta.2 tuşuna basılıp çekme miktar bekle
yukari:
A=A+1                                        ?A yı bir artır
if a=100 then a=0                            ?A yüze eşit olduğunda A yı sıfırla
FOR i=0 to 50                                ?50 kez aşağıdaki işlemi yap
gosub goster                                 ?göster etiketine git
next i                                       ?i nin bir sonraki değerine git
if porta.3=0 then basla                      ?porta.3 e basılmış ise basla etiketine git
if porta.2=0 then asagi1                     ?porta2.0 a basılmış ise asagi1 etiketine git
goto yukari                                  ?yukari etiketine dön
asagi1
pause 300                                    ?el basıp çekme miktarı bekle
asagi:
a=a-1                                        ?a?yı bir eksilt
if a=0 then a=99                             ?eğer a=0 ise a=99 yap
FOR i=0 to 50                                ?i sıfırdan 50 ye kadar aşağıdaki işlemi yap
gosub göster                                 ?göstertiketine git geri gel
next i                                       ?i ye dön ve bir artır
if porta.3=0 then basla                      ?eğer porta.3 sıfır ise  basla etiketine git
if porta.2=0 then yukari1                    ?eğer porta.2 sıfır ise yukari1 etiketine git
goto asagi                                   ?aşağı etiketine git
goster:
K=A DIG 0                                    ?a, k sayısının sıfırıncı basamağıdır
gosub cevir                                  ?çevir etiketine git ve geri gel
portb=b                                      ?portb yi b sayısına eşitle
high porta.0: pause 1: low porta.0           ?transistör ile sayıyı göster ve kapat
K=A DIG 1                                    ?a,k sayısının birinci bitine eşit
gosub cevir                                  ?çevir etiketine git ve geri gel
portb=b                                      ?portb yi b sayısına eşitle
high porta.1: pause 1: low porta.1           ?transistör ile sayıyı göster ve kapat
return
cevir:
porta.0=0                                     ?porta.0 ?ı sıfırla
porta.1=0                                     ?porta.1 ?i sıfırla
LOOKUP K, [63,6,91,79,102,109,125,7,127,111],b       ?k nın display değerini b ye yaz
Return

@ DEVICE pic16F628a, INTRC_OSC_NOCLKOUT komutu ile 16f628 de bulunan dahili oslatörü aktif hale getiriyoruz, @ DEVICE pic16F628a, MCLR_OFF ile MCLR pinini nor mal bir pin haline getiriyoruz burada söyleyeceğimiz şey MCLR pini sürekli pull-down olarak ayarlanmıştır bu pini kullanmak için bir pull-up direnci bağlayarak kullanmalısınız. Daha önce anlattığımız gibi partlardaki pinleri programımıza uygun bir şekilde giriş veya çıkış olarak ayarlıyoruz, daha sonra değişkenlerimizi belirliyoruz benim buradaki taktiğim bu değişkenleri program yazarken ihtiyaç duydukça tanımlamaktır.

Porta.2 yi yukarı aşağı sayma tuşu olarak ayarladık ana program başladığında program başla etiketinin altında bu tuşa basmamızı bekler bastığımızda porta.2 pininin 0 olduğunu algılar ve yukarı sayma işlemine yani yukarı etiketine yönlendirir. Burada yukarı1 ve yukarı adı altında iki adet etiket belirlememizin sebebi button komutunu kullanmadan basma gecikme işlemini sağlamaktır. Butona bastığımızda elimizi kaldırana kadar işlemci diğer komutlara geçebilir. basma gecikmesi için bir pause komutu ile 300 milisaniye gecikme koyduk. daha sonra ise goto komutunu yukarı etiketine vererek bu pause komutunu deveden Basla etiketinin ardından portb?yi %00111111 sayısına eşitledik buda segmentlere sıfır sayısının gönderilmesini sağlar. Porta.0 ve porta.1 den 5 volt çıkış gönderiyoruz bu çıkışlar transistörün beyzine bağlı olduğu için transistörlerin ikiside lojik bir olan segmentlerin ortak katot çıkışlarını sıfıra çakarek rakkamların görüntülenmesini sağlar.

Porta.2 sıfır oldu ve yukarı etiketine ulaştık peki bundan sonra ne olacak yukari etiketi ile goto yukarı komutu arasında şunlar gerçekleşir. A=A+1 f ormülü programlama adına evrensel bir formüldür. Bu A sayısını bir artır ve A nın içine kaydet demektir artık A bir önceki A dan bir fazladır. A sayısının nekadar artacağınıda kontrol edeceğiz bunun için şu komutu kullanıyoruz. ?if a=100 then a=0? A sayısı 100 olunca A sayısını sıfırla bu komut A sayısının 0 ? 99 arası değerler almasını sağlar bu komut şöylede yazılabilir ?if a>100 then a=0? bu komutta aynı işe hizmet eder. GOSUB komutu ile göster etiketine gidiyoruz ve A değişkenimizin içindeki değeri segmentlerde göstermemizi sağlıyor. Ve bu işi tam 50 kez yapıyor peki bu nasıl oluyor bu işlem FOR NEXT komutu kullanılarak yapılıyor FOR NEXT komutu şöyle çalışır.

FOR i=0 to 50
İstenen komutlar
NEXT i

İ bir değişkendir. Anlamı şu i sıfırdan 50 ye gelene kadar i yi bir bir artır ve NEXT komutu arasındaki işlemi gerçekleştir ve i=50 olunca bir sonaki komuttan devam et. Bu işlem FOR ve NEXT komutları arasındaki işlemi 50 kez tekrarlamayı sağlar. Bu işlemi şunun için yaparız tarama işleminde 57 sayısınında önce 5 sonra 7 görünür demiştik işte bu işlemi sırası ile öyle hızlı yapmalıyız ki gözümüz bunu 57 olarak görsün FOR NEXT döngüsü ile bu işlemi 50 kez yapıyoruz. Buda 57 sayısını belli bir müddet segmentlerde görmemizi sağlıyor birkez yapsaydık daha ne olduğunu anlamadan 0- 99 arası sayılmış olacaktı. Daha sonra ?if porta.3=0 then basla? komutu geliyor bu komut bizi basla etiketine götürür. Basla atiketinde de portb=%00111111 olduğu için segmentteki sayılar sıfıra eşitlenir ve artık sıfır görüntülenir. Bu olay saymayı resetlemek demektir. ?Eğer if porta.2=0 then asagi1? basılmışsa aşağı etiketine gider burada da aynı işlemler gerçekleşir. Sadece A=A-1 ile A sayısı 1 azaltılır ve ?if a=0 then a=99? komutu ile A sayısı sıfır olunca A yı 99 a eşitler. FOR NEXT ile bu değişimi yine 50 kez segmette gösterir. ?if porta.3=0 then basla? komutu başlaya göndererek reset işlemini gerçekleştirir.? if porta.2=0 then yukari1 ?bizi yukarı saymaya yönlendirir. Göster etiketinde gerçekleşenler ise şunlardır.

K=A DIG 0 demek K değişkenini A sayısının sıfırıncı bitine eşitle demektir DIG komutu DIGIT kelimesinden gelmektedir ve bir sayının herhangi bir dijitini seçmek için kullanılır K=A DIG 0 => Örn A=57, K=7 dir. K= A DIG 1 ise => A=57 için K=5 dir bu K değeri sırası ile gösterilince 57 olur. ? high porta.0: pause 1: low porta.0? komutu rakkamın 1 milisaniye kadar segmentte gösterilmesini sağlar. ?gosub cevir? etiketi ile K nın rakkam değeri segmentte gösterilebilecek formata dönüştürülür. Ve dönüştürülmüş biçimi b değişkeninin içine kaydedilir. Portb=b yapılarak segmentte sayı gösterilir. Çevir etiketinde şu işlem gerçekleşir. Segmentler kapatılır ve lookupt döngüsü şu şekilde çalışır.
 
Geri
Yukarı