sayan sayıyı durdurma ve durduğu yerden geriye sayma nasıl yapılır?

Başlatan Recep METE, 10 Eylül 2014, 21:31:01

Recep METE

Arkadaşlar yaptığım programda sayı 1'den başlıyor 1000000000'e kadar gidiyor.Diyelim a0 tuşu ile sayı saymaya başladı.a1 tuşu ile durdurmak istiyorum.a2 tuşuna basınca hangi sayıda ise geriye saymasını istiyorum.Durdurmak için nasıl bir kod yazmalıyım.Birde durdurduğumuz sayıdan geriye sayması için nasıl bir kod yazmalıyım.Yardımlarınızı bekliyorum.

1 den 1000000000'a kadar sayan kod;
   while(1) // Sonsuz döngü
   {
     
     if(input(pin_a0)){delay_ms(15);while(input(pin_a0));
     for(i=0;i<100000000000;i++){
     sayi++;
     
     lcd_gotoxy(1,2);
     printf(lcd_putc,"%ld",sayi);
     }
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Kabil ATICI

int sayma=0;
int bayrak=0;




if(input(pin_a0))//ileri sayma buton
{bayrak=1;}

if(input(pin_a1)) //durdur buton
{bayrak=0}

if(input(pin_a2)) //geri sayma buton
{bayrak=2;}

if (bayrak==1)//ileri sayma
{sayma++;
if(sayma==100000000000)//sayma üst sınıra ulaşınca sıfırla
{sayma=0;}
     lcd_gotoxy(1,2);
     printf(lcd_putc,"%ld",sayi);
}

if (bayrak==2) //geri sayma
{sayma--;
if(sayma<0)
{sayma=100000000000;}//sayma 0'dan küçük ise maksimum sayı
     lcd_gotoxy(1,2);
     printf(lcd_putc,"%ld",sayi);
}


program içine artık bildiğin gib yerleştirir gerekirse debounce konulari ile ilgilenirsin.
ambar7

Gökhan BEKEN

@ambar7 erken davranmış, neyse yazmış bulundum,
not: denemedim kafadan attım
#define ARTIR 1
#define EKSiLT 0

#define ON 1
#define OFF 0

#define ARTIRMA_BUTONU pin_a0
#define EKSiLTME_BUTONU pin_a2
#define DURDURMA_BUTONU pin_a1


char artirEksilt = ARTIR ;
char durdur=ON;
unsigned long sayac=0;

while(1) 
{
	if(input(ARTIRMA_BUTONU)) {delay_ms(15); artirEksilt = ARTIR; durdur=OFF;}
	if(input(EKSiLTME_BUTONU)){delay_ms(15); artirEksilt = EKSiLT; durdur=OFF;}
	if(input(DURDURMA_BUTONU)){delay_ms(15); durdur=ON;}
	
	if(artirEksilt == ARTIR && durdur == OFF){
 		if(sayac<1000000000)sayac++;
     	}
	if(artirEksilt == EKSiLT && durdur == OFF){
 		if(sayac>0)sayac--;
     	}

	


     	lcd_gotoxy(1,2);
     	printf(lcd_putc,"%ld",sayac);
	delay_ms(100); //sayma hızı
}
Özel mesaj okumuyorum, lütfen göndermeyin.

Recep METE

Arkadaşlar;  @ambar7, @meftun yanıtlarınız için teşekkürler ancak ben durdurma olayını hala çözemedim.Verdiğiniz kodlardan geri sayma olayını çözdüm.

mesaj birleştirme:: 10 Eylül 2014, 22:44:47

Alıntı yapılan: meftun - 10 Eylül 2014, 22:09:37
@ambar7 erken davranmış, neyse yazmış bulundum,
not: denemedim kafadan attım
#define ARTIR 1
#define EKSiLT 0

#define ON 1
#define OFF 0

#define ARTIRMA_BUTONU pin_a0
#define EKSiLTME_BUTONU pin_a2
#define DURDURMA_BUTONU pin_a1


char artirEksilt = ARTIR ;
char durdur=ON;
unsigned long sayac=0;

while(1) 
{
	if(input(ARTIRMA_BUTONU)) {delay_ms(15); artirEksilt = ARTIR; durdur=OFF;}
	if(input(EKSiLTME_BUTONU)){delay_ms(15); artirEksilt = EKSiLT; durdur=OFF;}
	if(input(DURDURMA_BUTONU)){delay_ms(15); durdur=ON;}
	
	if(artirEksilt == ARTIR && durdur == OFF){
 		if(sayac<1000000000)sayac++;
     	}
	if(artirEksilt == EKSiLT && durdur == OFF){
 		if(sayac>0)sayac--;
     	}

	


     	lcd_gotoxy(1,2);
     	printf(lcd_putc,"%ld",sayac);
	delay_ms(100); //sayma hızı
}




Meftun hocam verdiğiniz kodları proteusta şimdi denedim çok güzel çalıştı.Tam istediğim gibi.Çok çok teşekkürler.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Gökhan BEKEN

Durdurmak diye birşey yok zaten hocam.
if(artirEksilt == ARTIR && durdur == OFF)
kısmında durdur == OFF ise saymaya devam ediyor, ama durdurma butonuna basılmışsa durdur == ON olduğu için saymıyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

sadogan

while(true)
{
   static unsigned char state=0;
   static unsigned int32 sayi=0;
   if(!input(pin_a0))state=1;
   else if(!input(pin_a1))state=0;
   else if(!input(pin_a2))state=2;
   if(state==1)sayi++;
   else if(state==2)sayi--;
}

artis hızı için delay koyabilirsin veya timer kullanmak daha iyi olur.

Recep METE

Meftun hocam şu yazdığınız kodları biraz açıklar mısınız.POlayı iyice kavramak istiyorum da.


if(input(ARTIRMA_BUTONU)) {delay_ms(15); artirEksilt = ARTIR; durdur=OFF;}
    if(input(EKSiLTME_BUTONU)){delay_ms(15); artirEksilt = EKSiLT; durdur=OFF;}
    if(input(DURDURMA_BUTONU)){delay_ms(15); durdur=ON;}
   
Bu yazdığınız kodlara göre nasıl duruyor ve durduğu yerden geriye geliyor.Açıklarsanız sevinirim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Gökhan BEKEN

Hocam 2 farklı durum var.

1. Durum: artirEksilt ile belirleniyor. Bu durum sayacın ileri veya geri sayacağını belirlemek için kullanılıyor. 2 farklı seçeneği var.  "0" olursa eksiltir, "1" olursa artırır. 0 ve 1 kısmını Türkçeleştirmek için 2 adet define tanımladım:

#define ARTIR 1
#define EKSiLT 0

ama isterseniz direkt 0 veya 1 verebilirsiniz aynı kapıya çıkar.

artirEksilt=ARTIR  derseniz sayacınız ileri saymak isteyecektir.
artirEksilt=EKSiLT  derseniz sayacınız geri saymak isteyecektir.
Dikkat edeseniz "sayacaktır" demiyorum "saymak isteyecektir" diyorum. Çünkü sayması için aşağıdaki anlatacağım durdurma durumunun pasif olması gerekir.


2- Durdurma durumu

Sayacın artması veya azalması için evvela "durdurma" durumunun pasif olması yani "0" gerekir. Durdurma aktif ise 1. durumdaki işlemler gerçekleşmemelidir. Durdurma durumunu kolayca hatırlamak için iki adet define tanımladık:

#define ON 1
#define OFF 0


durdur=ON; derseniz durdurma aktif olur ve sayac saymaz. Çünkü if ile kontrol ediyoruz:
    if(artirEksilt == ARTIR && durdur == OFF) // sayaç artmaya ayarlandıysa ve durdurma pasif ise
    if(artirEksilt == EKSiLT && durdur == OFF) // sayaç eksilmeye ayarlandıysa ve durdurma pasif ise

program ilk çalıştığında sayaç hiç saymayacaktır. Çünkü
char durdur=ON;

şeklinde bir tanımlama yaptık. Durdurma aktif oldu.

Durdurma durumu taa ki a0 veya a2 butonlarından birine basılana kadar aktif olur:
    if(input(ARTIRMA_BUTONU)) {delay_ms(15); artirEksilt = ARTIR; durdur=OFF;}
    if(input(EKSiLTME_BUTONU)){delay_ms(15); artirEksilt = EKSiLT; durdur=OFF;}

bu butonlara basılınca durdur=OFF; olur. Yani sayaç saymaya başlar.

taa ki bu şart gerçekleşene kadar:
if(input(DURDURMA_BUTONU)){delay_ms(15); durdur=ON;}

   

Özel mesaj okumuyorum, lütfen göndermeyin.

Recep METE

Meftun hocam, güzel açıklamaların için çok teşekkür ederim.Gerçekten çok faydalı bir yazı oldu.Yolun açık olsun.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Recep METE

Şimdi şöyle bir sıkıntı oluştu, geri saymalarda; örneğin 1234'den geriye sayıyor, binlikler bitip yüzlüklere geldiğinde rakam lcdnin solunda devam ediyor. LCD deki sayı örn;973 olması gerekirken 9730 oluyor.Onlar basamağına geldiğinde örn:37 olması gereken sayı 3700 olarak  geriye sayıyor. Bunu nasıl düzeltebilirim acaba.

mesaj birleştirme:: 11 Eylül 2014, 12:44:52

LCD satı sayma işini (16,1) den başlatsam sonra onlar basamağını (15,1), yüzler bas(14,1) vb lcd görünmesi için ne yapmalı. Benim program (1,1) den başlıyor.(16,1) yapmakda çözüm olmadı.Rakamlar daha sağa gidip görünmez oluyor.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

Gökhan BEKEN

2 farklı yöntemle halledebilirsiniz:
1.yöntem: Yazmadan önce LCD ekranı temizleyin
2.Yöntem: en büyük basamak sayınız kaç ise,  yazacağınız sayının basam sayınısını o sayıdan çıkarın. Bu sonuç kadar boş karakter yazın.
Örnek: sayacın en büyük değeri 1000000000 olsun. Bu sayı 10 basamaklıdır.
sayacın o anki değeri 1000 olsun. Arada 6 basamak fark var.
1000 değerini yazdıktan sonra 6 adet boşluk karakteri  yani ' ' gönderin.
Özel mesaj okumuyorum, lütfen göndermeyin.