avatar_Mucit23

GLCD' de Pixel tabanlı metin kaydırma

Başlatan Mucit23, 03 Ekim 2011, 13:19:20

Mucit23

Daha önce karakter lcd de kayan yazı yapmıştım. Karakter lcd lerde adresler sabit olduğu için herhangi sabit bir yazıyı kaydırmak okadarda zor olmuyordu. Grafik lcd de biraz durum farklı.

Proton ile Grafik lcd de Sabit bir yazı kaydırmam gerekiyor. Bu konuda biraz desteğe ihtiyacım var. Yapmak İstediğim şey yazının  127. Sütündan başlayarak sola doğru kayması. Kısa yazılarda sorun olmuyor. Yani şuanda yapabildiğim tek şey,yazının sağ taraftan başlayıp  sol doğru kayması oldu.
Video daha açıklayıcı olur.
http://www.youtube.com/watch?v=7N-iGhMyuWI
Benim asıl yapmak istediğim şey lcd ekrana sığmayacak kadar uzun yazıların sağdan başlayıp sola doğru kayıp sol taraftan silinmesi. Tüm yazı geçtikten sonra tekrar baştan başlaması. Bu konu hakkında biraz algooritma desteğine ihtiyacım var. Herhangi bir fikri olan varmı? Nasıl yapılabilir.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Arkadaşlar bu kounda kimsenin fikri yokmu?
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#2
Açıkçası pixel tabanlı lafı geçince kimse yanaşmak istememişdir.
Muhtemelen proton kullanarak bu uygulamayı yaptın. Proton GLCD de direk karekter basabiliyor. O halde karekter LCD mantığı ile bunları kaydıramazmısın. Bir ara seninle mi uğraşmıştık diğer sitede karekter kaydırma işi ile. ?. Güzel bir sistem yaratmış idik. Ama şimdi bulamıyorum onları bir yerlere koydum yada yeniden yaparım diye sildim herhalde.
Bu işi karekter tabanlı yaparsan yardımcı olurum. Yoksa pixel tabanlı yaparsan ancak PBP da ayrdımcı olurum.
Protona da bulaşırım istersen ama kodları sen başlat ben üzerinde yorum yapıp düzeltme yapayım.
Karekter tabanlıda bu işi yapmak için bir EXCEL tablosu kullanmak akıllıca olurdu. Bu sistemde temel mantık soldan kaybolan harfi sağdan gelecek şekilde yerleştirmek. Bu nedenle bir satırda 20 karekter var ise sen 20 karekter sol başta + Ortada 20 Karekter + sağ başta 20 olmak üzere toplam 60 karekterlik bir dizi tanımla. Başlangıçta ekrana vereceğin bilgiyi dizinin 20+ birimlerine yerleştir. Yani 20 den sonraki kısmıma karekterlerini yerleştir. Sonra bir döngü kurup dizi elemanlarını ekrandan geçirirsen yazıda sağdan sola doğru kayacaktır. Ancak burada bazı tespitler gerekiyor. Birincisi yazı soldan tamamen kaybolduktan sonramı devamı yeniden başlayacak yoksa bir karekter boşluk verip tekrardan yazı sağdan sola doğru gelecekmi? bu iki husustan birini seçersen ona göre fikir jimnastiğine devam edebiliriz.

Ete

inventor

Protona ben de yeni başladım. Grafik lcd ile çalışmam olmuştu. Dosyalarını gönderebilirsen deneme yapabilirim. Bir şekilde çözeriz diye düşünüyorum
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Mucit23

#4
Arkadaşlar İlginiz için Teşekkür ederim.
Videodaki basit kayan yazı programını aşağıdaki kodlarla yaptım. Çalışması çok basit.
Device 18F4620

Config_Start
   OSC = HS ; HS
   FCMEN = OFF ; Disabled
   IESO = OFF ; Disabled
   PWRT = OFF ; Disabled
   BOREN = OFF ; Disabled
   WDT = OFF ; Disabled
   MCLRE = On ; Enabled
   LPT1OSC = OFF ; Disabled
   PBADEN = OFF ; PORTB<4:0> digital on Reset
   STVREN = OFF ; Disabled
   LVP = OFF ; Disabled
   XINST = OFF ; Disabled
   Debug = OFF ; Disabled
Config_End

Xtal 20
TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000

PORTA=0:PORTB=0
PORTC=0:PORTD=0
    PORTE=0
   
