التجربة الرابعه :- توصيل شاشة LCD

وحدات العرض LCD التى تعتمد على المتحكم HD4480 منتشرة لرخص سعرها ولأنها يمكنها عرض الحروف . علاوة على أنها من السهل ربطها مع الميكروكونترولر علاوة على أن معظم المترجمات تتضمن مكتبات لروتينات تخصها .
سوف نعرض ربط  هذه الوحدة مع الميكروكونترولر PIC16F88يحتاج الربط إلى 6 خطوط مداخل مخارج من الميكروكونترولر هى : 4 خطوط للبيانات و2 خط للتحكم .

المعلومات النظرية المطلوبة ( Required Theory)
نظره علي الشاشه LCD
وحدات العرض LCD التى تعتمد على المتحكم HD44780 يتم توصيلها من خلال 14 طرف (رجل) : 8 أطراف (أرجل) للبيانات وتسمى  data pins (D0-D7) , و 3 أطراف للتحكم وتسمى control pins (RS, E, R/W) و3 أطراف للقدرة وتسمى (Vdd, Vss, Vee) .

بعض وحدات العرض LCD تمتلك خاصية الإضاءة الخلفية backlight والتى تساعد على قراءة البيانات المعروضة على الشاشة فى حالة الإضاءة المحيطة المنخفضة . لذلك فقد يمتلك  2 طرف توصيل إضافى تسمى (LED+ and LED-) أى إجمالى أطرافها يكون 16 طرف كما فى الشكل التالى :


أطراف التحكم Control pins
طرف التحكم RS
يحدد ما إذا كانت البيانات المنقولة بين وحدة LCD والميكروكونترولر الخارجى "بيانات حرف فعلى " أو " أمر أو حالة" .عندما يحتاج الميكروكونترولر إلى إرسال أمر إلى وحدة LCD أو قراءة حالة وحدة LCD يجب أن يسحب حالته للحالة المنخفضة pulled low . وبالمثل يسحب حالته للحالة المرتفعة pulled high إذا أراد إرسال بيانات حرف من وإلى وحدة LCD .
الطرف R/W
إتجاه إنتقال البيانات يتم التحكم فيه عن طريق الطرف R/W . إذا تم سحب هذا الطرف للحالة المنخفضة فإن الأوامر أو بيانات الحرف تكتب (ترسل) إلى وحدة LCD . وعندما يتم سحب هذا الطرف للحالة المرتفعة فإن بيانات الحرف أو معلومات الحالة يتم قراءتها (تستقبل) من سجلات وحدة العرض LCD .سوف نستخدم طريق واحد لانتقال البيانات أى من الميكروكونترولر إلى وحدة LCD لذلك فإن الطرف R/W سوف يتم توصيله بالأرضى بصفة دائمة .
طرف التمكين (E)
بقوم بالتمكين لتهيئة بدء انتقال البيانات . عند الكتابة إلى وحدة العرض LCD فإن البيانات سوف يتم نقلها فقط عند إنتقال (تحول) حالة الطرف E من الحالة المرتفعة إلى الحالة المنخفضة .

أطراف القدرة Power supply pins
على الرغم من أن معظم الداتا شيت الخاصة بوحدات LCD تنصح باستخدام +5V d.c. كجهد للتشغيل إلا أن بعض وحدات LCD يمكن أن تعمل بشكل سليم فى مدة أوسع (3.0 to 5.5 V) . يجب توصيل الطرف Vdd بالجهد الموجب لمصدر القدرة وتوصيل الطرف Vss بالأرضى . الطرف 3 ويسمى Vee يستخدم لضبط (التحكم) تباين contrast الشاشة . فى معظم الحالات يتم توصيل هذا الطرف لجهد يتراوح بين 0V و 2V باستخدام مقاومة متغيرة .

أطراف البيانات Data pins
الأطراف من 7 إلى 14 هى خطوط البيانات وتسمى (D0-D7) . انتقال البيانات إلى ومن وحدة العرض يمكن أن يتم (يتحقق) إما بنظام 8-bit أو بنظام 4-bit .فى نظام 8-bit يتم استخدام كل الثمانى خطوط للبيانات لنقل بايت بينما فى نظام 4-bit يتم نقل البايت على جزئين كل جزء مكون من 4 خانات 4-bit ويسمى "نبل"nibble . فى نظام 4-bit يتم استخدام أربعة خطوط البيانات العلوية فقط (D4-D7) . هذه التقنية توفر 4 أطراف مداخل  مخارج من أطراف الميكروكونترولر . وسوف نستخدمها .

