ccsc fonksiyon çağrılan alt yordamla ilgili sorun

Kodlarını biraz değiştirerek düzenleyeceğim, kızmazsın umarım. :)
Ancak kodunda mantık hatası var, şuanlık öyle görünüyor.
Bitince burada paylaşacağım...
 
tabiki hocam neden kızıyım aksine teşekkür ediyorum vaktini ayırdığın için ama benim düşüncem olay void de bitiyor hepsini ayrı programmış gibi algılıyor
 
Aşağıdaki bağlantıda; hem CCS PIC C kodları var, hem de çalışan Protues dosyası var.
Elbette kodun üzerinde daha çok iyileştirmeler olabilir.
Ancak mantığı anlaman yeterli.



Kod:
#include <16f877a.h>
#fuses HS
#fuses NOWDT
#fuses NOPROTECT
#fuses NOBROWNOUT
#fuses NOLVP
#fuses NOPUT
#fuses NOWRT
#fuses NODEBUG
#fuses NOCPD
#use delay (clock=4000000)
#use fast_io(a)
#use fast_io(b)
#define use_portb_lcd TRUE

#include <lcd.c>

int8 c;
int8 b;
BYTE mainStatus,menuStatus,priceOK;
//void price_menu (void);

void price_menu()
{
    lcd_putc("\f");
    lcd_gotoxy(1,1);
    lcd_putc("***PRICE MENU***");
    lcd_gotoxy(1,2);
    lcd_putc("|OK|    |CANCEL|");;
    b=1;
    //Düğmede oluşabilecek arkları engellemek için geçikme
    delay_ms(300);
    while(1)
    {
        //Eğer OK'e basıldı ise fiyat işlemini onayla  
        if(input(pin_c2))
        {
            priceOK=1;
            break;
        }
        //Eğer CANCEL'a basıldı ise fiyat işlemini iptal et
        if(input(pin_c3))
        {
            priceOK=0;
            break;
        }
    }
}

void main()
{
    char X=10;
    mainStatus=0;    
    menuStatus=0;
    setup_psp(PSP_DISABLED);
    setup_spi(SPI_SS_DISABLED);
    setup_timer_1(T1_DISABLED);
    setup_timer_2(T2_DISABLED,0,1);
    setup_ccp1(CCP_OFF);
    setup_ccp2(CCP_OFF);
    set_tris_a(0x01);
    set_tris_c(0xff);
    setup_adc(ADC_CLOCK_INTERNAL);
    setup_adc_ports(RA0_RA1_RA3_ANALOG);
    lcd_init();
    set_adc_channel(0);
    delay_us(20);
    
    while(1)
    {
        //Eğer her hangi bir düğmeye basılmadı ise ana ekranı göster
        if(mainStatus==0)
        {
            lcd_putc("\f");
            lcd_gotoxy(1,1);
            lcd_putc("****************");
            lcd_gotoxy(1,2);
            lcd_putc("|MENU|");
        }
        //Sonsuz döngüde LCD'ye aynı mesajı tekrar yazdırmamak için 1 yap
        mainStatus=1;
        //MENU düğmesine basıldıysa, MENU'ye gir
        if(input(pin_c0))
        {
            while(1)
            {
                //Eğer her hangi bir düğmeye basılmadı ise menu ekranını göster
                if(menuStatus==0)
                {
                    lcd_putc("\f");
                    lcd_gotoxy(1,1);
                    lcd_putc("******MENU******");
                    lcd_gotoxy(1,2);
                    lcd_putc("|OK|    |CANCEL|");
                }
                //Sonsuz döngüde LCD'ye aynı mesajı tekrar yazdırmamak için 1 yap
                menuStatus=1;
                //OK düğmesine basıldı ise fiyat menüsüne git
                if(input(pin_c2))
                {
                    priceOK=0;
                    price_menu();
                    if(priceOK=1)
                    {
                        //Eğer fiyat onaylandıysa burayı çalıştır
                    }
                    else
                    {
                        //Eğer fiyat iptal edildiyse burayı çalıştır
                    }
                    menuStatus=0;
                }
                //Düğmede oluşabilecek arkları engellemek için geçikme
                delay_ms(200);
                //CANCEL düğmesine basıldı ise ana ekrana git
                if(input(pin_c3))
                {
                    menuStatus=0;
                    mainStatus=0;
                    break;
                }
            }
        }
    }
}
 
Neyse ben yatar, sana kolay gelsin... :)
 