LCD_DTPort = PORTB                 'GLCD DATA PORTLARI PORTB'YE BAĞLI
LCD_RSPin = PORTD.4                'GLCD RS PİNİ PORTD.4 BAĞLI
LCD_ENPin = PORTD.2                'GLCD ENABLE PİNİ PORTD.2 BAĞLI
LCD_RWPin = PORTD.3               'GLCD RW PİNİ PORTD.3 BAĞLI
LCD_CS1Pin = PORTD.0               'GLCD CS1 PİNİ PORTD.0 BAĞLI
LCD_CS2Pin = PORTD.1               'GLCD CS2 PİNİ PORTD.0 BAĞLI
LCD_Type =  Samsung             'GLCD TİPİ GRAFİK KS0108 128*64B WİNSTAR
Internal_Font = On                 
Font_Addr = 0
Declare GLCD_STROBE_DELAY = 5
GLCD_EXTERNAL_PRINT = PPRINT

Dim XPOS As Byte
Dim YPOS As Byte
Dim setclear As Byte
Dim addr As Word
Dim char As Byte

    DelayMS 100
    Cls
Print Font Arial____6o75
For XPOS=127 To 0 Step - 1
Print At 1,XPOS,"|WWW.ETEPiC.COM|"
DelayMS 15
Next
For XPOS=127 To 0 Step - 1
Print At 11,XPOS,"|GLCD|KAYAN|YAZI"
DelayMS 15
Next
For XPOS=127 To 0 Step - 1
Print At 21,XPOS,"|UYGULAMASIDIR."
DelayMS 15
Next
For XPOS=127 To 0 Step - 1
Print At 31,XPOS,"|MUCiT23"
DelayMS 15
Next
Stop
    End
     
Include "ARIAL_S_7.txt"


Programdaki karakterler kafanızı karıştırmasın. Kendi oluşturduğum font dosyasını kullanmıştım. Orada Space(boşluk) diye bir karakter olmadığı için herhangi kullanmıyacağım bir karakterin datalarıyla oynayarak Space yaptım. Yani "|" Simgesi boşluk ifade ediyor.

Bunları bir kenera bırakırsak Pixel kelimesi biraz göz korkuttuğunu anlıyorum. Durumu birazdaha açıklarsam Kendi oluşturduğum font dosyalarıyla ekrana  bir karakter basarken herhangi bir adres sınırlaması yoktur. Hani karakter lcd lerde oluyor ya, 1. adres $80, 2. $81, 3. $82..... Protonda böyle bir sıkıntı yok. Ekranın 128x64 pixel olduğu düşünürsek. İstediğin pixelden itibaren ekrana yazı yazabiliyoruz.
Örneğin Print At 23,100,"Mucit23" Yani 23. satır ve 100. Sütünün başladığı yerden itibaren yaz. Böyle bir durum var.
Birde şunu söyliyeyim. Protonun kendine ait font dosyası var. O font dosyasını kullanırsam Ekran otomatikmen 8 satır 16 Sütüna bölünüyor. Dolayısıyla 16x8 karakter lcd gibi kullanılıyor. Ama bu benim işime hiç gelmiyor. Çünkü protonda şöyle bir kısıtlama var.Büyük uğraşlarım sonucunda anladımki proton bana Ya benim font Dosyamı kullan yada kendi oluşturduğun font dosyasını kullan. İkisi bir arada çalışmıyor. Yani protonun kendi font dosyasını kullanısam küçük fontlu yazılar ile büyük fontlu yazıları aynı anda kullanamıyorum.

Sizin için Adreslemenin karakter lcd gibi olması ne derece önem arzediyor acaba. Öylede yapabiliriz yani. Yukarıda Herseferinde 1 pixel sola kayıyor. Bunu beşer beşer veya altışa altışarda kaydırabiliriz. Ozaman adreslerin dışında karakter lcd gibi görünür.


Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mademki Proton karekterleri ekrana yerleştirmek için;
Print At 21,XPOS,"|UYGULAMASIDIR."
şeklind ekomut kullanıyor. Seninyapman gereken şey yalnızca yazılacakları bir değşkene yerleştirmek yada lookup tablosundan almaktır.
Ekranın neresine yazılacağına karar verebiliyor isen ne yazılacağınada karar verebilir basit bir formül yada organizasyonla bu yapılabilir. Yukarıda yazdığım mesaj halen geçerli. Biraz incelersen kolaylıkla mantığı çözebilirsin diye düşünüyorum.

Ete

inventor

Burada amaç ; yazının ekranın sağından girip solundan çıkması ve son karakter bitince yeniden başlaması ise ;

