LCD kayan yazı devresi Değişken kaydırma sorunu

Başlatan Mucit23, 19 Ocak 2011, 19:56:11

Mucit23

Merhaba arkadaşlar

Yaptığım bi sistemde lcd de kayan yazı yapmam gerekiyor.
Ben biraz uğraştım. 4x20 lcd de yazı kaydırabildim. Fakat şöyle bir sorunum var. LCD de yazıların yanında değişkenler içerisindeki sayısal değerleride kaydırmam lazım. Yazdığım kelimeler kayarken onların yanında sayısal değerleride kelimelerle birlikte kayacak.
Örnek veriyorum;" Ahmet=12  Mehmet=6  Ali= 23" gibi olacak. İsimlerin sonundaki sayısal değerler değişebilir. Sadece isimler olsa sorun olmuyor. Fakat araya değişkenler girince bi türlü çözemedim. Nasıl bir mantık yürütebilirim.
Şimdiye kadar yaptığım çalışmalar aşağıdaki gibi bu kodlarla Yazıları kaydırabiliyorum
DEFINE OSC 4

@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE LCD_DREG		PORTB	
DEFINE LCD_DBIT		4		
DEFINE LCD_RSREG	PORTB	
DEFINE LCD_RSBIT	2	
DEFINE LCD_EREG		PORTB	
DEFINE LCD_EBIT		3		
DEFINE LCD_BITS		4	
DEFINE LCD_LINES	4

B0 VAR BYTE
B1 VAR BYTE
B2 VAR BYTE
B3 VAR BYTE

ADCON1 = 7

    Pause    500
    LCDOut $fe, 2
reset:
       B0 = 0
BASLA:      
       LCDOut $fe, 2
       For B2= 0 TO 19
       LookUp B0, ["WWW.PiCPROJE.ORG  Mucit23...                      #"], B1
       IF B1 = "#" Then GoTo reset
       LCDOut B1
       B0 = B0 + 1
       Next B2
       Pause 300
       B0 = B0 - 19
GoTo BASLA

Bunun yapabilmek için nasıl bir mantık yürütmem gerekir Bu konuda yardımlarınızı bekliyorum.

eseneren

Basıc bılmıyorum amaasagıdakı gıbı bır fonks isim + 4 hane sayıyı yazacak mısal
string yazan fonks stringyaz misal asagıdakı gıbı yazdırdım bılmem fıkır verırmı?
(PORTB 8bit data RD 6 komut data ıcın RD7 enabled pınıdır)
insigned char number,x;

main()
{
while(0)
{
stringyaz("Ali Veli")
rakam();
ekranı gaydır();
_2snbekle();
}
}

void rakam()
{
x=(number-number%1000)/1000;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;

x=((number-number%100)/100)%10;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;
//1234
RD6=1;
x=(number/10)%10;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;


x=number%10;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;
}
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

Mucit23

@senememre
İlgin için çok teşekkür ederim
Fakat anlattığın yöntemi pek anlayadım Birazdaha açıklarmısın
Bunun başka yolları yokmudur..

Mucit23

Arkdaşlar fikir ve önerilerinizi bekliyorum. En mantıklı şekilde nasıl yapabilirim.

Klein

#4
Sayılar  döviz panolarındaki gibi kayma işleminin herhangi bir anında mı değişebiliyor?
kayan metin bir tam tur atıp, yeniden başladığında sayıların değişmesi işini görüyor mu?

Eğer her tur başında değişim işini görüyorsa:
metni doğrudan LCD'ye yazdırmak yerine önce bir tampona alırsın, bu tampondaki bilgiyi lcd'ye yazıp kaydırabilirsin. Tur tamamlandığında sayıları güncelleyip tekrar kaydırmaya başlarsın.

eseneren

Basic bilmiyorum (gercı sevıyem oyle ama) Bu kod sting yazmak ıcın kullnıyorum
write("Aliveli ");
void write(const char *str)
{
RD6=1;
DelayUs(200);
while(*str)
{
DelayUs(200);
PORTB=*str;
RD7=1;
RD7=0;
*str++;
}}


Bu kodu da rakam yazmak ıcın kullanıyorum
number=23;
write();

