Keypad ile 4 basamaklı sayı girme

Başlatan frederic, 14 Şubat 2011, 14:38:34

frederic

Merhabalar,keypad ile yaptığım bir uygulamada keypaddan girilen sayıları teker teker ekranda görebiliyorum fakat 4 basamaklı bir sayı giremedim,bu konuda aşağıdaki koda bir ekleme yapabilirseniz sevinirim,hoşçakalın.

[Device = 18F452
Xtal 20					

Declare LCD_ENPin PORTD.3 
Declare LCD_RSPin PORTD.2 
Declare LCD_Interface 4 
Declare LCD_Lines  2 
Declare LCD_DTPin PORTD.4
Declare KEYPADPORT PORTB

Dim D0 As Word
Dim D1 As Word
Dim D2 As Word
Dim D3 As Word

All_Digital =  TRUE		
PortB_Pullups = TRUE 	


BASLA:

D1 = InKey
D2 = LookUp D1,[1,2,3,255,4,5,6,255,7,8,9,255,10,0,11]

Print At 1,1,Dec D2,"   "

DelayMS 100
GoTo BASLA
End

/code]

ete

Bu iş için 10 tabanına göre sayı sisteminin basamak özelliğini kullanabilirsin.
SAYI=SAYI*10+D2
Print At 1,1,Dec D2,"   ",dec SAYI

şeklinde her sayı girişinde basamağında bir arttığını izleyebilirsin. Ancak dikkat Word tipi sayılar en fazla 65535 değerini alabilir. Sayı 4 basamaklı ise en büyük 9999 olabilir. O halde sayının 10000 yada daha büyük olması durumunda sayıyı sıfırlamak yada başka bir şey yapmak gerekebilir.

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

frederic

Sayın ETE hocam yardımınız için çok teşekkür ederim,dediklerinizi deniyorum fakat nedendir bilmem,lcd ekranda işlem en az 15 kere tekrarlanıp sonuç olarak 1 e bastığımda 29127 sayısı çıkıyor.

Verdiğiniz algoritma çok mantıklı fakat ben beceremiyorum sanırım,hoşçakalın.

BASLA:

D1 = InKey
D2 = LookUp D1,[1,2,3,255,4,5,6,255,7,8,9,255,10,0,11]

D3 = D3 * 10 + D2
Print At 1,1,Dec D3,"   "

DelayMS 100
GoTo BASLA
End

ete

Birşeylerin becerilemediği ortada ancak benim anlayabilmem için şema ve programın bütünü gerekiyor.
Yoksa bu mantık benim süreki kullandığım bir mantıktır ve kesinlikle çalışır.
İşi bozan şey muhtemelen arada lookup tablosundan 255 gelme ihtimalidir. Bunu hesaba katarak D2 için 255 okunması durumunda yeniden okuma satırına dönülmesi gerekir.

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

frederic

Buyrun hocam ekledim dökümanları,yapabilseydim rahatsız etmezdim sizi tekrar teşekkür ederim.

http://hotfile.com/dl/104698819/d602549/keypad.rar.html

frederic

Arkadaşlar yokmu yardım edecek kimse!

ete

#6
Şu anda makinamda kurulu proton derleyicisi olmadığı için gerektiği şekilde bakamıyorum . Ancak çalışan kısma bakınca ortada bir değişken sıfırlama problemi olduğunu zannediyorum. Zira tek bir tuşa bile basarsan ekrandaki rakamlar kendi kendine artıp gidiyor. Bu ise sistemin sürekli bir tuşa basılmış gibi hesap yaptığını gösteriyor. Muhtemlen sorun hiç tuşa basılmadığı anda D1 değerinin standart bir değer alması ve bunun hesaba etki etmesidir.
Zira Poroton Help inde tuşa basılmadığı zaman D1 değerinin 16 değerini aldığını açıklıyor. Ama program çalışınca bunun öyle olmadığınıda görebiliyorum. Bu durumda sorun yalnızca basılan bir tuşun değerinin ikincu tuşa basılıncaya kadar aynı kalması olabilir. Bunu test etmek için programı aşağıdaki şekilde değiştirmeni istiyorum.
BASLA:

D1 = InKey
D2 = LookUp D1,[1,2,3,255,4,5,6,255,7,8,9,255,10,0,11]
D3 = D3 * 10 + D2

Print At 1,1,Dec D3,"   "
D1=0:D2=0
DelayMS 150
GoTo BASLA
End


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

subram

#7
http://forum.320volt.com/topicseen,/pic-projeleri-devreler/tus-takimi-yardim-1372.new.html#new

hocam burada sizin konunun aynısı var fakat 3 basamaklı ve basic ile yazılmış. biraz incelerseniz mantığı kavrayabilirsiniz. bende yardımcı olmaya çalışırım.
http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz

Maxim