نظره علي مكتبه الاوامر للشاشهLCD  داخل الميكرو سي
اوامر الكتابة على هذا النوع من الشاشات عبارة عن 6 دوال فقط اى 6 اوامر
Lcd_Init();
هذا الامر عبارة عن داله التعريف اى الامر الذى يخبر البك بان هناك شاشة سوف تركب علية وان هناك بروتوكول يجب اتباعه مع هذه الشاشة فى العمل وهناك تابع لهذا الامر وهو تعريف الارجل التى سوف توصل بالشاشة لاخراج البيانات من خلالها وهذا يعطيك الحرية فى اختيار هذه الاطراف كما تريد سوف نتحدث عن هذا التابع فيما بعد
Lcd_Out
هذا الامر يخرج البيانات على الشاشة بمكان انت تحددة يعنى لو عايز تخرج كلمة او عدد فى مكان محدد مثلا الصف الثانى وبداية اظهار هذه الكلمة تكون فى المربع الخامس هذا الامر هو ما يفعل ذلك لك ولكن هذا الامر لاخراج الكلمات مرة واحدة واخراج العدد مرة واحدة اى ليس حرف حرف او رقم رقم لا بل كلمة مرة واحدة ويمكنة ايضا اظهار حرف حرف ولكن الادق له كلمة او عدد وتوضع الكلمة داخل هذا الرمز "هنا تضع الكلمةمهما كان حجم الكلمة ولكن اذا زادت عن عدد مربعات الشاشة فلن يظهر البقية ويمكنك ايضا كتابة كلمة داخل متغير ثم كتابة اسم المتغير داخل هذا الامر وهو سوف يعرض الكلمة التى داخل هذا المتغير مثلا اذا اردنا اظهار كلمة Hello فى الصف الاول والعمود السابع تكون هكذا

وهنا حرف السيكون فى المربع السابع اى بداية الكلمة اما الحرف e فسيكون فى المربع الثامن وهكذا بالتتابع
 Lcd_Out_Cp
وهو يخرج كلمة كاملة او عدد كامل وليس حرف حرف ولا رقم رقم ويمكنة اخراج حرف حرف ولكن الادق له اخراح كلمة كاملة او عدد كاملوايضا يخرج الكلمة بين هذا الرمز "هنا تضع الكلمةويمكنك ايضا كتابة كلمة داخل متغير ثم كتابة اسم المتغير داخل هذا الامر وهو سوف يعرض الكلمة التى داخل هذا المتغيراى انه مثل الامر السابق بالضبط اذا ما الفرق بينهم الفرق ان هذا الامر لا يخرج الكلمات او الاعداد حسب المكان الذى تريد لا بل حسب مكان اخر مربع قمت بالكتابة علية ويمكن القول حسب مكان المؤشر اى اذا كنت كتبت كلمة Go على المربع الاول فى الصف الثانى هذا يعنى ان المربع الاول تم كتابة حرف G علية ثم المربع الثانى تم كتابة الحرف O علية اذن المؤشر يقف على المربع الثانى وهو اخر ما تم الكتابة علية اذن قم بكتابة الكلمة Mohamed على الشاشة من خلال هذا الامر الان  
Lcd_Out_Cp("Mohamed");
كما ترى بدون تحديد اي ماكن الصف او المربع اين سوف يبدء اى اين سوف يكون حرف ال M وهو الحرف الاول من الكلمة يكون بعد اخر مربع تم الكتابة علية او بعد المربع الذى يوجد علية المؤشر وهنا هو المربع الثالث اى الشاشة سوف تظهر الكلمات كلها هكذا GoMohamedويمكنك وضح فاصل بالمسطرة بتاعت الكيبورد قبل كلمة Mohamedداخل الرموز "Mohamed " لتظهر فاضل بين الكلمتين كما ترى الفراغ الصغير بجانب الكلمة 
Lcd_Chr
هذا الامر يقوم باظهار حرف واحد فقط او رقم واحد فقط فى مكان تحددة انت واذا كتبت علية اكثر من ذلك فى المرة الواحدة فلن يظهر شى ويجب وضع الحرف او الرقم داخل هذا الرمز ' هنا تضع الحرف او الرقم 'وهو الافضل فى اظهار رقم او حرف واحد فى المرة الواحدة واذا اردنا اظهار الحرف R فى الصف الاول المربع الخامس يكون هكذا 
Lcd_Chr(1, 5, 'R');
فالصف هو الرقم الاول وهو 1 اما المربع فالرقم الثانى وهو 5 ثم الحرف بين هذا الرمز ' '
 Lcd_Chr_Cp