void rakam()
{
RD6=1;
x=(number-number%1000)/1000;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;

RD6=1;
x=((number-number%100)/100)%10;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;
//1234
RD6=1;
x=(number/10)%10;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;

RD6=1;
x=number%10;
DelayMs(wait);
PORTB=48+x;
RD7=1;
RD7=0;
}// Ekrana 4 Hane seklınde sayı basar


bır noktaya gıtmek ıcın
go(2,3 misal);

void go(const char x,const char y)
{
unsigned char x2,y2;
x2=x;
y2=y;
if(x2>3)
x2=3;
if(y2>20)
y2=20;

RD6=0;
DelayUs(200);
if(x2==0)
{
PORTB=128+y2;
RD7=1;
RD7=0;
}else if(x2==2)
{
PORTB=148+y2;
RD7=1;
RD7=0;
}else if(x2==1)
{
PORTB=192+y2;
RD7=1;
RD7=0;
}else if(x2==3)
{
PORTB=212+y2;
RD7=1;
RD7=0;
}}//


bu fonksıyonları tanımladım aliveli 23 ıcın mısal
number=12;
go(x,y);
write("aliveli ");
rakam();

bunu yazınca ekanda yazdı kaydırmak ıcın lcd komutu kullanabılırsın 4x20 yapamıyorum ekranım dolu kaydırınca dıger datalar vs der ısen.
kaydırmak ıcın
yukardakı gıbı ekrana yazdıgını dusunursek  ekranayaz(); dıyelım yukarıdakılere

ekrana yaz();
(5 bosluk )aliveli=12
kaydıracak ısen
go(X,Y)
write("");// aliveli=12 kadar bosluk
rakam();
x--;
y--;
ekrana yaz();
umarım aklımdakını aktardım
Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

Mucit23

Alıntı yapılan: Klein - 19 Ocak 2011, 21:45:16
Sayılar  döviz panolarındaki gibi kayma işleminin herhangi bir anında mı değişebiliyor?
kayan metin bir tam tur atıp, yeniden başladığında sayıların değişmesi işini görüyor mu?

Eğer her tur başında değişim işini görüyorsa:
metni doğrudan LCD'ye yazdırmak yerine önce bir tampona alırsın, bu tampondaki bilgiyi lcd'ye yazıp kaydırabilirsin. Tur tamamlandığında sayıları güncelleyip tekrar kaydırmaya başlarsın.

Hocam isimlerin sonundaki sayılar herzaman değişmiyor. Sadece porgramın başında bir kez belirliyorsun öylece kalıyor ve kaymaya başlıyor. Ama menüden girip yine sayıların değerini istediğimde değiştirebilecem. Yaniprogramın başında bir kereliğine sayılara değer vereceğiz ana döngüde sayılarda herhangi bir değişme olmayacak. Ben yukarıdaki örnekte 1 den büyük değerlerde vermişim ama aslında okadarına gerek yok sadece 1 veya 0 alsa yeterli olur. Benim asıl amacım İsimlerin yanında check işareti veya çarp işareti koymak. Bunun için sayısal değer kullanmak istiyorum. Belki sizin bildiğiniz daha iyi bir yöntem vardır.

Aslında check işareti olması şart değil isimlerin yanına on veya off da olabilir (AHMET=ON, ALİ=OFF)

Bilmiyorum belki benim yazı kaydırma yöntemim kötüdür. Değişkenler olmayınca çok iyi çalışıyor fakat değişebilen değerler olunca yapamadım bi türlü
Sizin fikirlerinizi bekliyorum.

Senememre İlgin için çok teşekkür ederim ben biraz kendi kodlarımla uğraşıcam.Eğer yapamazsam SEninkilere bakıcam C dili hiç bilmiyorum malesef..

eseneren

cok farklı oldugunu sanmıyorum C nin soyle bırsey varmı?
//****************************
sting ahmetstring;
int ahmetdeger;

if(ahmetdeger==0)
ahmetstring="ahmet=on(+)";
if(ahmetdeger==1)
ahmetstring="ahmet=off(x)";
//****************************
yazı oldugunda sorunsuz calısıyor dıyorsunuz, herhangı bır degısken durumuna gore strıngı degıstırsenız.

