T

KEYPAD UYGULAMASI

Başlatan toys-23, 20 Kasım 2011, 22:45:43

toys-23

Merhabalar bir keypad uygulaması üzerinde çalışıyorum kendimce bişeler yazdım ama ne kadar doğru bilmiyorum isisde lcd ekrada denedim çalışıyor tam anlamıyla bitirisem borda basacağım bi sorunum var tuşlara bastığımda ekranda tektek hangisi olduğu yazıyor ama açınca hemen tus0 diyor sanırım IF TUS = %00000000 THEN lcdout $fe,$C0,"   TUS 0 "
diye yazdığım kısımdan kaynaklanıyor  bununla ilgi ne yapabilirim?
Birde ben bunu bir şifreli kilit devresi yapmak için yapuyorum şifreyi hafızaya kaydetmek için Write adres,Bilgi ve okumak içinde read adres,Bilgi yi kullanacağım sanırım ETE Hocamın derslerinden, bununla ilgili burada nasıl bir kayıt adresi yapmalıyım yardımcı olursanız sevinirim..Aslında şifreli kilit devreleri var ama ben yazarak ve sizlere danışarak daha iyi öğreniyorum ve en azından kendim yapabilmek istiyorum olduğu kadarıyla..

TRISD = %00001111
TRISB = %00000000
PORTB = 0
CMCON=7
TUS VAR BYTE
LOW PORTB.2


ana:
CALL tus_tara
goto ana

tus_tara:
PORTD  = %00010000

IF PORTD.0 THEN TUS = %00000001
IF PORTD.1 THEN TUS = %00000010
IF PORTD.2 THEN TUS = %00000011
IF PORTD.3 THEN TUS = %00001010

PORTD = %00100000

IF PORTD.0 THEN TUS = %00000100
IF PORTD.1 THEN TUS = %00000101
IF PORTD.2 THEN TUS = %00000110
IF PORTD.3 THEN TUS = %00001011

PORTD = %01000000

IF PORTD.0 THEN TUS = %00000111
IF PORTD.1 THEN TUS = %00001000
IF PORTD.2 THEN TUS = %00001001
IF PORTD.3 THEN TUS = %00001100

PORTD = %10000000

IF PORTD.0 THEN TUS = %00001110
IF PORTD.1 THEN TUS = %00000000
IF PORTD.2 THEN TUS = %00001111
IF PORTD.3 THEN TUS = %00001101

GOSUB lcdgoster

RETURN

lcdgoster:



IF TUS = %00000001 then lcdout $fe,$C0,"   TUS 1 "
IF TUS = %00000010 then lcdout $fe,$C0,"   TUS 2 "
IF TUS = %00000011 then lcdout $fe,$C0,"   TUS 3 "
IF TUS = %00001010 then lcdout $fe,$C0,"   TUS A "
IF TUS = %00000100 then lcdout $fe,$C0,"   TUS 4 "
IF TUS = %00000101 then lcdout $fe,$C0,"   TUS 5 "
IF TUS = %00000110 then lcdout $fe,$C0,"   TUS 6 "
IF TUS = %00001011 then lcdout $fe,$C0,"   TUS B "
IF TUS = %00000111 then lcdout $fe,$C0,"   TUS 7 "
IF TUS = %00001000 then lcdout $fe,$C0,"   TUS 8 "
IF TUS = %00001001 then lcdout $fe,$C0,"   TUS 9 "
IF TUS = %00001100 then lcdout $fe,$C0,"   TUS C "
IF TUS = %00001110 then lcdout $fe,$C0,"   TUS + "
IF TUS = %00000000 THEN lcdout $fe,$C0,"   TUS 0 "
IF TUS = %00001111 then lcdout $fe,$C0,"   TUS # "
IF TUS = %00001101 then lcdout $fe,$C0,"   TUS D "
PORTD=0
RETURN
END

ete

Sorunun kaynağı hiç tuşa baslmaması ile sıfır tuşuna basılması arasındaki farkın programa verilmemiş olmasıdır.
Bu gibi durumlarda sıfır tuşuna önce başka bir kod verip ekrana yazma kısmında kodu tekrar sıfıra döndürmek faydalı olur.
Yada hiç bir tusa basılmaması durumunu TUS=255 olarak tarama kısmının başına verip basılan tusa bağlı olarak tus değişkeninin değer almasını sağlayabilirsin.
Böylece gerçekten sıfır tusuna basılmış ise tus=0 olacağından ekrana yazılması normal olacak ama tus=255 ise hiç bir tusa basılmadığını anlayacak ona göre ne yapacaksan yapacaksın. 

