Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

CCS C alıştırma Turlarım

Başlatan Mucit23, 10 Şubat 2012, 15:29:51

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

kantirici

void lcd_yaz(char * s) 
{
 
  while(*s)
    printf(lcd_putc,*s++);
}

lcd_yaz("aasasd");

Bu şekilde çalışması lazım.

Mucit23

#92
Alıntı yapılan: justice_for_all - 22 Aralık 2012, 23:55:33
hata mi veriyo ki?

Hocam yazım hatası yapmışım. Düzeltince oldu ama char deneme isimli değişkeni global tanımlayamıyorum. Ozaman hata alıyorum.

Alıntı yapılan: kantirici - 22 Aralık 2012, 23:59:19
void lcd_yaz(char * s) 
{
 
  while(*s)
    printf(lcd_putc,*s++);
}

lcd_yaz("aasasd");

Bu şekilde çalışması lazım.

Bunuda bir deneyelim

Edit; Kantirici denedim fakat olmadı
lcd_yaz("aasasd"); Bu şekilde kabul etmiyor.

  char deneme[]="deneme";
  lcd_yaz(deneme);
Böyle yapınca oluyor fakat ekrana yazmıyor. Sanırım While düzgün çalışmıyor burada..

justice_for_all

fonksiyon disinda tanimladigin zaman global olur zaten.tabi yine kendi icinde global olur baska dosyalarda bu degiskeni kullanamazsin demek istedigin buysa.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

kantirici

Bu şekilde denermisin.

void lcd_yaz(const char * s)
{

  while(*s)
    printf(lcd_putc,*s++);
}

lcd_yaz("aasasd");

Mucit23

Kafayı yedirtecek bu ccs bana...  >:(

cpp de ne güzel istediğim gibi istediğim yere string gönderiyordum. Bu nekadar sıkıntılıymış.

@justice_for_all,

az önce ne yaptıysam oldu. şimdi aynısını tekrar yazıyorum kabul ediyor fakat görüntü ekrana gelmiyor...

@Kantirici  :) :)

Hocam sizin hiçbir yöntem işe yaramadı.

Bence while(*s) burada çalışmıyor. lcd_yaz("aasasd"); Bu şekilde bir kullanımı hiçbir şekilde kabullenemiyor ccs

justice_for_all

benim yaptigim fonksiyonda

lcd_yaz("deneme");

olarak deneyin bide.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Mucit23

Oldu çok şükür.

Hocam yine benden kaynaklı bir problem. Değişkeni global olarak char deneme[]=""; şeklinde tanımlıyordum

Başka yerlerde değer vermek istediğimde yine aynı şekilde string yüklüyordum. sadece deneme="merhaba"; demek yeterliymiş.

Teşekkürler

@Kantirici, Sanada Teşekkür ederim ilgin için.

Mucit23

Arkadaşlar LCD özel Karakter meselesini çözemedim henüz.

LCD nin Gram Hafızasına data yazıp onları kullanmam için sırayla ne yapmalıyım.

Mucit23

Özel Karakter işini hallettim.

C yapısı hakkında birşey sormak istiyorum

Diyelim iki adet menü fonksiyonu var bu fonksiyonlarda menü kodlarımı çalıştırıyorum.

void menu1()
while(true)
{
.
.
.
}

void menu2()
while(true)
{
.
.
.
}


Şeklinde..

Diyelim bir butona bastığım zaman diğer menü fonksiyonuna geçmek istiyorum. Benim yaptığım işlem butona basılınca diğer fonksiyonu çarğımak . İşlemci zaten 2. fonksiyonda döngüye girip çıkamıyor. Ayı şekilde 2 menüdende ana main fonksiyonuna dallanmak istiyorum.

Şimdi ben 2 menüden ana program döngüsüne gitmem için ne yapmam gerekir. Ana program döngüsü üstüne bir etiket koyup goto ile orayamı gideyim.