Seçim yapmak için durum hakkında bilgi sahibi olmak zorunda değilsin, sonucuna hazır olmak için durum hakkında kaygılanırsın.  http://bit.ly/gixfTk

ete

Uzun uzun anlatmaktansa bir örnek vermek daha iyi olur diye düşündüm. Aşağıdaki örneği incelersen belki bir şeyler anlayabilirsin.
Burada iş basit gibi gözüküyor ama epeyce çetrefilli bir konu. Çetrefil meselesi otomatik bir sistem yapmaktan kaynaklanıyor. Boyu sabit bir sistem daha kolay yapılabilir. Örnekte öncelikle karekter dizisi boyu (örnekte "ETE=" olan kısım), karekterlerden sonra gelecek sayı hane adedi bu işi doğru yapmakta etken faktörler olarak karşımıza çıkmaktadır. Dolayısyla bir şekilde bunların programa buldurulup ona göre yazıyı kaydırmak gerekiyor bende onu yaptım.

ETE

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [E . T . E]                                       *
'*  Notice  : Copyright (c) 2011 [Erolectic]                    *
'*          : All Rights Reserved                               *
'*  Date    : 20.01.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4

@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   2   
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
DEFINE LCD_BITS      4   
DEFINE LCD_LINES   4

X VAR BYTE
Z VAR BYTE
W VAR BYTE
TEMP VAR BYTE
POZ var byte
I   var byte
SAYI var byte
BOY  VAR BYTE

ADCON1 = 7

    Pause    500
    LCDOut $fe, 2
reset:
       SAYI=213
BASLA: 
       GOSUB DORT                '..........sayı hane sayısını bul
       FOR I=19 TO 0 STEP -1 'ekran 20 karekter (0-19) 
       gosub BIR                     '.......önce karekterleri sağdan teker teker yerleştirmeye başla
       GOSUB IKI                    'rakam yazacak hale gelmiş ise yazdır değilse geri gel
       PAUSE 500                    'kaydıram beklemesi
       NEXT
       PAUSE 1000

GoTo BASLA

BIR: 
 for X=0 to 3 
 IF (I+X)>19 then RETURN         'ekranda yazacak yer yoksa geri dön
 LookUp X,["ETE="], W
 LCDOUT $FE,$80+I+X,W           'yazma konumunu hesapla ve karekteri koy
 NEXT
 RETURN
 
 IKI:
     FOR Z= 0 TO BOY                 'SAYI nın boyu kadar döngü kur
       IF(I+X+Z)>19 THEN UC     'sayı ekrandan taşacak ise atla
       W=SAYI DIG (BoY-z)         'yazılacak sayıyı al 
       LCDOUT $FE,$80+I+X+Z,DEC W      've ekrana yaz
UC:       
       NEXT
       IF (I+X+BOY)<19 THEN LCDOUT $fe,($81+I+X+BOY),32 'şayet sağdan sola giderken en son karekter boşa düşmüş ise onu sil
       RETURN       
 
DORT:  'bu kısımda sayı değişkeninde yer alan sayının hane sayısı tespit ediliyor.
     LCDOUT $FE,$C0,"SAYI=",DEC SAYI
     FOR Z=0 TO 4
       IF SAYI DIG Z=0 THEN 
          IF Z>0 THEN
             BOY=Z-1
           ELSE
             BOY=Z
          ENDIF           
          RETURN 
       ENDIF  
     NEXT
     RETURN

Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Çok teşekkürler hocam yapmak isteğim şey tam olarak buydu.
Hocam aynı mantıkla birden fazla değeri göstermek istesek sorun çıkmaz değilmi.
Diyelim sayı1=213, say2=14, sayı3=25, Sayı4=10 değerlerimiz olsa bunları farklı isimlerin sonlarına getirmek istersek Aynı mantıkla olur değilmi taplodan harf al ekrana yarleştir sayı sırası geldiğinde sayı hanesini hesapla uygun haneyi ekrana yerleştir. Bunların dışında programa daha ekleme yapmam gerekirmi.

ete

