Tuş takımından 3 haneli sayı almak

Başlatan chailuck, 03 Nisan 2011, 12:18:51

chailuck

Uzunca bir aranın ardından merhabalar,
Arkadaşlar benim cevabını aradığım soru şu, tuş takımından tek haneli sayı almakta bir sıkıntım yok, fakat (algoritma da olabilir acık kaynak koduda olabilir) ben 255 yada 100 yada her ne ise 3 haneli bir sayıyı tus takımından nasıl alabilirim?
tuş takımından 1 rakamına basıp bunu bir değişkene kaydedebilirim, ama sıralama önemli, 1e bastım arkasından 2ye bastım sonra 3e, ekranda bunu 123 şeklinde gösterip word yada byte değişkeninde 123 desimal sayısınıda saklayabilir miyim?
nerede kullanacağıma gelirsek, bunu daha önce potansiyometre ile yapmıştım potu analog pine bağlayıp değeri okutup kayıt ettim sonra o değeri pwm çıkışı almada kullandım, pwmi ise lede bağladım parlaklık ayarlamak içindi bu.
bunu tus takımı ıle yapmak ıstıyorum parlaklık ıcın 0 255 arası deger gırıp 0 da sönük 255de full yanık olmasını istiyorum. ara değerlerde ise değerinin pwm karşılığı ne ise o kadr parlaklık versin.
tuş takıım ile ilgili program parçası olsa bile çözerim bunu.
Yardım ederseniz sevinirim.( bu arada eskisi kadar sık giremiyorum sorularınız olursa geçte olursa yazarım )
Teşekkürler, saygılar.
İmkanın sınırlarını görmek için imkansızı denemek lazım. (Fatih Sultan Mehmet)  Ayıplarını gördüğünüz komşuyu kınamayınız. Sırlarını açıklamayınız.Çünkü gördüğünüz bu sır size emanettir, emanete hıyanet kötü ve çirkin bir filldir. (Hacı Bayramı Veli )  meyve veren ağacın taşlanması çok hoş ;)

private_korsan

uygun olurmu bilmiyorum ama aklıma değişik bir fikir geldi tuş takımından girilen ilk değeri 100 ile çarpsak ikinci değeri 10 ile çarpsak son girilen değeride 1 ile çarpsak ( yani hiç çarpmasak) sonra bu üç değeri toplasak 3 haneli sayıyı elde etmiş olmazmıyız yada bu yöntem çokmu uzun oldu acaba

private_korsan

örneğin girilen sayı 196 diyelim
tuş takımından ilk olarak 1 e basılacak     1*100=100
tuştakımından 2.olarak 9 a basılacak        9*10=90
son olarak ta 6 ya basılacak                                6


100+90+6=196

scaemteitn

private_korsan arkadaşın dediği yöntem kullanılan bir yöntemtir. örneğin her karakter değeri geldiğinde bir değişkene atıp o değişkeni kendisi ile çarpıp toplayabilirsiniz.

196 rakamını tekrar ele alalım. önce 1 e basıldı

1 rakamını değişkene atalım. ilk adımda sayı değişkeni 0 olduğu için kendisi ile çarpımı 0 olacaktır ve b değişkenine atadığımız değer ile topladığımızda sayı 1 olacaktır. sonra 9 rakamı geldiğinde b değişkenine atarız. formülden yola çıkarsak sayı  değişkeninde şuan 1 var ve 1*10=10 ve 10+9 =19 rakamı ortaya çıktı. ve son rakam olan 6 ya basarız ve 196 olur. burada dikkat edilecek husus buton korumasıdır. sadece butona basıldığıda işleyecek ve butona basıldıktan sonra 1 kere işleyecek bir kod yazmanız gerekli. Aksi takdirde kod defalarca işler ve istediğinz sonuç gerçekleşmez

b=1;  //sırası ile 1-9-6
sayi = (sayi*10)+b;




chailuck

