PBP ile 7 Segment Display'deki Gereksiz Sıfırları Söndürme Algoritması

Başlatan e1ektronick, 24 Mart 2015, 01:12:10

e1ektronick

Merhaba arkadaşlar;

Kendim için yaptığım 4 dijit 7 segment displayli masa saatini gün geçtikçe kendi imkanlarımla geliştirme çabası içindeyim. Şöyle ki; yeni özellikler, menü ve görselite (animasyonlu geçişler) anlamında yazılımı biraz daha iyileştirmeye çalışıyorum.

PBP konusunda her geçen gün kendime bu forum (etepic.com) sayesinde yeni yeni bilgiler ekliyorum, bu konuda emek ve bilgilerini paylaşan başta bu forumu kuran ve forum kullanıcılarına yardımcı olan ETE Hoca'ya ve forumun diğer müdavimi olan arkadaşlara çok teşekkür ediyorum. Yazılım konusunda başlangıç seviyesinde olduğum için sizlerden bir konuda yardım bekliyorum.

Kullanığım saat üzerinde, gece saat 23:59 sonra öğleye yakın saat tam 10:00 olana kadar saat kısmı biliyorsunuz ki rtc entegresinden (DS1307) aldığı bilgiler doğrultusunda 00, 01, 02, 03, 03, 04, 05, 06, 07, 08, 09 diye sayıyor. Saat kısmında onlar hanesindeki 0(sıfır)'ı nasıl söndürebilirim. Aşagıdaki resimde bunu izah etmeye çalıştım. Siyah çerçeve içine aldığım dijit.

Bu anlattığım olay bir sayıcı içinde geçerlidir. Devreyi 4 dijit 9999 sayıcı olarak kullanmak istediğimde ilk başta en sağdaki dijit olan birler hanesi 0 (sıfır) sayısından saymaya başlıyor ki bu noktada bu birler hanesindeki 0 (sıfır) kesinlikle görülmelidir. Sayı 9'a ulaştı ve ardından 10 olduğunda artık onlar hanesi devreye girmeli.

Bu konuda bir diğer öğrenmek istediğim ise aynı 4 dijit 7 segment diplay'de ondalıklı sayılar gösterilmeye çalışıldığında virgül öncesi 0 (sıfır) ve virgül sonrası değerin en sonuna gereksiz bir sıfır yazıldığındaki durumu. Örneğin;

virgül öncesi durum: 1 sayısından küçük olan 0,36 sayısının display'de gösteriminde baştaki sıfırın yanık kalması
virgül sonrası durum: rastgele bir sayı olarak 1,20 sayısında ise virgülden sonra sadece 2 rakamını kullanabilirdik.

Yukarda anlattıklarıma istinaden yazılımda ne gibi değişiklikler yapılarak başarılı bir sonuca ulaşılabilir? Aslında benim maksadım kullandığım saat ile alakalıydı ama aklıma gelmişken diğer konularda açıklık bulsun ve benim gibi bu konuyu araştıranlar buradan faydalansınlar.

Teşekkür ederim.

ete

Sorduğun soruların aslında tek bir cevabı var. Önce saat alternatifine bakalım. Soldan iki hane saat yazdırmak için kullanılıyor. En soldaki onlar hanesi oluyor. Şayet saat değeri 10 dan küçük ise veya saat dig 1 sıfıra eşit ise onlar değeri sıfır olmalıdır. Bu dediklerimi program mantığı ile yazarsanız o hanede sıfır olduğu müddetçe display aktif olmaz.
4 digit bir sayaç sisteminde sayac değeri 15 ise normalde sayac ekranda 0015 şeklinde gösterilir. Sen bunu ..15 şeklinde görmek istiyor isen displaye verilen digit değerlerini hesaplarken,
Sayac değeri 10 dan küçük ise binler=0, yuzler=0 ve onlar=0 olmalıdır.
Sayac değeri 100 sen küçük ise o zaman soldan ilk iki hane sıfır olmalıdır. Sayac değeri 1000 den küçük ise soldan tek hane değeri sıfır olmalıdır. Sıfır derken oraya yazılacak değerden bahsediyorum. Normalde sıfır için oraya %00111111 yazarak sıfır rakamını oluşturuyoruz. Ama %00000000 yazarsanız hiç bir segment aktif olmaz ve display sönük kalır.

Ete

sonmoikan

0-99 arası sayım yapan basitçe bir örnek ekliyeyim, öğrenme açısından faydası olur.


;-----------------------------Sigorta Ayarları----------------------------------
@ DEVICE pic16F628A                      'işlemci 16F628A                               
@ DEVICE pic16F628A, WDT_Off             'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE OSC 4
'--------------Anolog/Digital ayarları yapılıyor--------------------------------
CMCON=7              'OPERATOR PIMLERI IPTAL
OPTION_REG=%10000101 'Pull  up dirençleri İPTAL- Bölme oranı 1/64

'--------------Giriş Çıkış Pinleri Ayarlanıyor----------------------------------
TRISA=0
TRISB=0
PORTA=0
PORTB=0
'--------------Değişkenler belirleniyor-----------------------------------------
sayac var byte

symbol dta=porta.0
symbol sh=porta.1
symbol st=porta.2

index var byte
veri var byte

onlar var byte
birler var byte
clear

;-------------------------------------------------------------------------------
basla:
    sayac=sayac+1
    if sayac=100 then sayac=0                        ;0-99 arası say
     
    index =sayac dig 0 : gosub tablo : gosub gonder  ;birler hanesi
   
    index =sayac dig 1 : gosub tablo                 ;onlar hanesi
    if  index=0 then veri=0                          ;Önemli olan yer burası, onlar hanesi 0 ise veri boş olsun
    gosub gonder
   
    pulsout st,2                                     ;gonderilen verileri çıkart
   
    pause 1000                                       ;1 sn bekle
goto basla
;-------------------------------------------------------------------------------
tablo:
    LOOKUP INDEX,[63,6,91,79,102,109,125,7,127,111],veri
return
;-------------------------------------------------------------------------------
gonder:
    shiftout dta,sh,1,[veri]
return
;-------------------------------------------------------------------------------
end
;-------------------------------------------------------------------------------


ABDULLAH

e1ektronick

Merhaba arkadaşlar,

Şu ana kadar çalıştığım için ve yoğun olup normal işlerden ancak zaman bulup sizlere cevap verebildim.

Program mantığını yeni yeni kavradığım için bu konuda fazla tecrübe sahibi değilim. Kavrama kabiliyetim yüksek olduğu için şu anda verdiğiniz yanıtlar doğrultusunda projemde belirttiğiniz eklemeleri yaparak istediğim sonuca ulaştım. Bunun kısa bir videosunu çekip burada ilgilenen arkadaşlara örnek temsil etmesi açısından programın açıklamalı halini de video ile paylaşacağım.

Bu noktada ete hocama programın mantığını açıklaması ve örneklendirme ile konuyu daha da pekiştirmemi sağlayan sonmoikan hocama teşekkürü bir borç bilirim.

Powered by EzPortal