وهو لاظهار رقم او حرف واحد فقط فى كل مرة واذا كتبت علية اكثر من ذلك فى المرة الواحدة فلن يظهر شى ويجب وضع الحرف او الرقم داخل هذا لرمز' ' هنا تضع الحرف او الرقم 'وهو الادق لاظهار حرف او رقم فى المرة الواحدة ولكن انت لا تحدد مكان العرض بل بمكان المؤشر او اخر مربع تم الكتابه علية  واذا اردت كتابة الحرف W على اخر مكان للمؤشريكون هكذا
Lcd_Chr_Cp('W');
تلخيص بسيط 
ثانى وتالت امرهما لاظهار كلمات او اعداد مرة واحدة على الشاشة الثانى يظهر بمكان تحددة انت اما الثالث فيظهر على حسب مكان المؤشراما رابع وخامس امرفيظهر حرف حرف او رقم رقم الامر الرابع يظهر الحرف او الرقم فى مكان تحددة انت اما الخامس فيظهرة على حسب مكان المؤشر 
 Lcd_Cmd
 هذا الامر هو لكتابة اشكال واعطاء اوامر للشاشةبمعنى اذا اردت مسح الشاشة او تحريك المؤشر او تحرك الكلمات على لشاشة  او الى اخر الاوامر وهذا جميل والاجمل انه من خلالة يمكنك كتابة اشكال ورموز كما تريد وهو ما يجعلك تتحكم فى بكسل بكسل زى ما قولت فى الاول وهذه الصورة بها الاوامر التى تستخدم للشاشة
ولكتابة امر مسح الشاشة مثلا  
Lcd_Cmd(_LCD_CLEAR);
ولكتابة امر قفل المؤشر وعدم اظهارة 
Lcd_Cmd(_LCD_CURSOR_OFF);

تعرف الارجل التى سوف يربط عليها ال LCD Character
هذه الاوامر ثابتة وما يتغير فيها هو الارجل التى سوف تربط بها البك بالشاشة هنا ستجد ان كل طرف من الشاشة مكتوب بجوارة اسم الرجل التى سوف يربط معها من الميكرو مثلا 
LCD_RS at RB4_bit
هنا طرف الشاشة وهوLCD_RSسوف يربط مع الطرف RB4اى الطرف رقم 4 فى البورت B فى الميكرو وهكذا واذا اردت مثلا تغير مكان تركيب الاطراف فغير فى الجزء الخاص بالبورت مثلا مكان RB4يكون RA4وهكذا
اما الكود
sbit LCD_RS_Direction at TRISB4_bit;
هذا الامريفعل فعلين ايضا الاول هو جعل الامر TRIS للطرف رقم 4 فى البورت B يسمى بنفس الاسم ل LCD_RS_Direction فعند التحكم لم نعد فى حاجة لكتابة TRISB4فقط نكتب LCD_RS_Directionوالامر الثانى هو جعلها بت اى ديجتال اما 0 واما 1 وهو يستخدم فى جعل الطرف دخل او خرج 


مخطط الدائرة    (Circuit Diagram)
سوف يتم نقل البيانات بين الميكروكونترولر ووحدة LCD فى نظام 4-bit . الطرف (5) R/W لوحدة LCD يوصل بالأرضى بصفة دائمة لعدم وجود قراءة من وحدة LCD . الأطراف RC0-RC3 تستخدم كخطوط للبيانات (D4-D7, pins 11-14) . خطوط التحكم RS و E يتم توصيلها بالأطراف RC5 و RC4 . لذلك فإننا نستخدم 6 أطراف للربط بين الميكروكونترولر ووحدة LCD .يتم عمل التحكم فى التباين عن طريق مقاومة متغيرة  5Kكما هو مبين بالدائرة . إذا كانت وحدة LCD تمتلك ليد إضاءة خلفية يتم استخدام مقاومة 220Ω على التوالى مع الطرف 15 أو الطرف 16 لتحديد التيار المار خلال دايود الإضاءة الخلفية .