Yalnıcza bir tus takımı kontrol sisteminde bu kadar çok if vce bukadar çok LCDOUT komutu kullanılması programın diğer kısımları için sıkıntı doğurur. Bu nedenle daha akıllıca bir mantık kullanman gerekir.
Ekrana basılan tusu yazdırma satırın 1 adet olsa yeterlidir. ELinde tus diye bir değişken olduğuna göre bu işi tek satırla yapmak mümkün. Çalıştır biraz kafayı ve halletmeye çalış.
Yoksa programa başka amaçlar yüklediğinde hafıza sana yetmeyecektir.

Ete



toys-23

Haklısınız hocam şimdiden bir sürü oldu zaten mümkümse küçük bir örnek verirmisiniz bende devam edeyim üzerinden.
Teşekkürler..

ete

Örneğe gerek varmı?. Şöyle bir bak tuşlara,
Hepsini ASCII kodları üzerinden göstermeye çalışırsan zaten sorun ortadan kalkacak.
IF TUS=>0 and TUS<10 then TUS=TUS+48
Şayet bir Hex tuş takımı yapıyor isen A-B-C-D-E yi de ekranda göstermek zorundasın.
IF TUS>9 and tus<16 then TUS=TUS+55 'A nın kodu 65 dir. 10+65 etmesi için 55+10 şeklinde düşünüyoruz)
IF TUS=14 then TUS="+" - 14
IF TUS=15 then TUS="#" - 15
LCDOUT $FE,$C0,"TUS=", TUS

şeklinde de hallolur sanıırm.
Toplam 4 adet if ile hallolmuş oldu. Ama asıl sorun bunların hepsinin ekranda gösterilip gösterilmeyeceğine oturup karar vermen gerekir. Genelde 0*9 arası gösterilir. Hex tuş takımı pek kullanılmaz. Tek hane silme yada komple silme işlemleri için # yada * ,şaretleri kullanılır. Birde ENTER tuşu kullanılır o kadar. Silme tuşları gösterilmez işlem yaparlar. Enter de öyle.

Ete

toys-23

Merhabalar hocam gayet güzel çalıştı verdiğiniz gibi yerleştirdim.
lcdgoster:
IF TUS=14 then TUS="+"
IF TUS=15 then TUS="#"
IF TUS=>0 and TUS<10 then TUS=TUS+48 
IF TUS>9 and tus<16 then TUS=TUS+55
LCDOUT $FE,$C0,"TUS=", TUS

Kare ve yıldızı yukarı yerleştirince çalıştı tekrar teşekkür ederim.

toys-23

Ete hocam tekrar merhabalar

Ekrandaki sıfırı silmek için programın son halinde tus=255 yaptığımda bar karekteri çıkıyor.ANSCII Kodlarını inceledim ve şöyle bişey yaptım ne kadar doğru bilmem ama iş gördü:IF TUS = 0 THEN  TUS = 24 şimsi tus=0 çıkmuyor ekranı açtığımda ne yazarsam onu yazıyor tabi yukarıda sizin yazdığınız kodlarla.

Şimdi bir şifreyi pic in epromuna kayıt ekmek ve geri çağırmak için ne yapmalıyım derslerinizden 9. derste eeproma kayıt var aslınca defalarcada okudum ama bana pic in  epromuna kayıt ve okuma yapmam için küçük bir örnek verebilirmisiniz.

Bu arada arkaşdaşlar ETE hocamın vatini almamak adına sizlerdende müsayit olanlar yardımcı olursa sevinirim..
Herkese iyi çalışmalar..

ete

Tuş kontrolüne girmeden önce TUS=255 demelisin.
Sonra aşağıdaki satırlara bir ilave ile ;

IF TUS=255 Then return  'yani hiç bir tuşa basılmamış ise geri dön anlamınadır
IF TUS=14 then TUS="+"
IF TUS=15 then TUS="#"
IF TUS=>0 and TUS<10 then TUS=TUS+48
IF TUS>9 and tus<16 then TUS=TUS+55
LCDOUT $FE,$C0,"TUS=", TUS

İşini kolaylıkla halledersin.

Eproma bir şey yazdırmak son derece kolay;
WRITE adres, Bilgi       şeklindedir komut.
Hangi adrese yazdıracak isen adres bilgisi adres yerimne yazılacak. yazdıracağın byte cinsinden veri de Bilgi yerine yazılacak.
Örnek verelim epromun sıfır nolu adresine 48 bilgisini yazdıralım. 48 bilgisi TUS isimli değişkende kayıtlı olsun.
WRITE 0,TUS:pause 10     şeklinde yapılır. Pause 10 gereklidir. Bu yazma süresidir. Yenidenbir yazma komutu verilmeden en azından 10 ms beklemelidir program.

