ARKADAŞLAR KEYPAD İLE LCD YE 4 BASAMAKLI YAYI YAZDIRAMADIM

Başlatan erginkavakci, 30 Aralık 2006, 14:27:56

erginkavakci

YANİ ARKADAŞLAR BEN BİR BASAMAK SAYI YAZDIRABİLDİM BENİM AMACIM HERBASMADA RAKAMLAR ARKA ARKAYA EKLENSİN VE EKRANDA ÇIKAN DEĞER BİR DEĞİŞKENE KAYDEDİLSİN  ÖRNEĞİN LCD DE ÇIKAN RAKAM GELENSAYİ VAR WORD  İÇİNE GELSİN YARDIM EDECEK ARKADAŞLARA TEŞEKKÜRLER. 8O

KOD:
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 1 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
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

dik1 var portd.0
dik2 var portd.1
dik3 var portd.2
dik4 var portd.3

yat1 var portd.5
yat2 var portd.6
yat3 var portd.7

sayi var word

sayi=0
basla:
high dik1
pause 1
if yat1=1then sayi=1
if yat2=1then sayi=2
if yat3=1then sayi=3
low dik1
pause 1

high dik2
pause 1
if yat1=1then sayi=4
if yat2=1then sayi=5
if yat3=1then sayi=6
low dik2
pause 1

high dik3
pause 1
if yat1=1then sayi=7
if yat2=1then sayi=8
if yat3=1then sayi=9
low dik3
pause 1

high dik4
pause 1
if yat1=1then gosub git1
if yat2=1then sayi=0
if yat3=1then gosub git1

low dik4
pause 1

lcdout $fe,2,"sayi=",#sayi
goto basla

git1:
lcdout $fe,1
pause 10
lcdout $fe,2,"     bos tus   "
pause 500
lcdout $fe,1
gosub basla



end
http://www.ergin.ustasi.com http://www.erbaalilar.tr.cx [email]mucit_ergin@hotmail.com[/email]

cuneytsezmis1

gosub ile alt program çağırmışsın ama alt program bitimine return yazmamışsın.onları bir kontrol etmelisin.

erginkavakci

kardeş yazımı tam okumadın heralde ben 4 veya 5,6 basamaklı sayı yazdırmak istiyorum .senin dediğin şeyin o olayla alakası yok.
http://www.ergin.ustasi.com http://www.erbaalilar.tr.cx [email]mucit_ergin@hotmail.com[/email]


erginkavakci

kardeş sorumun cevabı bu değil bu link de tarama teknikleri var ben taramayı yaptım  sorduğu o değil ben arka arkaya rakam yazdırmayı soruyorum..
http://www.ergin.ustasi.com http://www.erbaalilar.tr.cx [email]mucit_ergin@hotmail.com[/email]

ismetelk

bende yanlış anlamadıysam hesap makinesindeki gibi tuşa bastığın zaman gelen sayı var olan sayının yanına eklenecek olemi
oyleyse sanırım lcdout komutundan sonra sadece #sayı yazmışsın onun içinde de sadece 1 basamak sayı var ve hep #sayı yı gösteriyosun benim anladığım yanlış değilse 4 farklı sayıyı 4 farklı değişkenin içine atacaksın sonrada lcdout komutunuda ona gore düzenleyeceksin
mesela
1. için        lcdout $fe,2,"sayi=",#sayi
2. için        lcdout $fe,2,"sayi=",#sayi,#sayi1
3. için        lcdout $fe,2,"sayi=",#sayi,#sayi1,sayi2
gibi mi ?

tnen

interrupt oluştuğunda program alt progma dallanır burada elde ettiğin degerleri eğer bnasılan ilk sayı ise binlere atar. ikinci sayıyı yüzlere üçü onlara dörtüde birlere atar.bundan sonra yani sen rakamları elde ettikten sonra istediğini yaptır.
İstersen şarta bağlı olarak yazdır. Bu durumda 4 tane lcdout yazman gerekir. İstersen sarta bağlı olarak sayıyı hesaplattır lcdyi o şekilde yazdır.

sitenindelisi

DIM SAYI    AS DWORD
DIM TEMP    AS BYTE
DIM TUS     AS BYTE
DIM TEMP_P  AS BYTE
DIM EKRAN AS BYTE
.
MAIN:
.
.
GOTO MAIN

IF SAYI<>0 THEN
    SAYI=SAYI*10+TUS
ELSE
    SAYI=TUS
ENDIF
FOR TEMP= 15 TO 0 STEP -1 
TEMP_P =DIG SAYI,TEMP
IF TEMP_P>0 THEN
EKRAN=16-TEMP
PRINT AT 1,EKRAN, DEC SAYI
GOTO YAZ
ENDIF
NEXT


Derleme ve dolayısı ile deneme yapmadım. Belki fikir verebilir. 31 Bitlik bir sayıya kadar destek sağlar.

sitenindelisi

derleme yaptım ve bazı hatalar buldum. Düzeltilmiş hali ile değiştirdim. Önceki mesajda da belirttiğim gibi 32 bit desteği var.

armys2000

Sayın @erginkavakci hocam sizin istediğiniz @ismetelk arkadaşın bahsettiği gibi bir çalışma mı istiyorsunuz ? Topiğin geri kalanında bu soruya cevap vermediğinizi gördüm. Eğer sizin istediğiniz @ismetelk arkadaşın ki gibi bişeyse , Şöyle bir yaklaşım olabilir ; lcd kaç satır kaç sutun kullanıyorsunuz bilmiyorm ama diyelim ki 2x16  öncelikle 2 adet 16 elemanlı bir dizi oluştururum.