البرنامج (Software)
 sbit LCD_RS at Rb4_bit;
 sbit LCD_EN at Rb5_bit;
 sbit LCD_D4 at Rb0_bit;
 sbit LCD_D5 at Rb1_bit;
 sbit LCD_D6 at Rb2_bit;
 sbit LCD_D7 at Rb3_bit;
 sbit LCD_RS_Direction at TRISb4_bit;
 sbit LCD_EN_Direction at TRISb5_bit;
 sbit LCD_D4_Direction at TRISb0_bit;
 sbit LCD_D5_Direction at TRISb1_bit;
 sbit LCD_D6_Direction at TRISb2_bit;
 sbit LCD_D7_Direction at TRISb3_bit;
 char txt[4];
 char y,YY,x,e=0;
 char message1[] = "Welcome to";
 char message2[] = "Embedded-Lab";
 char message3[] = "moha162003";
 char message4[] = "electronic Circuit";
 void main() {
  ANSEL = 0b00000000;  TRISb = 0b00000000;  TRISA = 0b00000000;
  Lcd_Init();
  do {
   Lcd_Cmd(_LCD_CLEAR);
   Lcd_Cmd(_LCD_CURSOR_OFF);
   Lcd_Out(1,4,message1);
   Lcd_Out(2,1,message2);
   Delay_ms(1000);
   Lcd_Cmd(_LCD_CLEAR);
   Delay_ms(1000);
//////////////////////////////////////////////////////////////////////////////
x=1;
for(y=0;y<10;y++){
Lcd_Chr(1,x,message1[y]);   
delay_ms(200); x++; }
//////////////////////////////////////////////////////////////////////////////
 x=1;
for(y=0;y<13;y++){
Lcd_Chr(2,x,message2[y]);   
delay_ms(200); x++; }
///////////////////////////////////////////////////////////////////////////////
Lcd_Cmd(_LCD_CLEAR);
delay_ms(250);
for(y=0;y<99;y++){
ByteToStr(Y,txt);
Lcd_Out(2,1,txt);
delay_ms(100);}
//////////////////////////////SHIFT_RIGHT///////////////////////////////////
Lcd_Out(1, 13, message3);
for(y=0;y<40;y++){delay_ms(200);Lcd_Cmd(_LCD_SHIFT_RIGHT);}  
Lcd_Cmd(_LCD_CLEAR);
//////////////////////////SHIFT_left////////////////////////////////
Lcd_Out(2, 16, message4);
for(y=0;y<40;y++){delay_ms(200);Lcd_Cmd(_LCD_SHIFT_left);}  
Lcd_Cmd(_LCD_CLEAR); 
} while(1); }



شرح البرنامج
خطوط البيانات والتحكم لوحدةLCD تستخدم المنفذPORTb لذلك يجب تعريف أطرافه كمخارج (TRISb=0) يجب عدم تفعيل وظائف المقارن (CMCON=7) لتجعل الأطراف مداخل / مخارج رقمية .برمجة وحدةLCD التى تعتمد على المتحكم HD44780 لها خطوات معقدة بعض الشىء لأنها تتطلب توقيت دقيق وتسلسل مناسب لمختلف إشارات التحكم والأوامر .لكن لحسن الحظ فإن المترجم MikroC Pro for PIC يمتلك فى بنيانه الداخلى مكتبة روتينات للاتصال مع وحدة العرض LCD القياسية التى تعتمد على المتحكم HD44780 باستخدام نظام 4-bit . هذه المكتبة تجعل البرمجة سهلة للغاية .فبل استخدام الدوال الداخلية لوحدة LCD يجب تعريف أطراف التوصيل بين وحدة LCD والميكروكونترولر بالاوامر التاليه قبل بدء البرنامج  كما هو موضح بصندوق البرنامج
v    شرح اوامر البرنامج كما يلي
كتابه الرساله الاولي حرف حرف

