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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 04:04 PM المشاركة 9   
افتراضي



ملفات البرنامج والمحاكاة على الرابط :

http://www.mediafire.com/download/el...-74595-lcd.rar

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 09:35 PM المشاركة 10   
افتراضي


شرح الدوال المعرفة بمعرفة المستخدم :
الدالة الأولى : دالة التأخير :


كود:
void Delay_50ms(){
 Delay_ms(50);
}

هذه الدالة اختيارية ويمكن استخدام دالة التأخير المدمجة فى الميكروسى Delay_ms(50); ، لكن هذه الدالة يتكرر استدعاؤها العديد من المرات (السطور) ، ولذلك يفضل أن يتم استخدام دالة معرفة بمعرفة المستخدم بحيث ، عند اللزوم، عند الرغبة فى تغيير زمن التأخير ، يتم التغيير فى سطر واحد فقط فى نموذج الدالة وينعكس ذلك بالطبع عند كل استدعاء لهذه الدالة .

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 10:17 PM المشاركة 11   
افتراضي


الدالة الثانية : دالة نبل 4-bit وسوف تستخدم فى الدوال التى تليها (لهذا السبب يجب أن نبدأ بها ، حتى لا يعطيك المترجم أخطاء ) : دالة إرسال بايت أمر 8-bit ودالة إرسال حرف 8-bit على شكل 2 نبل ، بالإضافة إلى دالة تهيئة موديول LCD . راجع التعليفات بجوار كل سطر .


كود:
void Write_Nibble(unsigned short N){
 Enable_Pin = 0; // Disable 
 // ****** Write RS *********
 Serial_Clk_Pin = 0;
 Serial_Data_Pin = RS;  // For command RS =0 , for character RS=1 , as you see later 
 Serial_Clk_Pin = 1; // Shift RS
 Serial_Clk_Pin = 0;
 // ****** End RS Write

 // Shift in 4 bits
 Mask = 8; // 0b00001000
  for (t=0; t<4; t++){ // Get and shift lower 4-bit  , one bit each loop
   Flag = N & Mask; //get
   if(Flag==0) Serial_Data_Pin = 0;
   else Serial_Data_Pin = 1;
   Serial_Clk_Pin = 1;//shift
   Serial_Clk_Pin = 0;
   Mask = Mask >> 1;//0b000000100
  }
  // One more clock because SC and ST clks are tied  
  Serial_Clk_Pin = 1;
  Serial_Clk_Pin = 0;//Now , data at shift register outputs Q0 to Q4
  Serial_Data_Pin = 0; //
  Enable_Pin = 1; // Enable to send data to LCD module 
  Delay_us(500); //Some delay for enable pulse  
  Enable_Pin = 0;
}


محمد القادري
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2011
المشاركات: 101
نشاط [ محمد القادري ]
قوة السمعة:
قديم 13-05-2016, 10:26 PM المشاركة 12   
افتراضي


بارك الله فيك مهندس وفي علمك

هل يمكن استخدام البرنامج السابق مباشرة على المترجم CCS C COMPILER ؟


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 10:30 PM المشاركة 13   
افتراضي


الدالة الثالثة : دالة إرسال أمر command مكون من بايت 8-bit على شكل 2 نبل 4-bit .
• فى البداية يتم وضع RS=0 حتى يعلم موديول LCD بأن البيانات القادمة هى بيانات أمر .
• بعد ذلك يتم استخلاص النبل السفلى Low_Nibble والنبل العلوى High_Nibble باستخدام عمليات رياضية بسيطة .
• بعد ذلك يتم إرسال النبل العلوى يليه إرسال النبل السفلى .
• ثم اختبار ما إذا كان الأمر من ضمن أوامر موديول LCD ، عندئذ نستخدم دالة التأخير حتى يستقر الوضع .


