pcbway

proton ile pic programlama

Başlatan forumsad, 09 Ocak 2010, 22:14:20

forumsad

ERead
Ewrite
nasıl kullanılır basit bir örnek verebilirmisiniz...

asıl problemim şu pic16f877 ile keypad ve lcd ile bir program yazmaya çalışıyorum
lcd\'ye girdiğim 3 basamaklı sayıyı kullanarak başka işlem yapmak istiyorum ama
beceremedim

KODGIR:

PORTD=0 \'portd\'yi sıfırla
PORTE=0 \'porte\'yi sıfırla
\'KOD=0 \'kod\'u sıfırla
VAR1 = InKey \'VAR1 değişkenini Inkey\'e at
If VAR1=16 Then GoTo KODGIR       \'Keypad\'de herhangi bir tuşa basılmadığı zaman 0\'a basılmış gibi algılıyor ve bu VAR1\'de 16\'ya karşılık geliyor.VAR1=16 olursa işlem yapmadan KODGIR\'e gönderilir.

KOD =   LookUp VAR1,[1,2,3,255,4,5,6,255,7,8,9,255,10,0,11]   \'keypad\'de   basılan numarayı kod değişkenine at

sutun=sutun+1

if KOD=11 then GoTo sonuc endif



Print At 2,sutun,@ KOD       \'KOD\'u decimal olarak ekranda göster

DelayMS 200
GoTo KODGIR

bu kod ile girdiğim örnegin 125 girdim diyelim # tuşuna basınca bu girdiğim 125\'i bir değişkene atayıp
ona göre işlem yapmak istiyorum ama olmuyor


neural

Şöyle bir algoritma çözüm olabilir.
Tuşa basılınca önceden tanımlamış olduğun dizi değişkenine aktarırsın.
Yani her tuşa basınca okunan değeri dizinin ilk elemanına ikinci tuş basılınca ikinci elemana aktarırsın.
Tüm değişkenleri bitirince yada onay için başka tuşa basılınca diziye kaçtane eleman aktardığını tuttuğun bir değişken yardımıyla en son elemana gidersin.

En son girdiğin basamak birler basamağı olduğu için son girilen rakam ile 1 çarparsın.
Sondan bir önceki basamak onlar basamağı olduğu için 10 ile çarparsın.
..
..
..
Kaç tane girilmişse basamak değerleri ile çarpar sonuçları toplarsın. Toplam senin girmiş olduğun rakam olur.


Temsili anlatım
1 5 8 6 3 OK
x x x x x
1 1 1 1 1
0 0 0 0
0 0 0
0 0
0

3+60+800+5000+10000 = 15863

Kolay gelsin...

forumsad

lcd ekranını okuyup değişkene atama imkanımız yokmudur???

neural

Okunabilir, ancak okuduğun değerler senin klavyeden girdiğin değerler gibi ayrı ayrı olacaktır. Hatta okuduğun değerler direk sayının kendisi 0,1,2 gibi değil ascii karşılığı olan \"0\" , \"1\" gibi değerler olacaktır.

Basic dilini fazla bilmiyorum ama şuna benzer bir şeyler işini görür sanırım...

gosub tusoku

if tus = \"#\" then
for y = x to 0
sonuc = sonuc + (deger[y]*10^(x-y))
next
x=0

else
deger[x] = tus
x = x + 1

endif


Kodda ^ ifadesini üs almak için kullandım. Basic dilinde nasıl yapılıyorsa o şekilde yazmalısın.
Ayrıca ilgili değişken tanımlamalarını yapmalısın. Tusoku altprogramı hangi tuşa basılmışsa tus değişkenine ilgili tuşun değerini atmalıdır. Sanırım tuş okuma olayını çözmüşsün. Tarama işlemini tuşun değerlerini tusoku altprogramında halledersen yani geri dönüş değerlerini olması gerektiği gibi yaparsan program yazarken daha kontrollü olur.

Kolay gelsin...


forumsad

şu şekilde bir şey yapmaya çalıştım ama daha pratik bir yazım şekli varmı acaba ???
Device=16F877
XTAL 4

Dim sutun As word
Dim s1 As word
Dim s2 As word
Dim s3 As word
Dim sayi As word