نقوم بعمل حلقه تكراريه عدد حلقاتها تساوي عدد احرف الرساله حيث ان الرساله الاولي تتكون من عشر احرف مع ملاحظه اننا نحسب الفراغ بحرف وفي البدايه جعلنا المتغير Xيساوي واحدحبث اننا سوف نبدأ الرساله من الخانه الاولي  وبعد كل حلقه من حلقات الحلقه التكراريه يزيد المتغير Xبمقدار واحد  وهذا يجعل طبع الحرف الثاني يكون في الخانه الثانيه فمثلا في اول حلقه يتم طباعه اول حرف في الرساله  حيث Y يساوي صفر  ويتم طباعته في اول خانه حيث  Xيساوي واحد اما في الحلقه الثانيه يتم طباعه الحرف الثاني في الرساله حيث Yيساوي واحد  في الخانه الثانيه حيث المتغير  Xيساوي اثنين وهكذا يتم طباعه حرف تلو الاخر في الخانات بالتتابع علي حسب تتابع المتغير X مع جعل فتره زمنيه بين كل حلقه ولاخري حتي يتهئ للعين ان تلاحظ ان الرساله تكتب حرف حرف
                                     كتابه الرساله الثانيه حرف حرف
نفس الفكره السابقه ولكن غيرنا فقط عدد حلقات الحلقه التكراريه  الان هذه الرساله اثني عشر حرف
اظهار تعداد رقمي علي الشاشه
في البدايه يتم مسح الشاشه  ثم ننتظر 250 ملي ثانيه ثم يدخل البرنامج حلقه تكراريه مكونه من 99 حلقه حيث يتم عمل تعداد من صفر الي 99 وفي هذه الحلقه امر مهم جدا وهو      ByteToStr(Y,txt);    هذا الامر يقوم بتحويل قيم الاعداد العادية الى اسكى كود حتى يتوافق مع بروتوكول الشاشة ويتم عرض الارقام او الاحرف يمكن ان يقول احدكم ما المشكلة قم باضافة 48 الى اى رقم وسيتم تحويلة الى اسكى كود نعم هذا صحيح ولكن هذا ينطبق على رقم واحد فقط فاذا كان العدد مكون من رقمين مثل 25 لا تنفع هذه الطريقة وللتحويل اى عدد وليس مجرد رقم واحد الى اسكى كود هناك اكثر من طريقة ولكن اسهلها هو ما قدمته الميكروسى نفسها وهو هذا الامر

وهو يقوم بالتحويل من ارقام عادية الى اسكى كود ولكن فى حدود خانتين فقط اى لا يزيد الرقم عن 99 ولتحويل رقم اكبر هناك اوامر اخرى مشابه مثل  IntToStr وهذا الامر يقوم بتحويل الارقام حتى 6 خانات من الارقام وهناك اوامر بقدارات اعلى
وبعد تحويل الرقم الي الاسكي يتم عرضه علي الشاشه فس السطر الثاني بالخانه الاولي من خلال الامر   Lcd_Out(2,1,txt);

الازاحه يمينا
تعتمد هذه الازاحه علي الامر  Lcd_Cmd(_LCD_SHIFT_RIGHT); الذي تم التحدث عنه في البدايه  وتم وضع هذا الامر داخل حلقه بحيث ان كل حلقه يتم الازاحه بمقدار خانه واحده ناحيه اليمين وبعد نهايه الحلقه التكراريه يتم مسح الشاشه بالامر Lcd_Cmd(_LCD_CLEAR);
                                                                                                الازاحه يسارا

تعتمد هذه الازاحه علي الامر  Lcd_Cmd(_LCD_SHIFT_Left); الذي تم التحدث عنه في البدايه  وتم وضع هذا الامر داخل حلقه بحيث ان كل حلقه يتم الازاحه بمقدار خانه واحده ناحيه اليساروبعد نهايه الحلقه التكراريه يتم مسح الشاشه بالامر Lcd_Cmd(_LCD_CLEAR);


أختبار البرنامج علي Proteus


فيديو التجربة

هناك تعليق واحد :

  1. موحبا.. كيف يتم توصيل دارة مسجل صوت مع شاشة ال lcd او أي شاية أخرى

    ردحذف