سلام
من یه پروژه اسیلوسکوپ دوکاناله دارم و الان دارم روی توابع voltdivision , timedivision اون کار میکنم....
برای مقادیر voltdivision دو تا پوش باتن دارم که برای کم و زیاد کردن بکار میرن و مقادیر هم 1 و 2 و 5 هستند...
قصد دارم با تابع sprintf مقادیری رو روی glcd پروژه ام بفرستم ولی مشکل اینه...
در شروع به کار اسیلوسکوپ مقدار voltdiv رو 2 گذاشتم... با دکمه incvoltdiv تابعی به همین نام اجرا میشه و اون 2 رو به 5 تبدیل میکنه... در حالت دیگه چک میکنه که اگر روی GLCD عدد 1 ارسال شده بود اون عدد بشه 2.
و برای تابع decvoltdiv اگر مقدار اولیه 5 بود بشه 2 و اگر 2 بود بشه 1...
اما مشکل...
این برنامه رو ببینید:
کد:
#include <mega32a.h>
#include <stdio.h>
#include <delay.h>
#include <glcd.h>
#include <string.h>
#include <font5x7.h>
unsigned char A[20];//// baraye sprintf voltdiv
unsigned char B[20];//// baraye sprintf voltdiv
unsigned char z,y;
unsigned char vdc1=0,vdc2=0,z,y;///counter haye vlotdiv
void incvoltdiv (void);
void decvoltdiv (void);
void main(void)
{
// Declare your local variables here
// Graphic LCD initialization data
GLCDINIT_t glcd_init_data;
glcd_init_data.font=font5x7;
// No function is used for reading
// image data from external memory
glcd_init_data.readxmem=NULL;
// No function is used for writing
// image data to external memory
glcd_init_data.writexmem=NULL;
glcd_init(&glcd_init_data);
while (1)
{
///namayesh meghdar avalieh voltdivision va timedivision
if (vdc1==0 && vdc2==0){
sprintf(A,"%2d",2);
glcd_outtextxy(12,55,A);
z=2;
}
//kelid 5
if(PINB.4 ==0){
delay_ms(20);
if(PINB.4 ==0)
incvoltdiv();
vdc1++;
if(vdc1>3)
vdc1=3;
if(vdc2>0)
vdc2--;
}
// kelid 6
if(PINB.5 ==0){
delay_ms(20);
if(PINB.5 ==0)
decvoltdiv();
vdc2++;
if(vdc2>3)
vdc2=3;
if(vdc1>0)
vdc1--;
}
}
}
////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//// afzayesh volt division
void incvoltdiv (void)
{
glcd_outtextxyf (2,5,"incvoltdiv");
delay_ms(300);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);}
if ( strcmp(A,"2") || y == 2){
sprintf (A,"%2d",5);
glcd_outtextxy ( 12,55,A);
strcpy (A,"5");
z=5;}
else
{if(strcmp (B,"1") || y==1) ///// namayesh adad 2
sprintf (A,"%2d",2);
glcd_outtextxy ( 12,55,A);
z = 2;
} }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
void decvoltdiv (void)
{
glcd_outtextxyf (2,5,"decvoltdiv");
delay_ms(300);
for(i=2;i<20;i++){
for(j=2;j<62;j++)
glcd_clrpixel(j,i);
}
if(strcmp (A,"5") || z==5){
sprintf (B,"%2d",2);
glcd_outtextxy(12,55,B);
y =2;
}
//////
if (strcmp(A,"2") || z==2) ;
sprintf(B,"%2d",1);
glcd_outtextxy(12,55,B);
strcpy(B,"1");
y =1;
}
تو این برنامه در تابع decvoltdiv مقدارB زمانی 1 میشه که A برابر 2 باشه (( توسط تابع incvoltdiv )) و 2 شدن A هم در تابع incvoltdiv اتفاق میفته و اونهم زمانیکه مقدار B برابر 1 باشه...!!!
به بیان دیگه مقدار A وابسته به B و مقدار B هم وابسته به A میشه... بنابر این در این برنامه هرگز مقدار A برابر 2 و مقدار B برابر 1 نمیشه...!!
درست مثل دونفر آدم به اسم A و B که سر وارد شدن به جائی با هم تعارف میکنن!! A به B میگه تا شما وارد نشی منهم وارد نمیشم و B هم به A میگه من فقط پشت سر شما وارد میشم... نتیجه این میشه که هیشکی وارد نمیشه ...!!!
یه کمکی بکنید که این موضوع رو حل کنم... باور کنید سه روزه گرفتار همین موضوعم...!!
ممنون.