avatar_elektro77

KEYPED TARAMA

Başlatan elektro77, 06 Eylül 2018, 19:13:53

elektro77

keypedli güç kaynağı yolunda ilk adımları attım fakat dah keypedde takıldım.Ete hocamın derslerinden ders8 deki keypedli yazılımı başarı ile çalıştırdım. Fakat aynı devre ile birde tarama yöntemini denemek istediğimde takıldım kaldım. Keypedi çözünce ekranda yanyana rakam yazabilmeyi çözmem gerekli.yan yana rakam yazabilme konusunda yardım istemeden önce aşagıdaki tarama yöntemini çözmem gerekli. aşağıdaki devreye  bu kodları bir türlü uyarlayamadım. tarama hatası yaptığımın farkındayım ama mantık hatasını nerede yapıyorum anlayamadım.
Sorun nereden kaynaklanıyor?
Birde yan yana rakam yazma konusunda hangi teknik daha başarılı olur acaba. yapacağım şey tuşlara basarak Örn: 12 yazdığımda adaptor 12 volt çıkş verecek.Bunları çözdükten sonra işin analok çııkış katına geçeceğim.
Yardımcı olurmusunuz lütfen.

@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_ON
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC
DEFINE OSC 4
TRISA=%111111
TRISB=%00000000
TRISC=%00000000
TRISD=%00001110
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

ADCON1 = 7
'OPTION_REG.7=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
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us

DEFINE ADC_BITS 10     ' Set number of bits in result
DEFINE ADC_CLOCK 3     ' Set clock source (3=rc)
DEFINE ADC_SAMPLEUS 50     ' Set sampling time in uS     
'------------------------------------------------------------
Pause 200
Lcdout $fe, 1
'--------------------------------------------------------------
S1  var BIT
S2  var BIT
S3  var BIT
S4  var BIT
S5  var BIT
S6  var BIT
S7  var BIT
S8  var BIT
S9  var BIT
S10 var BIT
S11 var BIT
S12 var BIT
SYMBOL A=PORTD.4
SYMBOL B=PORTD.5
SYMBOL C=PORTD.6
SYMBOL D=PORTD.7
SYMBOL DIKEY1=PORTD.1
SYMBOL DIKEY2=PORTD.2
SYMBOL DIKEY3=PORTD.3

S1=0:S2=0:S3=0:S4=0:S5=0:S6=0:S7=0:S8=0:S9=0:S10=0:S11=0:S12=0
'------------------------------------------------------------------
BASLA:
gosub EKRAN
GOSUB SIFIR
'*******  1.satır taraması ******
portd=%01111111
if DIKEY1=0 then S1=1
if DIKEY2=0 then S2=1
if DIKEY3=0 then S3=1
'*******  2.satır taraması ******
portd=%10111111
if DIKEY1=0 then S4=1
if DIKEY2=0 then S5=1
if DIKEY3=0 then S6=1

'*******  3.satır taraması ******
portd=%11011111
if DIKEY1=0 then S7=1
if DIKEY2=0 then S8=1
if DIKEY3=0 then S9=1

'*******  4.satır taraması ******
portd=%11101111
if DIKEY1=0 then S10=1
if DIKEY2=0 then S11=1
if DIKEY3=0 then S12=1

goto BASLA
'------------------------------------------------------------
SIFIR:
S1=0:S2=0:S3=0:S4=0:S5=0:S6=0:S7=0:S8=0:S9=0:S10=0:S11=0:S12=0
RETURN

EKRAN:
if S1=1 then lcdout $FE,$C0,"1 "
if S2=1 then lcdout $FE,$C0,"2 "
if S3=1 then lcdout $FE,$C0,"3 "
if S4=1 then lcdout $FE,$C0,"4 "
if S5=1 then lcdout $FE,$C0,"5 "
if S6=1 then lcdout $FE,$C0,"6 "
if S7=1 then lcdout $FE,$C0,"7 "
if S8=1 then lcdout $FE,$C0,"8 "
if S9=1 then lcdout $FE,$C0,"9 "
if S10=1 then lcdout $FE,$C0,"10  "
if S11=1 then lcdout $FE,$C0,"11  "
if S12=1 then lcdout $FE,$C0,"12  "