Okuma ise aynı şekilde basit. READ Adres, Bilgi   şeklindedir. Okurken pause vermek gerekmiyor. Yalnızca yazmada pause var.
Unutmayın hiç veri yazılmamış eprom değeri daima 255 çıkar. Yani veri yazılmamış epromu okursanız 255 değerini görürsünüz.
Bu size default değerlerin kaydı için bir anahtar olur. Mesela ;
-Epromu oku
- Okunan değer 255 ise okunan=48 yap ve yeniden epromun aynı adresine kayıt et
gibi yapılır.

Anlaşıldığını sanıyorum.
Ete

toys-23


menduh

Arkadaşlar 0-9 arası rakamları tuşlara bastıkça ekranda sıralayan yanlış yazma durumunda tek tek silebileceğim ve bu ekranda yazan rakamları enter diye tabir ettiğimiz bir tuş yardımıyla seri olarak göndermek istiyorum bunu şu şekilde düşünüyorum tuşları algılamak kolay matris metoduyla her okuduğumuz tuşu ekranda göstermekte kolay " LCDOUT $FE, $80 + X  " X değerini her tuşa basmadan sonra 1 artırarak ekranda yazmayı planlıyorum,her okuduğum tuş bilgisinide ayrı ayrı değişkenlerde saklamak ve hserout,[a,b,c,d,....] gibi göndermek istiyorum yada lcd hafızasını nasıl okurum ve ekranda yazdıktan sonra hiçbir değişkene gerek kalmaksınzın ekrandaki bilgileri okuyup seri olarak nasıl gönderirim? ayrıca 10 hane  kod gireceğiz ama yazarken birini yanlış yazdık diyelim tümünü silmek kolay ama tek tek nasıl silecegiz yani backspace tuşu gibi nasıl kullanabiliriz.

saygılar.

ete

#9
Mademki tuş takımı kurmak kolay ve basılan tuşlarıda ekranda göstermek kolay peki gerisini neden zor olduğunu düşünüyorsun acaba? Biraz kullanman gereken mantık konusunda bilgi vereyim eminim sen kendi başına bu işi çözersin.
Tuş takımı kontrol işinde iki parametre vardır. Birincisi basılan tuş buna "TUS" diyeceğiz. İkincisi basılan tuşların oluşturduğu sayı gurubu bunada "SAYI" diyeceğiz. Bu tanımlamaya bir de örnek vereyim daha iyi anlarsın.
- Tuş takımında 1 tuşuna bastık, TUS=1,  SAYI için SAYI=SAYI*10+TUS formülünü kullanacağız. Bu durumda SAYI=1 oldu.
- Tus takımında 2 tusuna bastık, TUS=2 , SAYI=1*10+2= 12 oldu
- Tus takımında 3 tusuna bastık, TUS=3 , SAYI=12*10+3=123 oldu.
Dikkat edilecek husus SAYI değişkeninin WORD tipinde olması ve en büyük word değeri olan 65535 değerini aşmamasıdır.
Buraya kadar yapılanları anladın sanırım. Şimdi sildirme işini ele alalım. Tuş takımında "#" karekteri ile ve "*" karekteri ile belirlenen  tuşlar var. Bunlardan "#" tuşunu tek tek silme ve "*" tuşunuda komple silme işine atayalım istersen.
- SAYI=123 iken 4 tusuna bastık TUS=4 oldu ve sayı =1234 haline geldi.
- Tus takımında "#" tusuna bastık, TUS="#" oldu şimdi programda şöyle bir satır olduğunu varsayalım;
   IF TUS="#" then SAYI=SAY/10      Bu komut bize son basılan 4 rakamını silmekte yardımcı olacaktır . SAYI=1234/10=123
  Şimdi yeniden # tuşuna basarsak bu sefer SAYI=123/10=12 şeklinde bir değer elde edilecektir.
- Gelelim komple silme işine, yine programda şöyle bir satır olsa;
   IF TUS="*" then SAYI=0
   İşte bu satırda bize yazdıklarımızın tamamını sıfırlama imkanı verir.
İşin ekrana yazdırılma safhasında ise öyle matrisli bir sistem kullanmana gerek yok. Yalnızca ekrana LCDOUT $FE,$C0,"SAYI=",dec SAYI ,"  " şeklinde bir komut koyman yeterlidir.
Bu dediklerimi uygula istediklerin olacaktır.

Ete

menduh

#10
Hocam teşekkür ediyorum bilgiler için gerçekten işin erbabı olmak bu demek hiç aklıma gelmemişti  benim. bu durumda her Word tipi değişkenle 4 adet rakam gönderebilirim 4+4+3 şeklinde. sayı1,sayı2,sayı3 şeklinde 3 değişkenle çözebilirim diye düşünüyorum bu konuda ipucu verirseniz çok sevinirim.

saygılar.