S1 var byte[16]   ' Satır 1
S2 var byte[16]   ' Satır 2

Bunu bir ekran kartının RAM i gibi düşünebilirsiniz 32 byte lik bir RAM

Lcd_Goster:         'Her Tuşa Basılışta Buraya Gel

LCDOUT $FE,1
LCDOUT $FE,2,#S1(15),#S1(14),#S1(13),#S1(12),#S1(11)....,#S1(0)
LCDOUT $C0  ,#S2(15),#S2(14),#S2(13),#S2(12),#S2(11)....,#S2(0)

Pause 100

Return

Gelelim Ekran RAM de Verinin Yerleşimine;

Kaç Adet Tuş Basılmış Onun Bir Sayacını Tut

SayacTus    VAR BYTE
Tus             VAR BYTE

TusKontrol :
 
   .....
   .....
   Tus  = BasilanTus                    ' Basılan Tuş
   
     for addr = 0 to 15
         
          if SayacTus = addr then

              S1[addr] = Tus

          endif

     Next addr  
     
     Gosub Lcd_Goster

     

          if SayacTus=16 then              ' Şimdilik Tek Satır İçin
             
              SayacTus = 0                    ' Sıfırla
       
          else
     
              SayacTus = SayacTus + 1  ' Sayacı bir Arttır
 
          endif

Goto TusKontrol


Çok acele yazdığım için yanlışlıklarım veya eklenti yapılacak yerler olabilir. Lütfen arkadaşlar Düşüncelerinizi belirtin. Bu sadece bir fikir vermesi bakımından yazılmış birşey..

armys2000

Sanırım bir sorun var Ram yerleşimde düzeltemeye çalışıyorum.
Çünkü basılan tuş hep bir önceki basılann tuşun soluna geçiyor .


0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8        ' İlk basılan Tuş=8

0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8        ' İkinci Basılan Tuş=4

0 0 0 0 0 0 0 0 0 0 0 0 0 6 4 8        ' Üçüncü Basılan Tuş = 6

0 0 0 0 0 0 0 0 0 0 0 0 0 8 4 6        ' Olması Gereken



Tersten yazıyor :) e olacak o kadar aceleyle yazıldı . Yerleşimde küçük bir oynama yapmak gerekecek

armys2000

@erginkavakci hocam eğer hesap makinası gibi yazılan karakterler sağdan sola doğru bir basamak kayarak yazılacaksa bu kod düzenlenmelidir.  Tam tersine siz ekrana yazarkken ekranın solundan itibaren yazacağım diyorsanız  bu kod ta sadece sayacları tersten düzenlenmesi yeterli olacak  programınn başında SayacTus=15 Degerini alarak başlayacak

.........
.........
.........

for addr= 15 to 0 step -1  

   if SayacTus= addr then
      S1[addr] =Tus
   endif

next addr

Gosub Lcd_Goster



if SayacTus=0 then ' Şimdilik Tek Satır İçin

SayacTus = 15 ' Sıfırla

else

SayacTus = SayacTus - 1 ' Sayacı bir Arttır

endif

Goto TusKontrol

erginkavakci

arkadaşlar benim yapmak istediğim keypad ile çok basamaklı sayı yazdırmak istiyorum ama biryerlerde eksiklik var ör=14562 gibi sayılar yazdırabilip bunu bir değişken e saklamak istiyorum kodların son hali=
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 1 'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_RWREG PORTB
DEFINE LCD_RWBIT 2
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

dik1 var portd.0
dik2 var portd.1
dik3 var portd.2
dik4 var portd.3

yat1 var portd.5
yat2 var portd.6
yat3 var portd.7

tus var byte
gelensayi var byte
sayaktif var byte
sayi var word
sayac var word
basamak var byte
basamak1 var byte
basamak2 var byte
basamak3 var byte
basamak4 var byte
baslama var byte


gelensayi=0



basla:
basamak1=0
basamak2=0
basamak3=0
basamak4=0

if (basamak1=0) And (gelensayi>=0) Then basamak1=gelensayi
if (basamak2=0) And (gelensayi>=0) Then basamak2=gelensayi
if (basamak3=0) And (gelensayi>=0) Then basamak3=gelensayi
if (basamak4=0) And (gelensayi>=0) Then basamak4=gelensayi
sayi=basamak1*1+basamak2*10+basamak3*100+basamak4*1000

high dik1
pause 1
if yat1=1then gelensayi=1
if yat2=1then gelensayi=2
if yat3=1then gelensayi=3
low dik1
pause 1

high dik2
pause 1
if yat1=1then gelensayi=4
if yat2=1then gelensayi=5
if yat3=1then gelensayi=6
low dik2
pause 1

high dik3
pause 1
if yat1=1then gelensayi=7
if yat2=1then gelensayi=8
if yat3=1then gelensayi=9
low dik3
pause 1

high dik4
pause 1

if yat2=1then gelensayi=0


low dik4
pause 1

lcdout $fe,2,"sayi=",#sayi
goto basla
   





end
http://www.ergin.ustasi.com http://www.erbaalilar.tr.cx [email]mucit_ergin@hotmail.com[/email]

sitenindelisi

Verilen cevapları incelediniz mi? Verdiğim rutin istediğiniz işi yapar.

erginkavakci

EVET DENEDİM OLMUYOR İSTEDİĞİMGİBİ DEĞİL ÇOK BASAMAK YAZMIYO
http://www.ergin.ustasi.com http://www.erbaalilar.tr.cx [email]mucit_ergin@hotmail.com[/email]