قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

abban270
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2009
المشاركات: 89
نشاط [ abban270 ]
قوة السمعة:
قديم 18-09-2014, 02:52 AM المشاركة 9   
افتراضي



نستطيع أن نسمي هذه بالطريقة التقليدية
وماذا لو كان عندي 20 نص و 20 حالة
هل يلزم كتابة هذا الكود 20 مرة لحساب طول النص
كود:
 if(display==1){ 
                     size1=sizeof(x0);//calcaulate size of txt
                     show_message(x0);
                    }
أليست العملية طويلة جدا
والمشكل الذي لدينا لم نفهم جيدا
لأن فهم السؤال نصف الجواب
بارك الله فيك أستاذ حسن


التعديل الأخير تم بواسطة : abban270 بتاريخ 18-09-2014 الساعة 03:01 AM
اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 18-09-2014, 05:37 AM المشاركة 10   
افتراضي


نستطيع أن نسمي هذه بالطريقة التقليدية
وماذا لو كان عندي 20 نص و 20 حالة
هل يلزم كتابة هذا الكود 20 مرة لحساب طول النص
كود:
 if(display==1){ 
                     size1=sizeof(x0);//calcaulate size of txt
                     show_message(x0);
                    }
أليست العملية طويلة جدا
والمشكل الذي لدينا لم نفهم جيدا
لأن فهم السؤال نصف الجواب
بارك الله فيك أستاذ حسن
أخي كريم يجب حساب طول النص للرساله الاصليه قبل عرض رساله والا ستحدث مشاكل في ذاكره البك لاني حاولت أحسب فقط طول نص لمصفوفه x بأعتبارها هي مصفوفه الي راح تعرض على شاشه ولكن يشتغل مره واحده ثم يخبرك هناك over stack
على عموم جرب هذا كود جديد يضا يعمل
ملاحظه كلما تضغط على زر يجب تصفير y لكي يعرض الرساله من البدايه
كود:
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
/// Configuration de LCD

bit P1,P2,P3,P4;

unsigned char y=0,size1,i, count;
char text_lcd[17];
const char *x;
const char start_message[]="                press any switch                ";
const char x0[] = "                MESSAGE NUMBER ONE IS HERE ... (O_O)                ";
const char x1[] = "                MESSAGE NUMBER TWO IS HERE ... (O_O)                ";
void show_message(const char *text);
void main()
{
//option_reg.b7=0;
TRISB=0XFF;     // initialisation du port B en entrée
ADCON1=0X06;
cmcon=7;
 Lcd_Init();
 lcd_cmd(_LCD_CURSOR_OFF);
 Lcd_Cmd(1);
 x=start_message;
 size1=sizeof(start_message);
while(1)
     {

      if(RB0_bit==0)  {x=x0;y=0;delay_ms(250); size1=sizeof(x0);}//calcaulate size of txt
      if(RB1_bit==0)  {x=x1;y=0;delay_ms(250) ;size1=sizeof(x1);}//calcaulate size of txt

       show_message(x);

     }
}



void show_message(const char *text)
{
  for(i=0;i<17;i++)
                  {
                    if(i==16){text_lcd[16]=0;break;}
                    else text_lcd[i]=text[i+y];
                  }

 lcd_out(1,1,text_lcd);

 count++;
 delay_ms(10);

 if(count==10)// to reducing time
                               {
                                y++;
                                if(y==(size1-15))y=0;
                                count=0;
                               }

}

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

abban270
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2009
المشاركات: 89
نشاط [ abban270 ]
قوة السمعة:
قديم 19-09-2014, 10:01 PM المشاركة 11   
افتراضي


مازال هنالك مشاكل في الكود
إنه يظهر خلبطة في LCD


abban270
:: مهندس متواجد ::
تاريخ التسجيل: Jul 2009
المشاركات: 89
نشاط [ abban270 ]
قوة السمعة:
قديم 20-09-2014, 02:15 AM المشاركة 12   
افتراضي


لقد حللت المشكل بطريقة أخرى
وحسنت الرسالة لتبدأ من اليسار
لكن وقعت في مشكل not enough ram

كود:
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
/// Configuration de LCD

bit P1,P2,P3,P4;

   unsigned char *x,y,size,i,j;
     char text_lcd[16];
char x0[] = "            MESSAGE NUMBER ONE IS HERE ... (O_O)           ";
char x1[] = "            MESSAGE NUMBER TWO IS HERE ... (O_O)           ";
char x2[] = "            MESSAGE NUMBER three IS HERE ... (O_O)           ";
char x3[] = "            MESSAGE NUMBER foor IS HERE ... (O_O)           ";
char x4[] = "            MESSAGE NUMBER five IS HERE ... (O_O)           ";
char x5[] = "            MESSAGE NUMBER six IS HERE ... (O_O)           ";
void main()
{
option_reg.b7=0;
TRISB=0XFF;     // initialisation du port B en entrée
TRISd=0xFC;        //initialisation du port C en sortie
ADCON1=0X06;
Lcd_init();
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){

 if  ((portb & 0x0F)==1)  {x=x0;   size=sizeof(x0);}
if  ((portb & 0x0F)==2)  {x=x1;   size=sizeof(x1);}
 if  ((portb & 0x0F)==3)  {x=x2;   size=sizeof(x2);}
if  ((portb & 0x0F)==4)  {x=x3;   size=sizeof(x3);}
 if  ((portb & 0x0F)==3)  {x=x4;   size=sizeof(x4);}
if  ((portb & 0x0F)==4)  {x=x5;   size=sizeof(x5);}
        if (portb!=j) {j=portb;y=0;  }     // efface l'ecran chaque evenement
                lcd_out(1,1,text_lcd);
                
         for(i=0;i<16;i++)
        {  text_lcd[i]=x[i+y]; }

        delay_ms(200);
     y++;
       if(i+y==size)y=0;

         }
}