İşlemi yapıp başa dönmeden önce SAYI=SAYI-1 de bakalım ne olacak
Denemsi bedava.
Gerçi ben başka türlü denedim.
Önce bir başka karekter dizisi veren bir alt program ilave ettim;
YUZ:
     for x=0 to 5
      IF (I+X)>19 then RETURN
      LookUp X,["YENISI="], W
 LCDOUT $FE,$80+I+X,W
 NEXT
 RETURN


Sonra programa birkaç satır ilave ettim;

        SAYI=213
BASLA: 
       GOSUB DORT 
       FOR I=19 TO 0 STEP -1
       gosub BIR         
       GOSUB IKI
       PAUSE 100
       NEXT
       PAUSE 500
       SAYI=36
       for I=19 to 0 step -1
       gosub yuz
       gosub iki
       pause 100
       next
       pause 500
       goto basla

Bu şekilde hem sayı değeri hemde karekter dizilişi değişmiş oldu yine çalıştı.
Ama ne gerek var böyle şeylere bilmem. Daha hiç bir şey yapmadın nerdeyse 800 küsur word program hafızasından yenmiş oldu.
Bence son derece lüzumsuz işler. Birde deveye hendek atlatıyorsun üstelik.
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Hocam programı çok kasıyor galiba Aslında iyeni sistemimde 18F252 kullanmayı düşünüyorum. Bunun mantığını anlamaya çalışıyorum.
Aslında sisteme böyle bişey eklersem çok güzel olacak ama nasıl. Sonuçta pic sadece bu yazıları kaydırmakla uğraşmıyacak. Saat okuma,  Röle kontrol işlemleri gibi bir çok işlem olacak. LCD de kayan yazı oluşturmada bir çok for döngüsü var. Bu for döngülerindeyken diğer işlemler aksayacaktır.  For döngülerinde pause komutları var. Bu sırada kesme gelirse kesmeye gitmeyecektir. Bundan sonra karşılaşabileceğim olumsuzlukların çoğunu saydım zaten. Pic sadece bu işle uğraşsa herhangi bir sorun olmaz. Diğer işlerde eklenince gerçektende deveye hendek atlatmaya benziyor. Şimdi yavaş yavaş aklıma yatıyor. Tasarımımı  epeyi bir gözden geçirmem gerekecek. Belkide kayan yazı olmasa bile belirli sürelerle ekranın üst kısmında bilgileri gösteririm.  Buda olabilir. Şimdilik aklıma gelenler bunlar LCD ekranı bi türlü paylaşamıyorum :D



ete

Verdiğim örnek aslında tam olarak istenilenide karşılamıyor bence. Zira sola kaymada en son noktada karekteri orada bırakıyor.
Onuda kaydırıp ekranı sıfırlayacak hale getirmek ise başlı başına bir düğüm. Onuda yaptım ama ekranda basitçe bir ETE=123 yazısını kaydırmak için neredeyse komplike bir program yazmış oldum. Yine tekrarlıyorum bence gereksiz bir iş.

Ete

'****************************************************************
'*  Name    : KAYDIR.BAS                                      *
'*  Author  : [E . T . E]                                       *
'*  Notice  : Copyright (c) 2011 [Erolectic]                    *
'*          : All Rights Reserved                               *
'*  Date    : 20.01.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4

@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   2   
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
DEFINE LCD_BITS      4   
DEFINE LCD_LINES   4

X VAR BYTE
Z VAR BYTE
W VAR BYTE
TEMP VAR BYTE
POZ var byte
I   var byte
SAYI var byte
BOY  VAR BYTE
BAS  VAR BYTE
KARBOY VAR BYTE
BOY_SAYI VAR BYTE
YER VAR BYTE
ADCON1 = 7

    Pause    500
    LCDOut $fe, 2
reset:
       SAYI=123
BASLA: 
       GOSUB DORT 
       FOR I=19 TO 0 STEP -1
       gosub BIR         
       GOSUB IKI
       PAUSE 100
       NEXT
'       PAUSE 100
'       SAYI=234
'       for I=19 to 0 step -1
'       gosub yuz
'       gosub iki
'       pause 100
'       next
'       pause 100
       
       GOSUB DORT
       KARBOY=3
       BOY_SAYI=2
       YER=6
       FOR I=0 TO YER
        LCDOUT $FE,$80