Bir diğer aklıma takılan ise stack taşması. Diyelim bu şekilde fonksiyondan fonksiyona atladım. İşlemcide stack taşması meydana gelmezmi

sadogan

Menü  için "CASE" yapısı daha uygun.

M_B

char ButonDeger=0;
void main(void)
....
....
....

{
	while(1)
		{



		if(Buton)
			{
			ButonDeger+; 
			if(ButonDeger==1){ menu1();}
			if(ButonDeger==2){ menu2();}
			if(ButonDeger<=3){ ButonDeger=0;}
			
			} // if buton sonu
		} // while sonu

void menu1()
{

}


void menu2()
{

}


Bir başka örnek
Kod çalışıyor. Kodun bir bolumu yayınlandı. Fikir vermesi acısından.

void main(void)
{
unsigned int i;
	PORTC=0x00;
	TRISC=0x00; 	// PORTC çıkıs
	PORTB=0x00;
	TRISB=0x00; 	// GLCD için çıkıs
	ADCON1=0x06;
	TRISA=0xFF;
	PORTA=0x00;
	OK=1;
	Azalt=1;
	Artir=1;
	nokia_init();
	init_DS1302();


	while(1)
			{
	Tarihgoster();
	Saatgoster();
				nokia_gotoxy(2,0);
				nokia_printchar("Saat");

				nokia_gotoxy(36,0);
				nokia_printchar(time);
		
				nokia_gotoxy(2,1);
				nokia_printchar("Tarih");
			
			if(OK==1)  // menuye girme kismi
				{
				Menu();
				}
				DelayMs(500);
				DelayMs(500);
				DelayMs(500);
				DelayMs(500);
					
			}

}


void Menu(void)
{
	unsigned  char ayar1,ayar2;
	unsigned char menuCikis=1;
	ayar1=1;
	ayar2=0;
	nokia_clean_ddram();
	DelayMs(500);	
	nokia_gotoxy(2,0);
	nokia_printchar(" SAAT - TARIH ");
	nokia_gotoxy(2,1);
	nokia_printchar("    AYARLAMA ");
	nokia_gotoxy(2,3);
	nokia_printchar(">1.Saat Ayar" );
	nokia_gotoxy(2,4);
	nokia_printchar(" 2.Tarih Ayar" );
	while(menuCikis)
			{
			if(Azalt==1)
						{
						nokia_gotoxy(1,4);
						nokia_printchar(" ");
						nokia_gotoxy(1,3);
						nokia_printchar(">");
						ayar1=1;
						ayar2=0;
					  
						}
			if(Artir==1)
						{
						nokia_gotoxy(1,3);
						nokia_printchar(" ");
						nokia_gotoxy(1,4);
						nokia_printchar(">");
						ayar2=1;
						ayar1=0;
						}
			if(OK==1)
					{
					if(ayar1==1)  // Saat ayarlama 
							{
							SaatAyar();
							DelayMs(500);
							DelayMs(250);
							menuCikis=0;
							}
					if(ayar2==1)  // Tarih ayarlama 
							{	
							TarihAyar();
							DelayMs(500);
							DelayMs(250);
							menuCikis=0;
							}
					} // OK tus sonu
			} // while(menuCikis) Sonu
nokia_clean_ddram();  // Ekrani Temizlemek için kullaniliyor.
} // Menu Fonksiyon sonu


// ******************* Saat Ayar *************************

void SaatAyar(void)
{
unsigned char dakAy=0;
unsigned char saatAy=1;
nokia_clean_ddram();

	while(saatAy)  			// saat ayarlama bölümü
	{ 
	nokia_gotoxy(2,0);
	nokia_printchar("Saat");
	nokia_gotoxy(2,1);
	Saatgoster();
	
	if(Artir)
			{	
			DelayMs(250);
			DelayMs(250);
			saat1++;
			if(saat1==10){saat1=0;saat10++;}
			if(saat10==2 && saat1==4){saat10=0;saat1=0;}
			saat=((saat10<<4)&0xF0) | (saat1&0x0F);
			write_DS1302(HOUR,saat);  // saat güncellendi
			nokia_clean_ddram();nokia_gotoxy(2,1);	Saatgoster();while(Artir);					
			}
	if(Azalt)
			{
			DelayMs(250);
			DelayMs(250);
			saat1--; 	// birler hanesini azalt
			if(saat10==0 && saat1==255){saat10=2;saat1=3;}
			if(saat1==255){saat1=9;saat10--;}
			saat=((saat10<<4)&0xF0) | (saat1&0x0F);
			write_DS1302(HOUR,saat); // saat güncellendi
			nokia_clean_ddram();nokia_gotoxy(2,1);Saatgoster();while(Azalt); 	
			}
	if(OK==1)
		{
		DelayMs(250);
		DelayMs(250);
		saatAy=0;
		dakAy=1;
		}
		
		while(dakAy)
				{
				nokia_gotoxy(2,1);	
				Saatgoster();
				nokia_gotoxy(2,0);
				nokia_printchar("Dakka");
				if(Artir) 	// dakika ayarlama bölümü
						{
						DelayMs(250);
						DelayMs(250);
						dakika1++; 						// birler hanesini arttır
						if(dakika1==10){dakika1=0;dakika10++;}
						if(dakika10==6 && dakika1==0){dakika10=0;dakika1=0;}
						dakika=((dakika10<<4)&0xF0) | (dakika1&0x0F);
						write_DS1302(MINUTE ,dakika);			 // dakika güncellendi
						nokia_clean_ddram();nokia_gotoxy(2,1);	Saatgoster();while(Artir);	
						}
				if(Azalt) // dakika ayarlama bölümü
						{
						DelayMs(250);
						DelayMs(250);
						dakika1--; 							// birler hanesini azalt
						if(dakika10==0 && dakika1==255){dakika10=5;dakika1=9;}
						if(dakika1==255){dakika1=9;dakika10--;}
						dakika=((dakika10<<4)&0xF0) | (dakika1&0x0F);
						write_DS1302(MINUTE ,dakika);	 // dakika güncellendi
						nokia_clean_ddram();nokia_gotoxy(2,1);Saatgoster();while(Azalt);
						}
				if(OK==1)
						{ 
						DelayMs(250);
						DelayMs(250);
						saatAy=0;
						dakAy=0;
						}
						
				}  // while(dakAy) Sonu
	} // while(SaatAy) Sonu
}


Mucit23 umarım işini görür.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

#102
Mantığını anladım. Burada program farklı yerlerde dönmüyor. Hep Main programı içerisinde çalışıyor ama menü aktif iken menü kodları işletiliyor.


edit:
Fakat biraz düşününce pek mantıklı gelmiyor bu bana. Çok dallı budaklı bir menü yaparsak herşey birbirine girer. Çok karmaşık olur. Çok karmaşık menülerde nasıl bir yol izlenmeli

JOKERAS

Selam,
Co operative multitask,multitask,statemachine gibi program akışını istediğiniz şekilde yönlendiren
tasarımlar var onları inceleyin,bu konuların mantığını çözdüğünüzde o dediğinizi çok kolay yaparsınız.

Mucit23

Menü işini kavradım. Yalnız multi task olayını pek anlayamadım. O konuya tekrar bakacam.

Bi matematiksel problemim var.

       adc_x=(read_adc()*220);
       lcd_gotoxy(1,2);
       printf(lcd_putc,"R=%ld",adc_x); 

adc_x değerini unsigned int32 olarak tanımlamışım. Kodu çalıştırdığımda ADC değeri 1023 iken ekranda 28452 değerini görüyorum. Burada yaptığım işlem ADC değerini 220 ile çarpmak. Normalde 225060 çıkması gerekir. Neden böyle bir sonuçla karşılaşıyorum. Acaba 16F serisinde bu tür yüksek boyutlu işlemler yapılamıyormu?