evet arkadaşlar zaten bu şekilde yapmayı denedim ancak
benim tuş okuma fonksiyonum şu şekilde.
tusal:                     
sata=1:satb=0:satc=0:satd=0
if suta=1 then tus=1
pause 5           
if sutb=1 then tus=2
pause 5
if sutc=1 then tus=3
pause 5
if sutd=1 then tus=4
pause 5
sata=0:satb=1:satc=0:satd=0
if suta=1 then tus=5       
pause 5
if sutb=1 then tus=6
pause 5
if sutc=1 then tus=7
pause 5
if sutd=1 then tus=8
pause 5
sata=0:satb=0:satc=1:satd=0
if suta=1 then tus=9
pause 5
if sutb=1 then tus=10
pause 5
if sutc=1 then tus=11
pause 5
if sutd=1 then tus=12
pause 5
sata=0:satb=0:satc=0:satd=1
if suta=1 then tus=13
pause 5
if sutb=1 then tus=14
pause 5
if sutc=1 then tus=15
pause 5
if sutd=1 then tus=16
pause 5
return

bunun ustune bana bır kod ekleyebılr mısınız?
kod su sekılde ılk bastıgımız tusu tanıyıp bır degısekene kaydetsın ıkıncıyı de anlasın ucuncuyude anlasın onuda kaydetsın ben matetıksel kısmını halletsem nasıl olur =)
İmkanın sınırlarını görmek için imkansızı denemek lazım. (Fatih Sultan Mehmet)  Ayıplarını gördüğünüz komşuyu kınamayınız. Sırlarını açıklamayınız.Çünkü gördüğünüz bu sır size emanettir, emanete hıyanet kötü ve çirkin bir filldir. (Hacı Bayramı Veli )  meyve veren ağacın taşlanması çok hoş ;)

scaemteitn

tusal etiketine girdikten sonra tus değişkenine tuşlardan gelmeyen bir değer atarız. Çünkü herhangi bir butona basılmışmı basılmamış mı bakmamız lazım. 9 dan sonraki rakamları kullanmazsın aksi takdirde karışıklıl yapabilir.

main:

  gosub tusal
  if b=0 and tus<10  and sayi<99 then
     sayi=(sayi*10)+tus;
      b=1
  endif

  if tus=17 then b=0                  'eğer tuş bırakılmamışsa tuşla işlem yapma ;D
goto main

tusal:
tus=17                                        '*********************
sata=1:satb=0:satc=0:satd=0
if suta=1 then tus=1
pause 5           
if sutb=1 then tus=2
pause 5
if sutc=1 then tus=3
pause 5
if sutd=1 then tus=4
pause 5
sata=0:satb=1:satc=0:satd=0
if suta=1 then tus=5       
pause 5
if sutb=1 then tus=6
pause 5
if sutc=1 then tus=7
pause 5
if sutd=1 then tus=8
pause 5
sata=0:satb=0:satc=1:satd=0
if suta=1 then tus=9
pause 5
if sutb=1 then tus=10
pause 5
if sutc=1 then tus=11
pause 5
if sutd=1 then tus=12
pause 5
sata=0:satb=0:satc=0:satd=1
if suta=1 then tus=13
pause 5
if sutb=1 then tus=14
pause 5
if sutc=1 then tus=15
pause 5
if sutd=1 then tus=16
pause 5
return

jackal183

kardeş ben bunu daha önce yapmıştım, öncelikle tuşa bastığında o tuşu sadece bir kez alması için en üstte global şu tanımlamayı yapmalısın,
char tusaktif=1, sontus=0;


daha sonra tuş oku alt porgramının en üst satırında da şu işlemi yapmalısın

tus=0;

en alt satırında ise;


if((tusaktif>0)&&(sontus==tus)){
        	tus=0;
        }
        else{
        	tusaktif=tus;
        	sontus=tus;
        }


yaptığım benzer uygulama burda ;

https://www.picproje.org/index.php/topic,32304.msg226016.html#msg226016

3 elemanlı sayıya gelince de onu da yapmıştım, şimdi kodları bulamadım ama, şöyle yapmıştım, 3 elemanlı bir dizi açmıştım, okuduğum tuşları sırasıyla elemanlarına atamıştım, sonra bu 3 elemanı yukarıda bahsettiğin işleme tabi tuttum, olmuştu sağlıklı çalışmıştı. ben de tuş takımından girilen bu 3 değer ile motor hızını değiştirmiştim, 0'da motor hiç dönmüyor, 255'te maksimum hızda dönüyordu, kodları bulabilirsem yine yardımcı olurum