For XPOS=255 To 0 Step -1
Print At 1,XPOS,"WWW.ETEPiC.COM"
DelayMS 15
Next

goto basla

şeklinde bir ifade ile yapılabilir. Ben mi yanlış anladım acaba :-\
İlmin en büyük düşmanı, sabırsızlıktır. (Şems-i Tırmizi)

Mucit23

Anladım hocam. Biraz uğraşayım akşam.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Mucit23

Alıntı yapılan: inventor - 05 Ekim 2011, 14:02:47
Burada amaç ; yazının ekranın sağından girip solundan çıkması ve son karakter bitince yeniden başlaması ise ;

For XPOS=255 To 0 Step -1
Print At 1,XPOS,"WWW.ETEPiC.COM"
DelayMS 15
Next

goto basla

şeklinde bir ifade ile yapılabilir. Ben mi yanlış anladım acaba :-\

Dediğiniz doğru fakat bu şekilde düzgün çalışmıyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

BU yazdığın yaptığından farklı bir şey değil. Amacı bir kez daha ortaya koymak lazım.
Amaç yalnızca kaydırmak değil  sanırım. Sağdan harfi çıkarıp sola götürmek ve oradan teker teker yok etmek öyle değilmi.
Birde soru sormuştum. Yenileme işi son harf en sağdan ayrıldıktan sonramı başlayacak? yoksa yazı tamamen ekrandan kayıp olduktan sonramı başlayacak?.