return

end
.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Ete hocam;
yukarıdaki kodlarda düzenleme yaptınızmı benmi yanlış görüyorum.
Sanki ilk attığım kodlar değil.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Hocam aşağıdaki kodlarda sadece 1. satırda yanyana yazdırmayı gösterebilirseniz gerisini getirebileceğime inanıyorum. 10 luk Decimal saydırmayı biliyorum ama ilk yazdığım rakamı ekranda tutup yanına nasıl diğer rakamları ekleyeceğimi bir türlü anlayamıyorum.
Örn:122 yazdırmak için ne yapmalıyım.
Ayıca ondalıklı yani Örn:12.2 yazdırmam gerektiğinde nasıl bir yol izlemeliyim.
S VAR BYTE
SYMBOL DIKEY1=PORTD.1
SYMBOL DIKEY2=PORTD.2
SYMBOL DIKEY3=PORTD.3
'------------------------------------------------------------------
BASLA:
'1.satır taraması
portd=%11101111
if DIKEY1=0 then S=1
if DIKEY2=0 then S=2
if DIKEY3=0 then S=3
'2.satır taraması
portd=%11011111
if DIKEY1=0 then S=4
if DIKEY2=0 then S=5
if DIKEY3=0 then S=6
'3.satır taraması
portd=%10111111
if DIKEY1=0 then S=7
if DIKEY2=0 then S=8
if DIKEY3=0 then S=9
'4.satır taraması
portd=%01111111
if DIKEY1=0 then S=10
if DIKEY2=0 then S=0
if DIKEY3=0 then S=11
GOSUB EKRAN

goto BASLA
'------------------------------------------------------------
EKRAN:
lcdout $FE,$80,   "TUS:",# S,"      "
RETURN
end
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

#3
Tuş takımı kullanma mantığı aslında son derece basittir. Tuş takımında her bir tuş basıldığında bir yatay ve birde dikey hattı kısa devre eder. Bu hatlardan birini siz (high yada low) belirlerseniz kısa devre olan diğer hatta da aynı lojik değeri görmeniz gerekir. Tabiiki diğer hat ters lojik konumda beklemelidir. Sizin belirlediğiniz çıkış olan hat dır (Burada hat tabirini dikey yada yatay hatları anlatmak için kullanıyorum). Kısa devre olup konum değiştirecek olan hat ise bir giriş pinine bağlı olmalıdır.  Sistem de mutlaka Pullup yada Pulldown (genellikle Pullup) dirençleri gerektiği için Tuş takımı PORTB ya bağlanmalıdır. Senin yaptığın gibi LCD yp PORTB ye bağlamak bence son derece gereksiz ve anlamsız oluyor.

Yazmış olduğun kod'a bakınca tarama mantığını anlamadığın belli oluyor. Ders notlarında tuş takımı kullanımı detaylı anlatılmış idi ama neden anlamadığını bende anlamadım doğrusu.