chailuck

Alıntı yapılan: jackal183 - 04 Nisan 2011, 08:19:23

3 elemanlı sayıya gelince de onu da yapmıştım, şimdi kodları bulamadım ama, şöyle yapmıştım, 3 elemanlı bir dizi açmıştım, okuduğum tuşları sırasıyla elemanlarına atamıştım, sonra bu 3 elemanı yukarıda bahsettiğin işleme tabi tuttum, olmuştu sağlıklı çalışmıştı. ben de tuş takımından girilen bu 3 değer ile motor hızını değiştirmiştim, 0'da motor hiç dönmüyor, 255'te maksimum hızda dönüyordu, kodları bulabilirsem yine yardımcı olurum

çok sevinirim, aslında bir algoritma üzerinde çalışıyorum sorunsuz çalışırsa burada paylaşacağım.
Zamanını ayıran her arkadaşıma teker teker teşekkür ederim.
İmkanın sınırlarını görmek için imkansızı denemek lazım. (Fatih Sultan Mehmet)  Ayıplarını gördüğünüz komşuyu kınamayınız. Sırlarını açıklamayınız.Çünkü gördüğünüz bu sır size emanettir, emanete hıyanet kötü ve çirkin bir filldir. (Hacı Bayramı Veli )  meyve veren ağacın taşlanması çok hoş ;)

OG

Proton'a geçmeni tavsiye ederim, INKEY komutu işi bitirir.

istediğin program,
http://hotfile.com/dl/113251168/1e3b98b/tus.rar.html


Device = 16F628A
Config BOREN_ON, CP_ON, DATA_CP_OFF, PWRTE_OFF, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT
Declare Xtal 4 
All_Digital = TRUE

TRISA =%00000000
TRISB =%11111111
Keypad_Port = PORTB
PortB_Pullups = 1

Dim Num As Byte
Dim Key As Byte
Dim Number As Word 

Dim s_1 As Byte
Dim s_2 As Byte
Dim s_3 As Byte
Dim s_4 As Byte
Dim s_5 As Byte

Dim eski_s_1 As Byte
Dim eski_s_5 As Byte

Dim esas_sayi As Word 

Dim kontrol_sayi As Dword 



PORTA.2 = 1
DelayMS 500

GoSub sil
                                                    

Loop:
    Number = 255     
    Key = 255        


        Num = InKey                                                              ' Basılı tuş değerini al, bu değer 0 den 16 ya kadardır
        If Num = 16 Then Loop                                                    '' 16 = tuş basılı değilse alınan değerdir, basılmamışsa başa dön
        
        ''' 0 dan 16 ya alınan Num değerini Key değerine LookUp ile sıralamalı atayalım
        ''' Key değerine atamamızın sebebi kullanılan tuş takımının üzerindeki rakam sıralamasına uysun diyedir.
        ''' Kullanılan Tuş takımı buna uygun ise LookUp satırına gerek yok direk Key = Num denebilir
''                       [0,1,2, 3,4,5,6,7,8,9,10,11,12,13,14,15,16]        '' Num değişkeninin alacağı değer 16 = tuş basılı değilse alınan değer
        Key = LookUp Num,[1,4,7,10,2,5,8,0,3,6,9 ,11,12,13,14,15,16]        '' * = 10 
'        Key = Num                                                           '' Tuş takımı sıralaması uygun ise
        
        If Key > 10 Then Loop                                                   '' Kullanmak istenmeyen tuşları görme başa dön
        
        ''   *  yani Key = 10 tuşu ( Num = 9 a karşılık gelir)
        If Key = 10 Then                                                         ''' Tuş  * yani 10 ise
            GoSub sil                                                            ''' değerleri sıfırla
            SerOut PORTA.2 , 813 , [ " TUSLAR SILINDI ",13,10]
            GoTo tus_birak
        EndIf

        GoSub kaydir
        GoSub hesapla
        GoSub deger_goster
        
GoTo tus_birak


tus_birak: 
    Number = 255     
    Key = 255        

        Num = InKey
        
        If Num <> 16 Then tus_birak       ''' Tuş basılmayınca alınan değer 16 dır, basılmamasını bekliyoruz.
        DelayMS 50