Benim söyledğimin bir parçası yazdırılacak ifadeyi tek tek (har harf bir dizi değişkenine atamak yada bu harfleri bir lookup tablsundan almak şeklinde idi. O zaman işin kolaylaşır. Yoksa ekran kaydırması XPOS ile yapılabiliyor. Bu da bir döngü ile yapılacak burasıda malum o halde geriye karekterlere hakim olmak kalıyor. Yoksa benmi basit düşünüyorum. Öyle ise Protonla pek çalışmadığıma verirsin artık ne diyelim.
Ete

Mucit23

Alıntı yapılan: ete - 05 Ekim 2011, 14:13:40
BU yazdığın yaptığından farklı bir şey değil. Amacı bir kez daha ortaya koymak lazım.
Amaç yalnızca kaydırmak değil  sanırım. Sağdan harfi çıkarıp sola götürmek ve oradan teker teker yok etmek öyle değilmi.
Birde soru sormuştum. Yenileme işi son harf en sağdan ayrıldıktan sonramı başlayacak? yoksa yazı tamamen ekrandan kayıp olduktan sonramı başlayacak?.

Benim söyledğimin bir parçası yazdırılacak ifadeyi tek tek (har harf bir dizi değişkenine atamak yada bu harfleri bir lookup tablsundan almak şeklinde idi. O zaman işin kolaylaşır. Yoksa ekran kaydırması XPOS ile yapılabiliyor. Bu da bir döngü ile yapılacak burasıda malum o halde geriye karekterlere hakim olmak kalıyor. Yoksa benmi basit düşünüyorum. Öyle ise Protonla pek çalışmadığıma verirsin artık ne diyelim.
Ete

Hocam Bunun protonla Basicle felan alakası yok  :D :D  Burada algooritma yürütebilmek önemli Yoksa Print At ile LCD out arasında ne fark varki  ::)Şimdi aklıma birkaç yöntem geldi. Dediğiniz gibi amacım Yazıyı sağdan  başlayıp  sola doğru kaydırıp sol tarafta yok etmek. Tüm yazı kaybolduğu zaman Tekrar baştan başlatmak. Akşam dizi değişkenlerle biraz uğraşacağım Harfleri dizi değişkenlere yerleştirerek yapmayı düşünüyorum.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

#11
Mucit32,

Sana güzel bir yazı kaydırma örneği veriyorum. Yapman gereken şey mantığını çözüp ekran adresleri yerine pixel adreslerini vermek olacaktır.

Ete

@ DEVICE PIC16F628A
@ DEVICE PIC16F628A, WDT_ON
@ DEVICE PIC16F628A, PWRT_ON
@ DEVICE PIC16F628A, BOD_ON
@ DEVICE PIC16F628A, PROTECT_OFF
@ DEVICE PIC16F628A, LVP_OFF
@ DEVICE PIC16F628A, CPD_OFF
@ DEVICE PIC16F628A, INTRC_OSC_NOCLKOUT
'---------------------------------------------

DEFINE OSC 4 
CMCON=7

DEFINE LCD_DREG PORTB      'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT     4 'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG PORTB      'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT     2 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_EREG PORTB      'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT     3 'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS     4 'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES     2 'LCD Kaç sıra yazabiliyor


I VAR BYTE 
X VAR BYTE
ASC VAR BYTE
YER VAR BYTE
TAM VAR BYTE
ILK  VAR BYTE
SON  VAR BYTE
KES  VAR BYTE
POZ VAR BIT
 
lcdout $FE,1
pause 500


BASLA:
      X=0:YER=19:TAM=19
BIR:
   
    FOR I=YER TO TAM
    X=TAM-YER
IKI:   
    GOSUB AL
    LCDOUT $FE,$80+(YER+X),ASC
    X=X-1
    IF X<255 THEN IKI
    NEXT     
    YER=YER-1
    IF YER=255 THEN UC
     PAUSE 200
    GOTO BIR
UC:       
   ILK=0:SON=19:POZ=0
DORT:
   I=0     
   FOR X=ILK TO SON
     gosub al   
     IF ASC=255 THEN
       ASC=32
       IF POZ=0 THEN KES=SON
       POZ=1
     ENDIF 
     lcdout $fe,$80+I,asc
     I=I+1
     IF I=20 THEN I=0
   next
CIK:   
   PAUSE 200
   ILK=ILK+1:SON=ILK+19
   IF POZ=1 AND ILK>KES THEN BASLA
   goto DORT
   
AL:
lookup X,["ETENIN YAZI KAYDIRMA DENEME SURUMU BIRAZ DAHA EKLEYELIM YETMEDI",255],ASC
RETURN   
end


EDİT:
Programı yeniledim ve daha uzun mesajların kaydırılmasını sağladım. toplam 254 karektere kadar kaydırı herhalde denemedim ama kaydırılacak yazı sonunu orada yer alan 255 değerinden almaktadır. Dolayısıyla arayo doldurdukça kaydıracaktır.
Program ve simulasyon  dosyaları için link: http://etepic.com/index.php?topic=134.new#new

Mucit23

Hocam Benim için uğraştığınız için teşekkür ederim. Dün akşam Ben çok kafa yordum. Epeyide yaklaştım aslında ama hep lüzümsuz yöntemlerle yapmaya çalıştım. Olmadıda sonuçta. Aslında ben lcd ekrana kaç karakter yan yana sığacaksa okadar değişken belirleyip. O değişkenlere harfleri yerleştirerek yazıyı kaydırmayı düşünüyordum. Belki üzerine daha çok yoğunlaşsam olabilir.
Ne işe yarar bilmiyorum ama dün bende bişeyler yapmaya çalıştım.
En son bu ortaya çıktı..

Dim XPOS  As Byte
Dim YPOS  As Byte
Dim X     As Byte
Dim Z     As Byte
Dim C     As Byte
Dim XEND  As Byte
Dim SYC   As Byte
Dim CHAR  As Byte
Dim H[25]  As Byte
    DelayMS 100
    Cls
Print Font Arial____6o75
XPOS=1:YPOS=1
XEND=20:Z=0:X=0
MAiN_PROG:
  For X=Z To XEND
    GoSub KARAKTER_AL
    H[X]=CHAR     
  Next X
  Print At YPOS,XPOS,H[0],H[1],H[2],H[3],H[4],H[5],H[6],H[7],H[8],H[9],H[10],H[11],H[12],H[13],H[14],H[15],H[16],H[17],H[18],H[19],H[20]
  Inc Z
  XEND=Z+20
DelayMS 50                   
GoTo MAiN_PROG
KARAKTER_AL:
  CHAR=LookUp X,["GLCD|KAYAN|YAZI|UYGULAMASIDIR.|||||||||||||||||||||"]
Return
End
     
Include "ARIAL_S_7.txt"


İlk Bakışta Sizin yazdığınız program bana çok karmaşık geldi ama biraz oturup sakin bir kafayla incelersem anlarım.
Hocam Bu kodları saklamak lazım. Hatta Sırf bunun için bir bölüm bile açılabilir. Örnek kodlar burada toplanır. Yada bir uygulama haline getirip, Ete projelerinde yayınlayabilirsiniz. Ben Hep bu tür önemli kodları uygulama kodlarını saklarım. Mutlaka birgün ihtiyaç oluyor.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

ete

Mucit23,
Yazdım ama 10 gün sonra baksam bende ilk etapta bir şey anlamayabilirim. Ama biraz dikkatli bakarsan kolayca anlaşılıyor.
Gerçektende referans olarak saklanacak bir program parçası bence. Bu konuda piyasada pek örnekte yok galiba yada ben göremedim. Olanlar basit mantıkla yazılmış ve bu programın kaabiliyetine yaklaşamıyorlar bile.
Genel mantık şöyle;
Önce en sağdan yazılacak yazıyı alıp en Sola kadar getiriyorum. Daha sonra karekterler bitene kadar ekranda karekterleri kaydırıyorum. Karekterler bitince son karekter soldan çıkıncaya kadar kaydırmaya devam ediyorum. Hepsi bu .
Ben bu tr programlarda işaretçiler (yer tutucular) kullanmayı severim. AMa bu sayede program otomatik oldu. Karekter sayısı kaç olursa olsun ama 254 den az olmak şartı ile (neden 254 dedim onuda unuttum 255 olması gerek sanırım) her boyutta yazıyı senin istediğin şekilde kaydırıyor.  Bunu GLCD ye adapte etmek zor olmasa gerek.

KOlay Gelsin
ete

Mucit23

Hocam Dün akşam Glcdye adapte etmek için biraz uğraştım. İlk Yaptığım şey. kayan yazının protonda çalışması için gerekli(komutlar vs..) değişiklkleri yaptım. İlk denememede hiç yazı hiçbirşekilde düzgün çalışmıyordu. Sebebi Aslında Ben farkettim. Şöyle açıklayayım. İlk denememde. Yazı soldan başlıyor yavaş yavaş geliyordu İlk harf çıkıyor fakat ilk harften sonrakiler İlk harin üstüne biniyordu. Diğer harflerde aynı şekilde. Bunun sebebi ise şöyle. Karakter lcdde adresler sabit olduğu için harfi bir sütün sola kaydırmak için adresi 1 eksiltmemiz yetiyor. Protonda GLCD de olmuyor.(Proton için Karakter lcd olsaydı yine olurdu)Protonda adresi 1 eksilttiğimiz zaman harf sadece 1 pixel sola kayıyor. Diğer harflerde İlk harfin üzerine basılıyor.
Programda yazının kaydırıldığı ilk kısmı bi inceleyelim. Protonda çalışması için gerekli değişiklikleri yapmışım.

BASLA:
      X=0:YER=127:TAM=127
BIR:
   
    For I=YER To TAM
    X=TAM-YER
IKI:   
    GoSub AL
    Print At 1,(YER+X),ASC
    X=X-1
    If X<255 Then IKI
    Next     
    YER=YER-1
    If YER=255 Then UC
     DelayMS 10
    GoTo BIR

Hocam GLCD de 128 sütün olduğu için YER ve TAM değişkenlerine 127 değerini verdim. Program çalıştığında x İn değeri sıfır olduğu için İlk harf ekrana yerleştiriliyor ve adres bir azaltılıyor.Harf bir pixel sola kayıyor. Yer değeri bu sefer 126 olduğu için X değeri 1 oluyor ve ikinci harf alınıp ekrana yerleştiriliyor. İşte sorun burada oluşuyor. Diyelim İlk harf 126. sütünda ise ikinci harf hemen 127. sütüna basılıyor. Bir harf 6 sütünluk yer kaplıyor. Dolayısıyla harfler üst üste binmiş oluyor.

Bunun çözümü için aklımda iki yöntem var.
1.si şöyle;
1 harf max 6 sütün(5sütün harf datası,1 sütün boşluk) olduğu için ekranı 126 pixel olarak kabul edip yan yana kaç karakter sığacaksa okadar adres belirleyip, Aynı karakter lcd lerdeki gibi adreslere karakterleri yerleştirelim. Buda 126/6=21 karakter eder. Bu karakter adreslerini önceden beirleyip Başka bir lookup tablosundan alabiliriz.

Aklımdaki ikinci yöntem ise yine harfin pixel pixel kayması fakat bu sefer birinci harfin ardından hemen ikinci harf basılmayacak. Birinci harf basıldıktan sonra 6 sütün kadar birinci harfi kaydrıp sonra ikinci harfi ekrana basmak. Sonra yine 6 sütün harfleri kaydırıp bu sefer 3. harfi ekrana vermek çözüm olabilir. Benim aklıma bu iki yöntem geldi. Hangisi kolay olur bilemiyorum.Sizinde fikirlerinizi almak isterim.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

Powered by EzPortal