Satır olarak bir tuş takımına bakarsak  üst de 1-2-3 tuşlarının bulunduğunu görebiliyoruz. Sırası ile bu tuşların konumlarına bakacak olursak;
Öncelikle bütün Çıkış pinlerine HIGH vererek işe başlıyoruz. Ardından İlk çıkış pinine LOW veriyoruz. Bu pin A yatay pini olacaktır.
Bu konumda şayet 1 nolu giriş pininden LOW alırsa basılan Tuş (1) tuşu, 2 nolu giriş pininden LOW alırsam basılan tuş (2) tuşu veya 3 nolu giriş pininden LOW alırsam basılna tuş (3) tuşu olacaktır.
Bu durumda kod kısmı şöyle yazılmalıdır;
PORTD=%11100000  (bu aslında %1110 0000 şeklinde yazılırsa anlmak daha kolay olur herhalde PORTD.4 pinine LOW vermiş oluyorum.
IF Dikey1=0 then TUS=1
IF Dikey2=0 then TUS=2
IF Dikey3=0 then TUS=3

Buraya kadar bütün dikeyleri test etmiş oldum. Sıra ikinci sırayı test etmekte. Bunun için B yatay hattına LOW verip yeniden dikeylere bakmak gerekecek.
PORTD=%11010000   'yatayB ye LOW verdik
IF Dikey1=0 then TUS=4
IF Dikey2=0 then TUS=5
IF Dikey3=0 then TUS=6

Şimdi yatayC ye LOW verp 3 ci satırı test edeceğiz.
PORTD=%10110000   'yatayC ye LOW verdik
IF Dikey1=0 then TUS=7
IF Dikey2=0 then TUS=8
IF Dikey3=0 then TUS=9

Şimdi YatayD ye LOW vereceğim.
IF Dikey1=0 then TUS=11  '* tuşu
IF Dikey2=0 then TUS=10  '0 tuşu
IF Dikey3=0 then TUS=12  '# tuşu
IF TUS=10 then TUS=0
IF TUS=11 then
  SAYI=SAYI- (SAYI/10)*10
  goto basla
endif
IF TUS=12 then
  SAYI=0
  GOTO BASLA
ENDIF
SAYI=SAYI*10+TUS 
Lcdout $FE,$C0,"SAYI=",dec SAYI,"     "
(Basılan tuşların sayılarını yan yana göstermek için 10 tabanına göre sayı sisteminin mantığını kullanıyoruz.
Ekrana TUS yerine SAYI yı yazdırıyoruz anlayacağın.


Ete

elektro77

Yukarıdaki sorumun aynısına sizin daha önce ders olarak anlattığınız bu kodlar üzerinden de gidebiliriz hocam.
Saygılarımla
Tus=0
SAYAC=0
Pause 200
Lcdout $fe, 1
'--------------------------------------------------------------
BASLA:
PORTD =254
'1.satır taraması
YATAY_A=0
If DIKEY_1=0 THEN
Tus=1:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif

If DIKEY_2=0 Then
Tus=2:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif

If DIKEY_3=0 Then
Tus=3:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_A

'2.satır taraması
YATAY_B=0
If DIKEY_1=0 Then
Tus=4:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif

If DIKEY_2=0 Then
Tus=5:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif

If DIKEY_3=0 Then
Tus=6:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_B

'3.satır taraması
YATAY_C=0
If DIKEY_1=0 Then
Tus=7:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif

If DIKEY_2=0 Then
Tus=8:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif

If DIKEY_3=0 Then
Tus=9:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_C

'4.satır taraması
YATAY_D=0
If DIKEY_1=0 Then
Tus=10:GOSUB EKRAN
While DIKEY_1=0
Wend
Endif

If DIKEY_2=0 Then
Tus=0:GOSUB EKRAN
While DIKEY_2=0
Wend
Endif

If DIKEY_3=0 Then
Tus=11:GOSUB EKRAN
While DIKEY_3=0
Wend
Endif
High YATAY_D

pause 100

GOTO BASLA
'----------------------------------------------------------
EKRAN:
lcdout $FE,$80,   "TUS:",# TUS,"      "
RETURN
END
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77


Hocam ilk verdiğiniz kodlar biraz eksik gibiydi.
bende aşağıdaki şekilde düzenledim. Fakat yinede sorunlu çalışıyor. Yan yana yazmayıp alakasız rakamlar çıkıyor ortaya. Bi bakabilirmisiniz.
ısıs ve pbp dosyaları ilişiktedir.
BASLA:
portd=%11101111'  (bu aslında %1110 0000 şeklinde yazılırsa anlmak daha kolay olur herhalde PORTD.4 pinine LOW vermiş oluyorum.
IF Dikey1=0 then TUS=1
IF Dikey2=0 then TUS=2
IF Dikey3=0 then TUS=3

'Buraya kadar bütün dikeyleri test etmiş oldum. Sıra ikinci sırayı test etmekte. Bunun için B yatay hattına LOW verip yeniden dikeylere bakmak gerekecek.
portd=%11011111   'yatayB ye LOW verdik
IF Dikey1=0 then TUS=4
IF Dikey2=0 then TUS=5
IF Dikey3=0 then TUS=6

'Şimdi yatayC ye LOW verp 3 ci satırı test edeceğiz.
portd=%10111111   'yatayC ye LOW verdik
IF Dikey1=0 then TUS=7
IF Dikey2=0 then TUS=8
IF Dikey3=0 then TUS=9

'Şimdi YatayD ye LOW vereceğim.
portd=%01111111
IF Dikey1=0 then TUS=11  '* tuşu
IF Dikey2=0 then TUS=10  '0 tuşu
IF Dikey3=0 then TUS=12  '# tuşu

IF TUS=10 then TUS=0
IF TUS=11 then
  SAYI=SAYI-(SAYI/10)*10
  goto basla
endif
IF TUS=12 then
  SAYI=0
  GOTO BASLA
ENDIF
GOSUB EKRAN

goto BASLA
'------------------------------------------------------------

'-------------------------------------------------------------
EKRAN:
SAYI=SAYI*10+TUS 
Lcdout $FE,$C0,"SAYI=",dec SAYI,"     "
lcdout $FE,$80,   "TUS:",# TUS,"      "
RETURN
end
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

Hocam bu kodlarla sistemi başarılı şekilde çalıştırdım. Fakat virgül koymak istediğimde gerçekten beynim saçmalıyor. Örneğin 12.50 yazmak ve bu değişkeni ondalıklı şekilde sayı değişkeni içerisine kaydedip daha sonra bu değeri doğru şekilde nasıl kullanmalıyım. Birde en fazla 4 hane yazmak istediğimde nasıl bir kodla sınırlama koymalıyım.
SAYI     VAR WORD
ONDA     VAR BYTE
TUS      VAR BYTE
SYMBOL DIKEY1=PORTD.1
SYMBOL DIKEY2=PORTD.2
SYMBOL DIKEY3=PORTD.3
'------------------------------------------------------------------
GOSUB EKRAN
BASLA:
portd=%11101111 
IF Dikey1=0 then TUS=1:GOSUB EKRAN
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=2:GOSUB EKRAN
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=3:GOSUB EKRAN
WHILE DIKEY3=0:WEND

portd=%11011111   
IF Dikey1=0 then TUS=4:GOSUB EKRAN
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=5:GOSUB EKRAN
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=6:GOSUB EKRAN
WHILE DIKEY3=0:WEND

portd=%10111111 
IF Dikey1=0 then TUS=7:GOSUB EKRAN
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=8:GOSUB EKRAN
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=9:GOSUB EKRAN
WHILE DIKEY3=0:WEND

portd=%01111111   
IF Dikey1=0 then TUS=10:GOSUB EKRAN  '* tuşu
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=0 :GOSUB EKRAN  '0 tuşu
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=11:GOSUB EKRAN  '# tuşu
WHILE DIKEY3=0:WEND


PAUSE 150

goto BASLA
'------------------------------------------------------------
EKRAN:
SAYI=SAYI*10+TUS
IF TUS=10 then TUS=0:SAYI=0
IF TUS=11 THEN GOSUB VIRGUL

Lcdout $FE,$C0,"SAYI:",# SAYI,"      "
lcdout $FE,$D4,"TUS :",# TUS,"      "
RETURN
'------------------------------------------------------------
VIRGUL:
Lcdout $FE,$C0,"SAYI:",# SAYI,","
GOTO BASLA
RETURN

end
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Cevap yazmayı bilerek geciktirdim. Bu esnada seninde sürekli deneme yaptığından emindim.
Doğru yolu bulmuşsun.
Öncelikle olması gereken kodları vereyim.
'@ DEVICE pic16F877A
'@ DEVICE pic16F877A, WDT_ON
'@ DEVICE pic16F877A, PWRT_ON
'@ DEVICE pic16F877A, PROTECT_OFF
'@ DEVICE pic16F877A, XT_OSC
#CONFIG
  __config _BODEN_OFF  & _PWRTE_ON & _WDT_OFF & _LVP_OFF & _XT_OSC
#ENDCONFIG
DEFINE OSC 4
TRISA=%00111111
TRISB=%00000000
TRISC=%00000000
TRISD=%00001110
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

ADCON1 = 7
'OPTION_REG.7=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
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us   
'------------------------------------------------------------
Pause 200
Lcdout $fe, 1
'--------------------------------------------------------------
S     VAR BYTE
i     VAR BIT
D     VAR BYTE
ED    VAR BYTE
SAYI  VAR WORD
TUS   VAR BYTE
SYMBOL DIKEY1=PORTD.1
SYMBOL DIKEY2=PORTD.2
SYMBOL DIKEY3=PORTD.3
PAUSE 500
SAYI=0
PORTD=$FF
GOSUB EKRAN
'------------------------------------------------------------------
BASLA:   

TUS=255
portd=%11100000'  (bu aslında %1110 0000 şeklinde yazılırsa anlmak daha kolay olur herhalde PORTD.4 pinine LOW vermiş oluyorum.
IF Dikey1=0 then TUS=1
IF Dikey2=0 then TUS=2
IF Dikey3=0 then TUS=3
WHILE (PORTD & %00001110)<14:WEND

portd=%11011111   'yatayB ye LOW verdik
IF Dikey1=0 then TUS=4
IF Dikey2=0 then TUS=5
IF Dikey3=0 then TUS=6
WHILE (PORTD & %00001110)<14:WEND

portd=%10111111   'yatayC ye LOW verdik
IF Dikey1=0 then TUS=7
IF Dikey2=0 then TUS=8
IF Dikey3=0 then TUS=9
WHILE (PORTD & %00001110)<14:WEND

portd=%01111111
IF Dikey1=0 then TUS=11  '* tuşu
IF Dikey2=0 then TUS=10  '0 tuşu
IF Dikey3=0 then TUS=12  '# tuşu
WHILE (PORTD & %00001110)<14:WEND
IF TUS=10 then TUS=0
IF TUS=11 then
  SAYI=SAYI/10:TUS=0:GOSUB EKRAN
  goto BASLA
endif
IF TUS=12 then
  SAYI=0:TUS=0
ENDIF
CIK:
PAUSE 50
IF TUS=255 THEN BASLA
SAYI=SAYI*10+TUS
GOSUB EKRAN

goto BASLA
'------------------------------------------------------------

'-------------------------------------------------------------
EKRAN:
lcdout $FE,$80,   "TUS:",# TUS,"      " 
Lcdout $FE,$C0,"SAYI=",dec SAYI,"     "

RETURN
end

SAYI değişkeni WORD tipinde olmalıdır. makismum alabileceği sayı 65535 dir. sen 4 hane derken 9999 olası en büyük değer olacaktır.
Bu durumda kontrol basit olacaktır.
SAYI=SAYI*10+TUS kod satırının bulunduğu satırdan bir öncesine
IF (SAYI DIG 3)>0 THEN BASLA
şeklinde bir satır eklersen son binler hanesi sıfırdanbüyük ise başka sayı hesaplama şeklinde emir verebilirsin.

Ondalık meselesine gelince, sen normalde virgülsüz çalışacaksın. Ama gösterirken virgül ile göstereceksin.
Şöyle,
LCDOUT $fe,$C,"SAYI=",dec (SAYI/100),",",dec2 SAYI//100
Bu durumda ekrana 1,00 yadırabilmek için senin 100 girmen 1,50 yadırabilmek için 150 girmen gerekecek.

Ete



elektro77

hocam verdiğiniz kodlar verdiğiniz hali ile aşırı yavaş çalışıyor. Tuşlara bastıktan sonra çok bekletiyor. Yani sistem yavaş çalışıyor.
Aşağıdaki şekilde biraz daha hızlandı ama yine çok yavaş.
OSC yi 20 mhz yaptım çok değişmedi. Pause komut değerlerini düşürdüm hatalar ortaya çıktı. Pauseleri kaldırdım sistem ilk hareketten sonra kilitlendi.
bu hali ile kullanacak olursam daha bir sürü DAC kodu yazacağımızı düsünürsek sorun haline gelebilir diye düşünüyorum.
birde aşagıda cık baslıgı eklemissiniz ama oraya dallanma yapmamışsınız anlamadım.
birde asağıdaki resimdeki gibi son hanenin değeri 0 dan farklı bir sayı olursa kare tusu sistemi sıfırlamıyor
SAYI  VAR WORD
TUS   VAR BYTE
SYMBOL DIKEY1=PORTD.1
SYMBOL DIKEY2=PORTD.2
SYMBOL DIKEY3=PORTD.3
'PAUSE 500
SAYI=0
'PORTD=$FF
'------------------------------------------------------------
Lcdout $fe, 1
Pause 200
'--------------------------------------------------------------
GOSUB EKRAN
'------------------------------------------------------------------
BASLA:   
TUS=255
portd=%11101111 
IF Dikey1=0 then TUS=1:GOSUB EKRAN
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=2:GOSUB EKRAN
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=3:GOSUB EKRAN
WHILE DIKEY3=0:WEND

portd=%11011111   
IF Dikey1=0 then TUS=4:GOSUB EKRAN
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=5:GOSUB EKRAN
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=6:GOSUB EKRAN
WHILE DIKEY3=0:WEND

portd=%10111111 
IF Dikey1=0 then TUS=7:GOSUB EKRAN
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=8:GOSUB EKRAN
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=9:GOSUB EKRAN
WHILE DIKEY3=0:WEND

portd=%01111111   
IF Dikey1=0 then TUS=11:GOSUB EKRAN  '* tuşu
WHILE DIKEY1=0:WEND
IF Dikey2=0 then TUS=10 :GOSUB EKRAN '0 tuşu
WHILE DIKEY2=0:WEND
IF Dikey3=0 then TUS=12:GOSUB EKRAN  '# tuşu
WHILE DIKEY3=0:WEND

IF TUS=10 then TUS=0
IF TUS=11 then
  SAYI=SAYI/10:TUS=0:GOSUB EKRAN
  goto BASLA
endif
IF TUS=12 then
  SAYI=0:TUS=0
ENDIF
'--------------------
CIK:
PAUSE 50
IF TUS=255 THEN BASLA
IF (SAYI DIG 3)>0 THEN BASLA
SAYI=SAYI*10+TUS
GOSUB EKRAN

goto BASLA
'------------------------------------------------------------

'-------------------------------------------------------------
EKRAN:
lcdout $FE,$80,   "TUS:",# TUS,"      " 
LCDOUT $fe,$C0,"SAYI=",dec (SAYI/100),",",dec2 SAYI//100

RETURN
end
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Burada program yazmaya çalışmıyorum ben. Sadece sana yol göstermeye çalışıyorum.
Benim denemelerimde hız yeterli gözüküyor. Kare tuşuda her konumda sıfırlıyor.
Programda bazı değişiklikler yapıyorsun bilerek yapmanı öneririm. Program akışında gecikme yaratacak tek komut PAUSE komutudur. Koymaz isen tuş titremesi işi bozar ve tuş takımı düzgün çalışmaz. Koyunca en uygun değeri bulup ona göre bir şey koymak lazım onuda ancak gerçek devrede bulabilirsin. Ama simulasyonda Pause 100 bile gecikme yaratmadan çalışıyor.
Ondalıklı sisteminnasıl olacağını gösterdim ama ekranında gördüğüm kadarı ile virgülden sonra 3 hane kullanmışsın. Ben ise 2 hane kullanmış idim. Buna bir prensip getirmeli onun dışına çıkmamalısın.
Bana göre sistem çalışıyor bu nedenle bundan sonrasını kendin geliştirmen gerekiyor artık.

Ete

elektro77

#10
hocam program yazmadığınızı bana yol gösterdiğinizi biliyorum. Bende yoğun olduğunuzdan dolayı bazı yerleri yanlışlıkla  atlamış olabileceğinizi düşünüp değiştiriyorum.
Mesela ilk satırda
portd=%11100000'  (bu aslında %1110 0000 şeklinde yazılırsa anlmak daha kolay olur herhalde PORTD.4 pinine LOW vermiş oluyorum.
kodunda portd yi  %11100000' bu şekilde diğerlerinde ise portd=%11011111 bu şekilde girmişsiniz.Her iki şekildede çalışıyor ama bunu yanlışlıkla atlamış olabileceğinizi düşünerek değiştirdim.Bilgim olduğundan değil.
Programda yaptığım diğer değişikliklere gelince: sizin yazdığınız komutlarda anlamadığım anlamını bilmediğim komutlar oluyor çözemiyorum. Örn bunun gibi:
WHILE (PORTD & %00001110)<14:WEND. buna müdahale edemiyorum.çünkü ne işe yaradığını çok az anlıyorum.
Bende çözebildiğim veya bildiğim şekle değiştiriyorum.

3 hane kullanmaya gelince:
Hocam Ben üç hane kullanmadım sizin verdiğiniz
LCDOUT $fe,$C,"SAYI=",dec (SAYI/100),",",dec2 SAYI//100
bu kodu aynen yerleştirdim. Ama rakam girdikten sonra virgülden sonra  2 hane iken kare tuşuna basınca  virgülden sonra  3 hane oluveriyor anlamadım.

Yıldız tuşunun amacı ne peki hocam. Yıldız tuşuna basınca ekranda rakam var ise virgülü sola doğru kayıyor. Sanki geri alma gibi.yine 3 haneye buradada dönüşüyor.
CIK komutunun amacı ne.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

ekran komutuna aşağıdaki şekilde ekranı temizleme komutu yerleştirdiğimde 3 haneye dönüşme sorunu ortadan kalktı. Ama sebebini bilmiyorum.
EKRAN:
Lcdout $fe, 1
lcdout $FE,$80,"TUS:",# TUS,"      " 
lcdout $fe,$C0,"SAYI=",dec(SAYI/100),",",dec2(SAYI//100)
RETURN
end
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Sadece anlamadığın yerleri sorsan ve ilave olarak içinden çıkamadığın kısımları belirtsen daha iyi olacak. Yoksa genelleme yapınca işler karışıyor.

Ekranda yazım formatını kullanmaz isen yazdırılan karekter adedine bağlı olarak bir önceki yazdırmadan kalan gereksiz karekterler ekranda kalabilir.  YAZ=12 iken
Örneğin LCDOUT $FE,$80,dec YAZ  komutu karşılığı ekrana 12 yazılır. YAZ=8 iken yeniden aynı komutu verirsen ekranda muhtemelen 82 görürsün. Çünki 12 nin 2 si ekranda kalır. Sendeki 3 hanel, virgül gösterimide aynı sebebe dayanıyor.
Ekranı temizleme komutu önceki değerleri sildiği için düzelmiştir.
Bu durumu önlemek amacı ile ekrana yazdırma komutlarının peşine en azından 2 karekter boşluk yazdırırım böylece bu tür olumsuzluklardan kurtulmuş olursun. Ekranı sildirmek sürekli göz kırpma etkisi yarattığı iiçin tercih etmiyorum.
WHILE (PORTD & %00001110)<14:WEND. komut satırının anlamı ise şöyle,
%00001110 şeklinde verilen byte değerinde 1 ler basılan tuşlara karşılık gelir. Hiç bir tuşa basılmıyor ise (PORTD & %00001110)=14 dür bu değeri 1 lerin konumundan hesaplıyoruz. %1111 olsaydı 15 olacak idi. En baştaki 0 olunca değer 14 oluyor. Kısaca bir tuşa basılırsa bu 3 adet 111 den birisi sıfır olacağı için değer 14 den küçük olur.
Tuş kontrolünde basılan tuşa bağlı olarak 1 kere hesap yapmak zorundayız. Tuşa basıldı hesabı yaptık ve tuş bırakılıncaya kadar beklemek zorundayız. Aksi halde SAYI değeri sürekli artar. Bunu engellemek ve basılan tuşun bırakıldığını kollamak üzere bu komutu yerleştirdim. Bu komut tuş bırakılıncaya kadar orada bekletir programı.
Aynı komut satırı diğer konumlarda da geçerlidir.

Ete

Powered by EzPortal