PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : مشکل در راه اندازی LCD GRAPHIC با css



mohammad_sth
27-01-2011, 01:34
با سلام و خسته نباشید به تمام مهندسان، یک مشکلی برای من در راه اندازی ال سی دی گرافیکی با css پیش اومده اونم اینه که می خوام دما را خوانده و روی lcd نمایش بدهم ولی وقتی متغییر رو می زارم که بهم نمایش بده مثل:glcd_text57(75, 29, temp, 1, ON); هیچ چیز به من نشان نمی دهد متشکر می شوم کمکم کنید

1nafar
28-01-2011, 09:03
سلام
بهتره کل برنامه رو بزارید .

mohammad_sth
30-01-2011, 00:51
سلام جناب 1nafar و تشکر از جوابتون
این یک قسمت از برنامه منه
#include <18F8722.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=8000000)

#include <HDM64GS12.c>
#include <graphics.c>

void main() {

int8 adc = 0;
setup_adc_ports(RA0_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
glcd_init(ON);

while(TRUE) {
adc = read_adc();
glcd_text57(59, 28, adc, 2, ON);
delay_ms(100);
glcd_text57(59, 28, adc, 2, OFF);
}

}

2- یک مشکل دیگه ام اینه که توی ccs چجوری میشه DEBOUNCE ایجاد کرد چون توی برنامه یک LOOP درست کردم و می خواهم هر وقت یک پایه 1 شدش به یدونه از متغیر های من یک عدد ازافه کنه مشکل اینه که 1 عدد اضافه نمی کنه همینجور می شمره تا انتها البته تو LOOP هنگ می کنه برای رفع این مشکل چند ثانیه هم DELAY گذاشتم اما مشکل حل نشدش .
ممنون می شوم جوابمو هرچی زود تر بدهید
باز هم تشکر

1nafar
30-01-2011, 08:57
سلام
متغیر ADC رو از نوع INT معرفی کنید .

#include <16f877a.h>
#fuses NOWDT, HS, NOPROTECT, BROWNOUT, NOPUT, NODEBUG, NOLVP
#use delay(clock=20000000)
#use i2c(MASTER, SDA=PIN_C4, SCL=PIN_C3)
#use rs232(baud=57600,parity=N,bits=8,xmit=PIN_C6,rcv=P IN_C7)

#define downarrow PIN_C1
#define select PIN_C2

#include <ds1307.c>
#include <HDM64GS12.c>
#include <graphics.c>

char lcddata[20];

int sec, min, hrs, day, mth, year, dow;
int outputforce[8];
int p, arrowstate;

void drawstates()
{
int forcestat;
int ypos = 0;
for(p=0;p<8;p++)
{
forcestat = outputforce[p]; //move force state to var

if (arrowstate == p) //check if arrow position state is on the same line as we are printing too.
{
sprintf(lcddata,"<<");
glcd_text57(115,ypos,lcddata,1,on);
}
else
{
glcd_rect(115, ypos, 128, ypos + 8, yes, off); //clears all other positions
}

switch (forcestat)
{
case 0: //force is off
sprintf(lcddata,"Off");
glcd_text57(85,ypos,lcddata,1,on);
break;

case 1: //force is On
sprintf(lcddata,"On");
glcd_text57(85,ypos,lcddata,1,on);
break;

case 2: //force is off
sprintf(lcddata,"Auto");
glcd_text57(85,ypos,lcddata,1,on);
break;
}
ypos = ypos + 8;
}
}
void main()
{


glcd_init(ON); //turn of LCD


arrowstate = 0;
sprintf(lcddata,"Light Bank 1"); //setup non-changing data
glcd_text57(1,0,lcddata,1,on);
sprintf(lcddata,"Light Bank 2");
glcd_text57(1,8,lcddata,1,on);
sprintf(lcddata,"Light Bank 3");
glcd_text57(1,16,lcddata,1,on);
sprintf(lcddata,"Light Bank 4");
glcd_text57(1,24,lcddata,1,on);
sprintf(lcddata,"Light Bank 5");
glcd_text57(1,32,lcddata,1,on);
sprintf(lcddata,"Heaters");
glcd_text57(1,40,lcddata,1,on);
sprintf(lcddata,"PH Valve");
glcd_text57(1,48,lcddata,1,on);
sprintf(lcddata,"Hood Fan");
glcd_text57(1,56,lcddata,1,on);

while(1)
{




drawstates();

if (input(downarrow)) //down switch
{
if (arrowstate >= 7)
{
arrowstate = 0;
}
else
{
arrowstate ++;
}
}

if (input(select)) //select switch, set forcestate if pushed
{
if (outputforce[arrowstate] >= 2)
{
outputforce[arrowstate] = 0;
glcd_rect(85, arrowstate * 8, 112, arrowstate * 8 + 8, yes, off);
}
else
{
outputforce[arrowstate] ++;
glcd_rect(85, arrowstate * 8, 112, arrowstate * 8 + 8, yes, off);
}
}


}

}
اگه شما مشکلی با نمایش دادن کارکتر و... روی LCD نداشته باشید با تغییر دادن متغیر مشکلتون حل میشه .

- یک مشکل دیگه ام اینه که توی ccs چجوری میشه DEBOUNCE ایجاد کرد چون توی برنامه یک LOOP درست کردم و می خواهم هر وقت یک پایه 1 شدش به یدونه از متغیر های من یک عدد ازافه کنه مشکل اینه که 1 عدد اضافه نمی کنه همینجور می شمره تا انتها البته تو LOOP هنگ می کنه برای رفع این مشکل چند ثانیه هم DELAY گذاشتم اما مشکل حل نشدش .
ممنون می شوم جوابمو هرچی زود تر بدهید
برای ایجاد دیبانس روش های مختلفی وجود داره ، مثالا اگه کلید شما به پایه ی A.0 متصل شده باشه

set_tris_a(0xFF);
if(input(PIN_A0) == 0) {
delay_ms(100);
if(input(PIN_A0) == 1){
output_high(PIN_A0);
delay_ms(100);
برنامه ی بالا رو من همین جوری نوشتم و ممکنه از نظر دستوری درست نباشه ، اما برای چک کردن کلید خیلی مفیده ، نحوه ی کار کردن برنامه به این صورت هست که ابتدا کلید فشرده میشه ( کلید به گراند متصل میشه در هنگام فشرده شدن ) و شرط اول اجرا میشه ، بعد CPU منتظر میمونه تا شما کلید رو رها کنید ، با رها شدن کلید برنامه اجرا میشه .