ete

İşe standart getirmek için bana kalırsa her 3 hane için bir Word değişkeni kullan ve işi 4 adet word değişkeni ile hallet.
Tuş takımından sayı girerken ya bir index değişkeni kullan ve index 0-1-2 ve sonund 3 olunca yeni değişkene geçersin ve indexi sıfırlarsın.
Başka yöntemlerde var ama bazen elindeki sayının üçüncü hanesi sıfır olmak zorundadır. Diğer yöntemler bu durumda sınıfta kalır.

Ete

menduh

Hocam bu index atama olayını hiç ama hiç bilmiyorum anlayamadım yani internetten aradım LOOKUP fonksiyonundan falan bahsediyor, küçücük bi örnek verme imkanınız varmı?

saygılar.

toys-23

Hocam iyi akşamlar

Aslında formu kalabalık etmeme adına yazılımı tam paylaşmayacaktım ama başa çıkamadım işin açıkçası ve tam olarak nerde hata yaptığımı bulamuyorum.
Bende yukarıda bahsettiğiniz gibi ekrana rakamları sırasıyla yazılmasını istiyorum ve daha sonrada bununla bir şifreli kilit devresi yapmaya çalışacağım ama rakamları bir türlü yan yana yazdıramadım tuşa basınca çarpma yapıp duruyor, bi bakabilirmisiniz?

TRISD = %00001111
TRISB = %00000000
PORTB = 0
CMCON=7
SAYI VAR WORD
TUS  VAR BYTE

ana:
CALL tus_tara
goto ana
SAYI=0
tus_tara:

PORTD  = %00010000

IF PORTD.0 THEN TUS = %00000001
IF PORTD.1 THEN TUS = %00000010
IF PORTD.2 THEN TUS = %00000011
IF PORTD.3 THEN TUS = %00001010


PORTD = %00100000
                                                         
IF PORTD.0 THEN TUS = %00000100
IF PORTD.1 THEN TUS = %00000101
IF PORTD.2 THEN TUS = %00000110
IF PORTD.3 THEN TUS = %00001011

PORTD = %01000000

IF PORTD.0 THEN TUS = %00000111
IF PORTD.1 THEN TUS = %00001000
IF PORTD.2 THEN TUS = %00001001
IF PORTD.3 THEN TUS = %00001100

PORTD = %10000000

IF PORTD.0 THEN TUS = %00001110
IF PORTD.1 THEN TUS = %00000000
IF PORTD.2 THEN TUS = %00001111
IF PORTD.3 THEN TUS = %00001101

GOSUB lcdgoster
RETURN

lcdgoster:
SAYI=SAYI*10+TUS
IF TUS=14 then TUS="+"
IF TUS=15 then TUS="#"
IF TUS=>0 and TUS<10 then TUS=TUS+48
IF TUS>9 and tus<16 then TUS=TUS+55
LCDOUT $FE,1
LCDOUT $FE,$C0,"SAYI=",dec SAYI,"    "
pause 50
RETURN
END

ete

Aslında açıklamaların ile program bir biri ile örtüşmüyor.
İşin bütün püf noktası aşağıdaki satırlarda.
SAYI=SAYI*10+TUS
IF TUS=14 then TUS="+"
IF TUS=15 then TUS="#"
IF TUS=>0 and TUS<10 then TUS=TUS+48
IF TUS>9 and tus<16 then TUS=TUS+55
LCDOUT $FE,1
LCDOUT $FE,$C0,"SAYI=",dec SAYI,"    "

Açıklamadığın bir satır var. Bu satır ne amaçla yazıldı  "IF TUS=14 then TUS="+""
Aynı şekilde açıklamadığın "IF TUS=15 then TUS="#"" satırıda var. Bu satırı ne amaçla yazdın.
Bu satırda neden TUS değerini ASCII karşılığı olarak hesaplıyorsun? Amacın nedir ? "IF TUS=>0 and TUS<10 then TUS=TUS+48"
BU satırın anlamınıda anlayamadım "IF TUS>9 and tus<16 then TUS=TUS+55" aslında anlamı belli ABCDEF değerlerini elde etmeye çalışmışsın ama neden? ne yapacaksın bunları. Hex formatında işlem mi yapacaksın?
Bunları açıklamaz isen ben bir nlam çıkartamıyorum yaptıklarından.
En başa "SAYI=SAYI*10+TUS" şeklinde satırı yerleştirmişsin. Halbuki bu yapacaklarını yaptıktan sonra koyman gereken bir satır. Ama yinede her şey diğer satırların anlamlarına bağlı.
Programı buraya vermek yerine bir dosya eki olarak simulasyon dosyası ile birlikte versen daha uygun olurdu.
Ete




Powered by EzPortal