Dim KOD As Byte
Dim VAR1 As Byte
Dim DUR As 200
Declare LCD_DTPIN PORTC.4 \'DATA girişi PORTC\'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTC.3
Declare LCD_RSPIN PORTC.2
Declare LCD_INTERFACE 4
Declare LCD_LINES 4 \'LCD 4 satırdan oluşuyor
Declare KEYPAD_PORT PORTB \'KEYPAD\'in bağlandığı port
PORTB_PULLUPS = 1 \'PORTB\'nin pull-upları aktif
REMINDERS = OFF
ALL_DIGITAL = True \'bütün çıkışlar dijital

\'____________________________________________________________________________________________
BASLA:   
Print At 1,1, \" KOD GIRINIZ:  \"
DelayMS 100
sutun=1
s1=\"x\"
s2=\"x\"
s3=\"x\"
\'_________________________________________________________________________________________
KODGIR:

PORTD=0 \'portd\'yi sıfırla
PORTE=0 \'porte\'yi sıfırla
KOD=0 \'kod\'u sıfırla
VAR1 = InKey \'VAR1 değişkenini Inkey\'e at
If VAR1=16 Then GoTo KODGIR       \'Keypad\'de herhangi bir tuşa basılmadığı zaman 0\'a basılmış gibi algılıyor ve bu VAR1\'de 16\'ya karşılık geliyor.VAR1=16 olursa işlem yapmadan KODGIR\'e gönderilir.

KOD =   LookUp VAR1,[1,2,3,255,4,5,6,255,7,8,9,255,10,0,11]   \'keypad\'de   basılan numarayı kod değişkenine at
sutun=sutun+1
Print At 2,sutun,@ KOD       \'KOD\'u decimal olarak ekranda göster

if sutun=2 Then s1=KOD
if sutun=3 Then s2=KOD
if sutun=4 Then s3=KOD


if s1=1 and s2=\"x\" and s3=\"x\" then  sayi=1
if s1=2 and s2=\"x\" and s3=\"x\" then  sayi=2
if s1=3 and s2=\"x\" and s3=\"x\" then  sayi=3
if s1=4 and s2=\"x\" and s3=\"x\" then  sayi=4
if s1=5 and s2=\"x\" and s3=\"x\" then  sayi=5
if s1=6 and s2=\"x\" and s3=\"x\" then  sayi=6
if s1=7 and s2=\"x\" and s3=\"x\" then  sayi=7
if s1=8 and s2=\"x\" and s3=\"x\" then  sayi=8
if s1=9 and s2=\"x\" and s3=\"x\" then  sayi=9
if s1=1 and s2=0 and s3=\"x\" then  sayi=10
if s1=1 and s2=1 and s3=\"x\" then  sayi=11
if s1=1 and s2=2 and s3=\"x\" then  sayi=12
if s1=1 and s2=3 and s3=\"x\" then  sayi=13
\'............
if s1=1 and s2=0 and s3=0 then  sayi=100
if s1=1 and s2=0 and s3=1 then  sayi=101



If KOD = 11 Then GoTo degerlendir    
DelayMS 200

goto KODGIR


\'.......................................................................................
degerlendir:
cls
if sayi=1 Then GoTo git1
if sayi=2 Then GoTo git2
if sayi=3 Then GoTo git3
if sayi=4 Then GoTo git4
if sayi=5 Then GoTo git5
if sayi=6 Then GoTo git6
if sayi=7 Then GoTo git7
if sayi=8 Then GoTo git8
if sayi=9 Then GoTo git9
if sayi=10 Then GoTo git10
if sayi=11 Then GoTo git11
if sayi=12 Then GoTo git12
if sayi=13 Then GoTo git13
\'...............
if sayi=100 Then GoTo git100
if sayi=101 Then GoTo git101

GoTo KODGIR
\'.................................................................................................


git1:
Print At 1,1,\"girdiginiz sayi:1\"
DelayMS 200
GoTo KODGIR

git2:
Print At 1,1,\"girdiginiz sayi:2\"
DelayMS 200
GoTo KODGIR

git3:
Print At 1,1,\"girdiginiz sayi:3\"
DelayMS 200
GoTo KODGIR