baya emek harcamışsınız teşekkürler çok makbule geçti bilmediğim bi komut var break bunuda öğrenmiş oldum devreyi gerçekte kurduğumda butonlara bastığımda bazen kararsızlıklar oluyor bazen hiç almıyor bu konuda bi öneriniz varmı peki ?
 
CCS kullanmıyorum ama dikkatimi atamaların çift "=" ile yapıldığı çekti. Sanırım CCS'de de atamalar standart c syntax'ı ile yapılıyordur.


c==1;
while (C<1)
{

kısmı ve alt menüdeki c==2 kısmında c daima sıfır içerikli olacak .

Ancak;
c==1;
while (C<1)
{
kısmında da c= 1 olursa hiçbir zaman alt menüye dallanılan döngüye girmeyecek. Yani algoritmada da hata var..
 
CCSC de ansic yazmak mümkün , ustalar öyle diyor .
Lakin benim gibi programda acemiler için özeleştirilmiş komutlar var.
== eşitlik komutu
= atama komutu

x=5 sağ taraf değeri sol taraf değere atar
if(z==5)
z , 5 e eşitse koşulunu arar
if(z=5) yazılması durumunda parantez içini işler z ye 5 atar ve şarta bakar yani if komutu olsa ne yazar gibi olur...

CCSC için Serdar Çiçek hocanın kitabı çok güzel.

Elektronikde kullandığımız derleyiciler ister istemez kullanılan mcu ya göre özel komutlar içermek zorunda.
Bu açıdan bakıldığında ister istemez standart c den uzaklaşmak kaçınılmaz oluyor.
Cnin syntax dayatmaları yüzünden pek çok genç arkadaşımız daha kolayını basici seçiyor ve vakit kaybediyor.
Lakin başka açıdan bakınca kısa sürede sonuç alıp hevesi artıyor ve dalınca çıkamıyor ve kısa sürede hımmm c diyor.
Bu noktada örneklerinin çokluğu 12-16-18-24-30-33-ds hepsi bir arada c için ccsc , microchip için en uygun çözüm oluyor.

Bu arada belitmeliyim , okuyanlar yanlış anlamasın.
@ISMAILY hocam ileri düzey bir programcıdır.
 
baya emek harcamışsınız teşekkürler çok makbule geçti bilmediğim bi komut var break bunuda öğrenmiş oldum devreyi gerçekte kurduğumda butonlara bastığımda bazen kararsızlıklar oluyor bazen hiç almıyor bu konuda bi öneriniz varmı peki ?

Ben sana demiştim, bu kod daha da iyileştirilebilir diye. :)
Arkları engellemek için bekleme süreleri ile biraz oyna.


CCS kullanmıyorum ama dikkatimi atamaların çift "=" ile yapıldığı çekti. Sanırım CCS'de de atamalar standart c syntax'ı ile yapılıyordur.


c==1;
while (C<1)
{

kısmı ve alt menüdeki c==2 kısmında c daima sıfır içerikli olacak .

Ancak;
c==1;
while (C<1)
{
kısmında da c= 1 olursa hiçbir zaman alt menüye dallanılan döngüye girmeyecek. Yani algoritmada da hata var..

Dediğin kodlama hatalarını kendi yazdığımı kodda zaten düzelttim.
Atama operatörü tek eşittir ile yapılır.
 
Ben sana demiştim, bu kod daha da iyileştirilebilir diye. :)
Arkları engellemek için bekleme süreleri ile biraz oyna.




Dediğin kodlama hatalarını kendi yazdığımı kodda zaten düzelttim.
Atama operatörü tek eşittir ile yapılır.

bekleme sürelerini oynuyorum ama kar etmiyor sorunum tam olarak şu hatta ilginç bi sorun

int8 s;
s=0;
if (input(PIN_c0))

{

s=s+1; veya s++;
.
.

basit bi saydırma işlemi ama butona her basışımda temiz ve kararlı bi sayma yapamıyor tek bi tetiklemede 40 50 pals birden atıyor belki proteusta böyle yapıyodur diye pice attım denedim ordada aynı hal böyle olunca kodlamaya devam edemiyorum
 
Yazdığım kodda;
MENU düğmesine basdıktan sonra senin değişken 1 artar ve While(1) döngüsüne girer.
Tekrardan artması çok zor.
Sen kodu mu değiştirdin yoksa?
 

Forum istatistikleri

Konular
128,191
Mesajlar
915,726
Kullanıcılar
449,961
Son üye
omr70

Yeni konular

Çevrimiçi üyeler

Geri
Üst