التعديل الأخير تم بواسطة : abban270 بتاريخ 20-09-2014 الساعة 02:42 AM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,673
نشاط [ حسن هادي محمود ]
قوة السمعة:
قديم 20-09-2014, 07:04 AM المشاركة 13   
افتراضي


لقد حللت المشكل بطريقة أخرى
وحسنت الرسالة لتبدأ من اليسار
لكن وقعت في مشكل not enough ram

كود:
sbit LCD_RS at RD1_bit;
sbit LCD_EN at RD0_bit;
sbit LCD_D4 at RD4_bit;
sbit LCD_D5 at RD5_bit;
sbit LCD_D6 at RD6_bit;
sbit LCD_D7 at RD7_bit;

sbit LCD_RS_Direction at TRISD1_bit;
sbit LCD_EN_Direction at TRISD0_bit;
sbit LCD_D4_Direction at TRISD4_bit;
sbit LCD_D5_Direction at TRISD5_bit;
sbit LCD_D6_Direction at TRISD6_bit;
sbit LCD_D7_Direction at TRISD7_bit;
/// Configuration de LCD

bit P1,P2,P3,P4;

   unsigned char *x,y,size,i,j;
     char text_lcd[16];
char x0[] = "            MESSAGE NUMBER ONE IS HERE ... (O_O)           ";
char x1[] = "            MESSAGE NUMBER TWO IS HERE ... (O_O)           ";
char x2[] = "            MESSAGE NUMBER three IS HERE ... (O_O)           ";
char x3[] = "            MESSAGE NUMBER foor IS HERE ... (O_O)           ";
char x4[] = "            MESSAGE NUMBER five IS HERE ... (O_O)           ";
char x5[] = "            MESSAGE NUMBER six IS HERE ... (O_O)           ";
void main()
{
option_reg.b7=0;
TRISB=0XFF;     // initialisation du port B en entrée
TRISd=0xFC;        //initialisation du port C en sortie
ADCON1=0X06;
Lcd_init();
Lcd_Cmd(_LCD_CURSOR_OFF);
while(1){

 if  ((portb & 0x0F)==1)  {x=x0;   size=sizeof(x0);}
if  ((portb & 0x0F)==2)  {x=x1;   size=sizeof(x1);}
 if  ((portb & 0x0F)==3)  {x=x2;   size=sizeof(x2);}
if  ((portb & 0x0F)==4)  {x=x3;   size=sizeof(x3);}
 if  ((portb & 0x0F)==3)  {x=x4;   size=sizeof(x4);}
if  ((portb & 0x0F)==4)  {x=x5;   size=sizeof(x5);}
        if (portb!=j) {j=portb;y=0;  }     // efface l'ecran chaque evenement
                lcd_out(1,1,text_lcd);
                
         for(i=0;i<16;i++)
        {  text_lcd[i]=x[i+y]; }

        delay_ms(200);
     y++;
       if(i+y==size)y=0;

         }
}
السلام عليكم
أخي العزيز الكود الذي زودتك به يعمل بشكل جيد
أنتبه أخي انا في الكود لم أخزن الرساله في رام وانما في روم ارجو مراجعه الكود مره أخرى
ولاتهتم لاختصار الكود لان بتأكيد سترى مشاكل
فالنسبه لاحتساب حجم رساله نعم يحب أحتساب حجم كل نص والا ستظهر لك مشكله stack over وهذه تظهر لما يحصل تجاوز في قيم محدده مثلا مصفوفه 10 عناصر وخليت حلقه تكرار لهذه مصفوفه مثلا 13 مره يعني قلت مثلا (++for(x=0;x<13;x هنا مصفوفه 10 عناصر وعندما يصل الى عنصر 11 سيحدث مشكله في رام ربما تغير من قيم متغيرات لانها سيتم خزن أجباري وبتالي مايكرو سيدخل في مشكله عويصه مع رام

لاتتعامل مطلقا مع رام في حاله لديك نصوص ثابته دائما خزنها في روم والكود الذي زودك به يوضح ذلك
تحياتي


karamouse
:: مهندس ::
تاريخ التسجيل: Sep 2014
المشاركات: 1
نشاط [ karamouse ]
قوة السمعة:
قديم 28-09-2014, 08:59 AM المشاركة 14   
افتراضي


this problem

solve
lcd_out(1,1,x);

no
lcd_out(1,15,x);



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 05:39 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)