git4:
Print At 1,1,\"girdiginiz sayi:4\"
DelayMS 200
GoTo KODGIR

git5:
Print At 1,1,\"girdiginiz sayi:5\"
DelayMS 200
GoTo KODGIR

git6:
Print At 1,1,\"girdiginiz sayi:6\"
DelayMS 200
GoTo KODGIR

git7:
Print At 1,1,\"girdiginiz sayi:7\"
DelayMS 200
GoTo KODGIR

git8:
Print At 1,1,\"girdiginiz sayi:8\"
DelayMS 200
GoTo KODGIR

git9:
Print At 1,1,\"girdiginiz sayi:9\"
DelayMS 200
GoTo KODGIR

git10:
Print At 1,1,\"girdiginiz sayi:10\"
DelayMS 200
GoTo KODGIR

git11:
Print At 1,1,\"girdiginiz sayi:11\"
DelayMS 200
GoTo KODGIR

git12:
Print At 1,1,\"girdiginiz sayi:12\"
DelayMS 200
GoTo KODGIR

git13:
Print At 1,1,\"girdiginiz sayi:13\"
DelayMS 200
GoTo KODGIR

\'..............

git100:
Print At 1,1,\"girdiginiz sayi:100\"
DelayMS 200
GoTo KODGIR


git101:
Print At 1,1,\"girdiginiz sayi:101\"
DelayMS 200
GoTo KODGIR


End


neural

Yazmış olduğun bu kodla belleğin tamamını doldurursun herhalde. Özellikle pic basic gibi bir dille yazıyorsan bayağı bir hor kullanır belleği...
Örnek:

Print At 1,1,\"girdiginiz sayi:13\"

komutunun asm karşılığı

LCDOUT?C   0FEh
LCDOUT?C   001h
LCDOUT?C   056h
LCDOUT?C   041h
LCDOUT?C   041h
LCDOUT?C   041h
LCDOUT?C   041h
LCDOUT?C   052h

gibi bir şey oluyor yani print At komutu döngü kullanmak yerine her ascii karakteri tek tek yolluyor.
Yani senin kodunda bayağı bir yer kaplar.
Ayrıca yazmış olduğun if döngüleri inanılmaz bir yer kaplar, tabi asm ye göre konuşuyorum.

Sana tavsiyem alt program kullanman daha önce ki mesajdaki kodun bir denemesini yapabilirsin...


neural

\'****************************************************************
\'*  Name    : Keyboard.BAS                                      *
\'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
\'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
\'*          : All Rights Reserved                               *
\'*  Date    : 14.01.2010                                        *
\'*  Version : 1.0                                               *
\'*  Notes   :                                                   *
\'*          :                                                   *
\'****************************************************************

Device 16F877
 
Declare LCD_DTPIN PORTD.4 \'DATA girişi PORTC\'nin 4. ucundan başlayacak
Declare LCD_ENPIN PORTE.1
Declare LCD_RSPIN PORTE.0
Declare LCD_INTERFACE 4
Declare LCD_LINES 4 \'LCD 4 satırdan oluşuyor
Declare KEYPAD_PORT PORTB
ALL_DIGITAL = True
Dim tus As Byte
Dim sonuc As Word
Dim deger[5] As Byte
Dim x As Byte
Dim y As Byte
dim agirlik as word

x=0
loop:
    GoSub Tusoku
   
    If tus <> 16 Then
   
    If tus = 15 Then
        x = x - 1
    For y = x To 0 Step -1
      gosub usal
    sonuc = sonuc + (deger[y]* agirlik )
    Next
    Print At 2,1,@sonuc
    sonuc = 0
    x=0
    Else
        Print 1,1,@tus
    deger[x] = tus
    x = x + 1
    If x = 5 Then x = 0
    EndIf
    EndIf
GoTo loop

Tusoku:
    tus = InKey
    DelayMS 100
    Return   


usal:
dim z as byte
if x-y = 0 then
agirlik = 1
return
endif
agirlik = 1
for z = x-y to 1 step -1
agirlik = agirlik * 10
next z
return


sonuc değişkeninde girilen sayıların basamak değerine göre toplamı bulunmaktadır.

forumsad