inkey komutunu hiç kullanmadım
protonda tuşa basılmadığı zaman 16 rakamı gidiyormuş sabit, onun ışığında şöyle bir kod parçası buldum
word tipinde 4 haneli sayı girilemiyor ama temelde nasıl çalıştığına dair bir fikir verir belki
bunda da sorun var ,1 2 ve 3 tuşlarından sonra rakamlar hatalı çıkıyor ,mesela 5 yerine ekrana 6 geliyor, 8 yerine 10
ama çalışıyor .

Dim KEY As Byte ' New key
Dim oldKey As Byte ' Save oldKey for comparison
KEY = 16 ' start key with no_key_press value 
oldKey = 16 ' start oldKey with no_key_press value

start:
KEY = InKey ' read new key
DelayMS 50 ' debounce
If KEY = oldKey Then start ' while no_key_prees or pressing same_key goto start
If KEY != 16 Then ' if a valid_key is pressed (any value different from 16)
KEY = KEY + 1 ' add 1 to compensate the offset , the fist key is 0
'Cls ' clear the LCD
Print At 1,1 ,Dec KEY , " " ' print the new key
EndIf
oldKey = KEY ' then oldKey is now = KEY for comparison again 
' you have to release this key before you can print another
GoTo start ' loop

frederic

#9
Sayın hocalarım yardımlarınız için ayrı ayrı teşekkürlerimi sunuyorum;

Sayın ETE hocam dediğiniz değişikliği yaptım fakat sonuç alamadım,bunun sebebi ise ne lookup satırı nede başka bir şey,çok tuhaf ama isterseniz sizlerde deneyin,

PROTON D3 = D3 * 10 FORMULÜNÜ HESAPLAYAMIYOR!!!

İsterseniz bütün programı silin ve sadece bu formulü yazıp başlangışta D3'e sabit bir değer atayıp işlemi gözleyin.Böylesine yetenekli bir yazılım dilinin bunu yapmasına ben anlam veremedim.

Sayın ramoon ve Maxim hocalarım verdiğiniz örneklerini inceleyip sonuca vardığımda burda paylaşacağım,paylaşımlarınız için teşekkürlerimi sunuyorum,hoşçakalın...

Edit:Maxim hocam yukarıda verdiğim örnekte sorun sadece formulün işlemeyişi yoksa sayılar teker teker olmak şartıyla ekranda görülebiliyor,bu yönde bir sorun yok. print at satırına D2 yazarsanız sizde gözlemleyebilirsiniz bunu.


Maxim

Alıntı yapılan: frederic - 15 Şubat 2011, 15:11:17
Sayın hocalarım yardımlarınız için ayrı ayrı teşekkürlerimi sunuyorum;

Sayın ETE hocam dediğiniz değişikliği yaptım fakat sonuç alamadım,bunun sebebi ise ne lookup satırı nede başka bir şey,çok tuhaf ama isterseniz sizlerde deneyin,

PROTON D3 = D3 * 10 FORMULÜNÜ HESAPLAYAMIYOR!!!

İsterseniz bütün programı silin ve sadece bu formulü yazıp başlangışta D3'e sabit bir değer atayıp işlemi gözleyin.Böylesine yetenekli bir yazılım dilinin bunu yapmasına ben anlam veremedim.

Sayın ramoon ve Maxim hocalarım verdiğiniz örneklerini inceleyip sonuca vardığımda burda paylaşacağım,paylaşımlarınız için teşekkürlerimi sunuyorum,hoşçakalın...

bence sen havasız kaldın, biraz mola ver çık dolaş
D3 = D3 * 10 formül hesaplamama işi baya iddalı oldu çünkü  ;)

D3 byte mı tanımladın ? da çarpım sonucu değerin 255 üzeri kaldı yoksa ?

frederic

#11
Programı incelerseniz eğer D3 değişkenini word olarak atadığımı görebilirdiniz.

Hava almayı evet bende düşündüm sizin gibi ama sonuç değişmedi,dediğimi denedikten sonra yazsaydınız buraya daha hayırlı olurdu.

Bu arada ben size sayın diye hitap ederken sizin bana sen demeniz yakışıksız kaçıyor,üslubumuza dikkat edelim.

Maxim

#12
hemen kızma kötü bir niyetim yok

gerek olmamasına rağmen denedim zaten
çok daha karışık formüller hesaplıyorum ben protonda

hatta bu şekilde denedim..

Dim D0 As Word
Dim D1 As Float
Dim D2 As Word
D2 = 20
Dim D3 As Word
D3 = 50

D3 = D3 * 10
D0 = (D3 * 10) + D2
D1 = D0 / 2
D1 = D1 + 10
D1 = D1 / 500


edit:
en son D1 = 5.04

frederic

Bir konuya uzun süre tek bir yerden bakılırsa eğer gerçektende bazı şeyleri göremiyor insan,programdaki
D3=D3*10 satırı haliyle sonsuz bir döngüde olduğu için rakamı ekranda hiç bir zaman sabit göstermiyor,sonucu alıyor tekrar 10 ile çarpıyor vs. böyle katlanarak devam ediyor.Bende bunu o an için algılayamadığımdan bu sürekli katlanarak yükselmeleri hata olarak algıladım özür diledim.

Maxim

önemli değil, hepimize oluyor aynı şey