كود:
void Serial_LCD_Cmd(unsigned char Command)
{
      RS = 0; // It is command, not data
      Low_Nibble = Command & 15; // AS : Low_Nibble = Command & 0x0F;  
High_Nibble = Command/16; // AS : High_Nibble = Command>>4;  Write_Nibble(High_Nibble);
      Write_Nibble(Low_Nibble);
      if((Command == 0x0C) || (Command == 0x01) || (Command == 0x0E) || (Command == 0x0F) || (Command == 0x10)
                   || (Command == 0x1E) || (Command == 0x18) || (Command == 0x08) || (Command == 0x14)
                   || (Command == 0x02))
      Delay_50ms();
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 10:47 PM المشاركة 14   
افتراضي


الدالة الرابعة : دالة إرسال بيانات حرف LCDChar عند موقع صف row وعامود col محددين :
• فى البداية نستخدم عبارة الاختيار من متعدد switch…case لاختيار واحد من أربعة خيارات ، كل خيار يعطى موديول LCD الأمر المناسب تبعا للصف والعامود المذكورين كبارامترات عند استدعاء هذه الدالة (راجع معلومات موديول LCD) زذلك بغرض وضع المؤشر عند موقع الصف والعامود المحددين .
• بعد ذلك ، يتم إرسال بيانات الحرف : فى البداية يجب وضع RS=1 لأننا سوف نرسل حرف وليس أمر ، وبعد ذلك يتم استخلاص بيانات النبل السفلى والعلوى من بيانات الحرف ، ثم إرسالها إلى LCD عبر مسجل الإزاحة .



كود:
void Serial_LCD_Chr(unsigned int row, unsigned int col, char LCDChar)
{
        switch(row){

                case 1:
                Serial_LCD_Cmd(0x80 + col-1);
                break;
                case 2:
                Serial_LCD_Cmd(0xC0 + col-1);
                break;
                case 3:
                Serial_LCD_Cmd(0x94 + col-1);
                break;
                case 4:
                Serial_LCD_Cmd(0xD4 + col-1);
                break;
        }

 RS = 1; // It is Data, not command
Low_Nibble = LCDChar & 15;//Low_Nibble = LCDChar & 0x0F; //
High_Nibble = LCDChar/16;//High_Nibble = LCDChar>>4;
Write_Nibble(High_Nibble);
 Write_Nibble(Low_Nibble);

}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 10:54 PM المشاركة 15   
افتراضي


الدالة الخامسة :دالة تهيئة موديول LCD
تستخدم هذه الدالة لنقل موديول LCD من الحالة الافتراضية بنظام 8-bit إلى الحالة المطلوب العمل بها وهى نظام 4-bit .
خطوات التهيئة محددة تماما ومذكورة فى الداتا شيت للموديول ، وتتم بإرسال الأوامر المناسبة وبالترتيب المحدد كما هو مذكور بالتعليقات الجانبية .


كود:
void Serial_LCD_Init(){
        Delay_50ms();
        Serial_LCD_Cmd(0x03); // Wake-Up Sequence
        Delay_50ms();
        Serial_LCD_Cmd(0x03);
        Delay_50ms();
        Serial_LCD_Cmd(0x03);
        Delay_50ms();
        Serial_LCD_Cmd(0x02);
        Delay_50ms();
        Serial_LCD_Cmd(0x28); // 4-bits, 2 lines, 5x7 font
        Delay_50ms();
        Serial_LCD_Cmd(0x06); // Entry mode- Auto-increment, No Display shifting
        Delay_50ms();
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 13-05-2016, 11:03 PM المشاركة 16   
افتراضي


الدالة السادسة : دالة إرسال سلسلة نصية عند صف وعامود محددين :
كل ما هنالك هو إرسال حرف تلو الآخر مستخدما الدوال السابقة .
فى البداية نستخدم دالة الميكروسى strlen لإيجاد عدد الأحرف السلسلة ثم نقوم بعمل حلقة for لتكرار إرسال الحرف تلو الآخر .


كود:
void Serial_LCD_Out(unsigned int row, unsigned int col, unsigned char str[20])
{       q = strlen(str);
        for (p = 0; p<q; p++){
            Serial_LCD_Chr(row,col++,str[p]);   // print first character on LCD
        }
        row = 1;
        col = 1;
}



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