'        KARBOY=255
       IF KARBOY<>254 THEN 
          GOSUB KARAKTER_YAZ
          KARBOY=KARBOY-1
       ENDIF
       GOSUB SAYI_YAZ
       IF BOY_SAYI=>0 AND KARBOY=254 THEN BOY_SAYI=BOY_SAYI-1        
atla:
       LCDOUT 32
       PAUSE 100
       NEXT
       LCDOUT $FE,$80,REP 32\10
       PAUSE 500   
       goto basla
BES:  
       
       TEMP=X+BOY-1
       FOR I=0 TO TEMP
         FOR Z=BAS TO X-1
           LOOKUP Z,["ETE="],W
           LCDOUT $FE,($80+I), W
         NEXT
'         LCDOUT DEC SAYI 
         FOR Z= BOY TO 0 STEP-1
          LCDOUT  DEC (SAYI DIG Z) 
         NEXT
         lcdout 32
'          LCDOUT $FE,$D4,"YER=",DEC TEMP, " X=",DEC X," I=",DEC I
         PAUSE 500
        NEXT  
        LCDOUT $FE,$80,REP 32\20 
        BAS=BAS+1':X=X-1
         PAUSE 500
         IF X>0 THEN GOTO BES 
         
GoTo BASLA
'---------------------------------------------------------------------------------
KARAKTER_YAZ:                                                                     
'          KARBOY=3 'bu yazılacak karekter dizisi boyudur. Normalde lookupdan ölçülebilir
          temp=3-KARBOY
          FOR X=TEMP TO 3                                                                        
           LOOKUP X,["ETE="],W
           LCDOUT W
          NEXT
          
          RETURN
SAYI_YAZ:
         'BURAYA GELİNDİĞİNDE BOY_SAYI BİLİNMİŞ OLMASI GEREKİYOR
         X=BOY_SAYI
SAY_BIR:
           LCDOUT DEC (SAYI DIG X)
           X=X-1 :IF X<254 THEN SAY_BIR
         RETURN
                      
BIR: 
 for X=0 to 3 
 IF (I+X)>19 then RETURN
 LookUp X,["ETE="], W
 LCDOUT $FE,$80+I+X,W
 NEXT
 RETURN
 
 YUZ:
     for x=0 to 5
      IF (I+X)>19 then RETURN
      LookUp X,["BIRIN="], W
 LCDOUT $FE,$80+I+X,W
 NEXT
 RETURN
 IKI:
     FOR Z= 0 TO BOY
       IF(I+X+Z)>19 THEN UC
       W=SAYI DIG (BoY-z)
       LCDOUT $FE,$80+I+X+Z,DEC W      
UC:       
       NEXT
       IF (I+X+BOY)<19 THEN LCDOUT $fe,($81+I+X+BOY),32
       RETURN       
 
DORT:
'     LCDOUT $FE,$C0,"SAYI=",DEC SAYI
     FOR Z=0 TO 4
       IF SAYI DIG Z=0 THEN 
          IF Z>0 THEN
             BOY=Z-1
           ELSE
             BOY=Z
          ENDIF           
          RETURN 
       ENDIF  
     NEXT
     RETURN
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mucit23

Hocam katılıyorum size Bu kadar zor olacağını hiç düşünmemiştim. Zaten sırf kayan yazı başlı başına bir program oldu. Tasarımımı epeyi bir gözden geçirmem lazım. Ekranı en verimli şekilde nasıl kullanabilirim onu düşünüyorum.

ete

Zorluktan ziyade karmaşık bir sistem. Sonradan , dizi değişkeni kullanılarak bu işi nasıl yaparız diye düşündüm ve aşağıdaki programı yazdım.
Bu diğerine nazaran daha akıllıca ve anlaşılabilir bir sistem. Sütelik iki ayrı bilgiyi kaydırdım ekranda. Bunu kullanabilirsin sanırım.
Her şey açık bakınca kolay anlarsın gibime geliyor. Yazının ekranın her iki tarafından sıfırdan girip kaybolabilmesi için dizi boyutunu büyük tuttum. Gerekirse dahada büyütülebilir. Daha az program kodu ile daha iyi bir iş çıkartıyor bu program.
Bu yenisinde sayı değerlerini de program içinde değiştiriyorum. Birisi artıyor diğeri eksiliyor. Bu şekilde sayıların değiştiğinide izleyebilirsin.