GoTo Loop


sil:
    s_1 = 0 
    s_2 = 0 
    s_3 = 0 
    s_4 = 0 
    s_5 = 0 
    esas_sayi = 0 
Return


kaydir:
    eski_s_1 = s_1
    eski_s_5 = s_5
    s_5 = s_4     '' 10000 hanesi
    s_4 = s_3     '' 1000 hanesi
    s_3 = s_2     '' 100 hanesi
    s_2 = s_1     '' 10 hanesi
    s_1 = Key     '' 1 hanesi
    
Return

'''''''''''''''''
geri_kaydir:
    s_1 = eski_s_1  
    s_2 = s_3    
    s_3 = s_4      
    s_4 = s_5     
    s_5 = eski_s_5    
Return


''''''''''''
hesapla:  
    kontrol_sayi = s_5 * 10000
    kontrol_sayi = kontrol_sayi + ( s_4 * 1000)
    kontrol_sayi = kontrol_sayi + ( s_3 * 100)
    kontrol_sayi = kontrol_sayi + ( s_2 * 10)
    kontrol_sayi = kontrol_sayi + s_1


    If kontrol_sayi > 65535 Then
        GoSub hata_1                      ''' word sınırı aşıldı
        GoSub geri_kaydir                 ''' sınırı asmamis olan son değeri geri al
    EndIf
   
    esas_sayi = ( s_5 * 10000) + ( s_4 * 1000) + ( s_3 * 100) + ( s_2 * 10) + s_1 
    
Return

'''''''''''''''

hata_1:
    SerOut PORTA.2 , 813 , [ " HATA = WORD DEGERI ASILDI ",13,10]

Return

''''''''''''

deger_goster:
    SerOut PORTA.2 , 813 , [@esas_sayi, 13, 10]
Return


[IMG]http://img843.imageshack.us/img843/9803/ekranalntsnc.png[/img]

http://img843.imageshack.us/i/ekranalntsnc.png/

[IMG]http://www.imagerise.com/out.php/t1167394_EkranAl305nt305s305.PNG[/img]

[IMG]http://thumbnails36.imagebam.com/12646/c2a2aa126458840.jpg[/img]

http://www.imagebam.com/image/c2a2aa126458840
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

chailuck

@OG

geçtiğimiz yıl içerisinde proton basic derleyicisinin daha fazla artısı olduğunu fark etmiştim zaten fakat alışkanlıkları bir anda değiştirmek gibi içsel devrimleri yapmakta zorlanan biriyim :)
program örneğin için çok teşekkür ediyorum, inkey gibi komutları olması çok büyük bir avantaj.
İmkanın sınırlarını görmek için imkansızı denemek lazım. (Fatih Sultan Mehmet)  Ayıplarını gördüğünüz komşuyu kınamayınız. Sırlarını açıklamayınız.Çünkü gördüğünüz bu sır size emanettir, emanete hıyanet kötü ve çirkin bir filldir. (Hacı Bayramı Veli )  meyve veren ağacın taşlanması çok hoş ;)

chailuck

arkadaşlar bu arada akşamları sınırlı zaman ayırdığım için  3-4 gün içinde algoritmaya dayalı programı bitimiş olmayı umuyorum.
burada paylaşıma açacağım.
Emeği geçen arkadaşlarıma teşekkür ederim.
Saygılarımla.
:)
İmkanın sınırlarını görmek için imkansızı denemek lazım. (Fatih Sultan Mehmet)  Ayıplarını gördüğünüz komşuyu kınamayınız. Sırlarını açıklamayınız.Çünkü gördüğünüz bu sır size emanettir, emanete hıyanet kötü ve çirkin bir filldir. (Hacı Bayramı Veli )  meyve veren ağacın taşlanması çok hoş ;)

subram

http://www.elektronark.org  Türkiyede Elektronik Kültürünü Değiştirmeye Geliyoruz