Kolay Gelsin
Ete
'****************************************************************
'*  Name    : KAYDIR2.BAS                                      *
'*  Author  : [E . T . E]                                       *
'*  Notice  : Copyright (c) 2011 [Erolectic]                    *
'*          : All Rights Reserved                               *
'*  Date    : 20.01.2011                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE OSC 4

@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_ON
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC

TRISA=%00000000
TRISB=%00000000
TRISC=%00000000
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE LCD_DREG      PORTB   
DEFINE LCD_DBIT      4      
DEFINE LCD_RSREG   PORTB   
DEFINE LCD_RSBIT   2   
DEFINE LCD_EREG      PORTB   
DEFINE LCD_EBIT      3      
DEFINE LCD_BITS      4   
DEFINE LCD_LINES   4

SAYAC VAR BYTE
W     VAR BYTE 
TEMP  VAR BYTE 
I     var byte 
SAYIA  var byte 
SAYIB  VAR BYTE
SAYI  var byte
BOYSAYI VAR BYTE 
KAR  VAR BYTE
BOY  VAR BYTE
DIZI  VAR BYTE[34]

ADCON1 = 7

    Pause    500
    LCDOut $fe, 2
reset:
       SAYIa=1:SAYI=SAYIA
       SAYIB=255
       GOSUB SAYI_AL
       GOSUB KAREK_BIR
BASLA: 
      GOSUB KAYDIR
      SAYAC=SAYAC+1:IF SAYAC<33 THEN BASLA
      SAYAC=0:GOSUB SIL
      SAYIB=SAYIB-1:SAYI=SAYIB
      GOSUB SAYI_AL
      GOSUB KAREK_IKI
BASLA_IKI:      
      GOSUB KAYDIR
      SAYAC=SAYAC+1:IF SAYAC<33 THEN BASLA_IKI
      SAYAC=0:GOSUB SIL  
      SAYIa=SAYIA+1:SAYI=SAYIA
      GOSUB SAYI_AL
      GOSUB KAREK_BIR    
      GOTO BASLA      
        
'-------------------ALT PROGRAMLAR----------------------------------------------

KAYDIR:
        FOR I=33 TO 0 STEP-1
        IF (I+$80)>$93 THEN BASLA_BIR
         LCDOUT $FE,$80+I
         IF DIZI[I]>0 AND DIZI[I]<10 THEN 
           LCDOUT DEC DIZI[I]
         ELSE
           LCDOUT DIZI[I]
         ENDIF
BASLA_BIR:         
      NEXT
      TEMP=DIZI[0]
      FOR I= 0 TO 33
       DIZI[I]=DIZI[I+1]
      NEXT
      DIZI[33]=TEMP
      PAUSE 100
      RETURN

SAYI_AL:
        for I=0 to 2
          temp=SAYI DIG I
          IF TEMP=0 THEN SAYI_BIR
          DIZI[33-I]=TEMP
        NEXT
SAYI_BIR:
         BOYSAYI=I
        RETURN                    
KAREK_BIR:
         FOR I=0 TO 10 
           LOOKUP I,["BIRINCI=#"],W
           IF W="#" THEN 
             BOY=I
             GOTO BIRBIR
           ENDIF  
         NEXT          
BIRBIR:         
         FOR I=0 TO 10
           LOOKUP I,["BIRINCI=#"],W
           IF W="#" THEN RETURN
           DIZI[34-BOY-BOYSAYI+I]=W
         NEXT
         RETURN
         
KAREK_IKI:  
         FOR I=0 TO 10 
           LOOKUP I,["IKINCI=#"],W
           IF W="#" THEN 
             BOY=I:
             GOTO KAREK_IKIBIR
           ENDIF  
         NEXT 
KAREK_IKIBIR:          
         FOR I=0 TO 10
           LOOKUP I,["IKINCI=#"],W
           IF W="#" THEN RETURN
            DIZI[34-BOY-BOYSAYI+I]=W
         NEXT
         RETURN
    
SIL:
    FOR I=0 TO 33
      DIZI[I]=0
    NEXT
    RETURN       
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com