هذا هو البرنامج التعليمي السادس لدينا في سلسلة دروس PIC الخاصة بنا ، في هذا البرنامج التعليمي نتعلم التواصل بين شاشة LCD مقاس 16 × 2 مع متحكم PIC. في دروسنا السابقة تعلمنا أساسيات الموافقة المسبقة عن علم باستخدام بعض برامج وميض LED وتعلمنا أيضًا كيفية استخدام المؤقتات في متحكم PIC. يمكنك هنا التحقق من جميع البرامج التعليمية حول Learning PIC Microcontrollers باستخدام برنامج التحويل البرمجي MPLABX و XC8.
سيكون هذا البرنامج التعليمي مثيرًا للاهتمام لأننا سنتعلم كيفية الواجهة 16 × 2 LCD مع PIC16F877A ، تحقق من الفيديو التفصيلي في نهاية هذا البرنامج التعليمي. لقد ولت الأيام الخوالي حيث استخدمنا مصابيح LED لإشارات المستخدم. دعونا نرى كيف يمكننا جعل مشاريعنا تبدو أكثر روعة وفائدة باستخدام شاشات LCD. تحقق أيضًا من مقالاتنا السابقة حول Interfacing LCD with 8051 ، مع Arduino ، مع Raspberry Pi ، مع AVR.
وظائف لربط شاشات الكريستال السائل مع متحكم PIC:
لتسهيل الأمور ، قمنا بإنشاء مكتبة صغيرة يمكن أن تجعل الأمور سهلة أثناء استخدام شاشة LCD هذه مع PIC16F877A. يوجد هنا ملف الرأس "MyLCD.h" للتنزيل ، والذي يحتوي على جميع الوظائف الضرورية لتشغيل شاشة LCD باستخدام PIC MCU. يتم شرح رمز المكتبة جيدًا من خلال سطور التعليقات ، ولكن إذا كنت لا تزال لديك شكوك ، فقم بالوصول إلينا من خلال قسم التعليقات. تحقق أيضًا من هذه المقالة لمعرفة عمل LCD الأساسي و Pinouts.
ملاحظة: يوصى دائمًا بمعرفة ما يحدث بالفعل داخل ملف الرأس الخاص بك لأنه سيساعدك في تصحيح الأخطاء أو أثناء تغيير MCU.
الآن ، هناك طريقتان لإضافة هذا الرمز إلى برنامجك. يمكنك إما نسخ جميع أسطر التعليمات البرمجية أعلاه في MyLCD.h ولصقها قبل void main (). أو يمكنك تنزيل ملف الرأس باستخدام الرابط وإضافته إلى ملف الرأس الخاص بمشروعك ( #include "MyLCD.h " ؛ ). يمكن القيام بذلك عن طريق النقر بزر الماوس الأيمن على ملف الرأس واختيار إضافة عنصر موجود والتصفح إلى ملف الرأس هذا.
هنا قمت بنسخ ولصق رمز ملف الرأس في ملف C الرئيسي. لذلك إذا كنت تستخدم الكود الخاص بنا ، فلن تحتاج إلى تنزيل ملف الرأس وإضافته إلى برنامجك ، ما عليك سوى استخدام الكود الكامل الوارد في نهاية هذا البرنامج التعليمي. لاحظ أيضًا أن هذه المكتبة ستدعم فقط PIC16F series PIC Microcontroller.
أنا هنا أشرح كل وظيفة داخل ملف الرأس أدناه:
void Lcd_Start (): يجب أن تكون هذه الوظيفة هي الوظيفة الأولى التي يجب استدعاؤها لبدء العمل مع شاشة LCD الخاصة بنا. يجب علينا استدعاء هذه الوظيفة مرة واحدة فقط لتجنب التأخر في البرنامج.
باطل Lcd_Start () {Lcd_SetBit (0x00) ؛ لـ (int i = 1065244 ؛ i <= 0 ؛ i--) NOP () ؛ Lcd_Cmd (0x03) ؛ __delay_ms (5) ؛ Lcd_Cmd (0x03) ؛ __delay_ms (11) ؛ Lcd_Cmd (0x03) ؛ Lcd_Cmd (0x02) ؛ // 02H يُستخدم للعودة إلى المنزل -> يمسح ذاكرة الوصول العشوائي ويهيئ شاشة LCD Lcd_Cmd (0x02) ؛ // 02H يُستخدم للعودة إلى المنزل -> يمسح ذاكرة الوصول العشوائي ويهيئ شاشة LCD Lcd_Cmd (0x08) ؛ // حدد الصف 1 Lcd_Cmd (0x00) ؛ // مسح الصف 1 عرض Lcd_Cmd (0x0C) ؛ // حدد الصف 2 Lcd_Cmd (0x00) ؛ // مسح الصف 2 عرض Lcd_Cmd (0x06) ؛ }
Lcd_Clear (): تعمل هذه الوظيفة على مسح شاشة LCD ويمكن استخدامها داخل حلقات لمسح مظهر البيانات السابقة.
Lcd_Clear () {Lcd_Cmd (0) ، // مسح شاشة LCD Lcd_Cmd (1) ؛ // حرك المؤشر إلى الموضع الأول}
Void Lcd_Set_Cursor (x pos، y pos): بمجرد البدء ، تصبح شاشة LCD الخاصة بنا جاهزة لأخذ الأوامر ، ويمكننا توجيه شاشة LCD لتعيين مؤشرها في الموقع المفضل لديك باستخدام هذه الوظيفة. لنفترض أننا نحتاج إلى المؤشر عند الحرف الخامس من الصف الأول. ثم ستكون الوظيفة باطلة Lcd_Set_Cursor (1 ، 5)
باطل Lcd_Set_Cursor (char a، char b) {char temp، z، y؛ إذا (أ == 1) {درجة الحرارة = 0x80 + ب - 1 ؛ // 80H يستخدم لتحريك المؤشر z = temp >> 4 ؛ // أقل 8 بت y = temp & 0x0F ؛ // أعلى 8 بت Lcd_Cmd (ض) ؛ // Set Row Lcd_Cmd (y) ؛ // تعيين العمود} وإلا إذا (أ == 2) {temp = 0xC0 + b - 1 ؛ ض = درجة الحرارة >> 4 ؛ // أقل 8 بت y = temp & 0x0F ؛ // أعلى 8 بت Lcd_Cmd (ض) ؛ // Set Row Lcd_Cmd (y) ؛ // تعيين العمود}}
void Lcd_Print_Char (char data): بمجرد ضبط المؤشر ، يمكننا كتابة حرف في موضعه عن طريق استدعاء هذه الوظيفة ببساطة.
باطل Lcd_Print_Char (بيانات char) // أرسل 8 بت من خلال وضع 4 بت {char Lower_Nibble، Upper_Nibble؛ Lower_Nibble = البيانات & 0x0F ؛ Upper_Nibble = البيانات & 0xF0 ؛ RS = 1 ؛ // => RS = 1 Lcd_SetBit (Upper_Nibble >> 4) ؛ // أرسل النصف العلوي بالتحول بمقدار 4 EN = 1 ؛ لـ (int i = 2130483 ؛ i <= 0 ؛ i--) NOP () ؛ EN = 0 ؛ Lcd_SetBit (Lower_Nibble) ، // أرسل النصف السفلي EN = 1 ؛ لـ (int i = 2130483 ؛ i <= 0 ؛ i--) NOP () ؛ EN = 0 ؛ }
Void Lcd_Print_String (char * a): إذا كان سيتم عرض مجموعة من الأحرف ، فيمكن استخدام وظيفة السلسلة.
باطل Lcd_Print_String (char * a) {int i؛ لـ (i = 0 ؛ a! = '\ 0' ؛ i ++) Lcd_Print_Char (a) ؛ // انقسام السلسلة باستخدام المؤشرات واستدعاء وظيفة Char}
في كل مرة يتم فيها استدعاء Lcd_Print_Char (بيانات char) ، يتم إرسال قيم الأحرف الخاصة بها إلى خطوط البيانات الخاصة بشاشة LCD. تصل هذه الأحرف إلى HD44780U في شكل بتات. الآن هذا IC يربط البتات بالحرف الذي سيتم عرضه باستخدام ذاكرة ROM الخاصة به كما هو موضح في الجدول أدناه. يمكنك العثور على وحدات بت لجميع الأحرف في ورقة بيانات وحدة تحكم HD44780U LCD.
الآن ، نظرًا لأننا راضون عن ملف الرأس الخاص بنا ، فلنقم ببناء الدائرة واختبار البرنامج. تحقق أيضًا من ملف الرأس الكامل الوارد في الرابط الوارد أعلاه.
مخطط الدائرة والاختبار:
يوجد أدناه مخطط الدائرة لواجهة LCD مقاس 16 × 2 مع متحكم PIC.
لم أقم بإظهار مصدر الطاقة أو اتصال ICSP في الدائرة أعلاه ، نظرًا لأننا نستخدم نفس اللوحة التي استخدمناها في البرنامج التعليمي السابق ، تحقق هنا.
أحد الأشياء المهمة التي يجب ملاحظتها في البرنامج هو التعريفات المثبتة لشاشة LCD:
#define RS RD2 #define EN RD3 #define D4 RD4 #define D5 RD5 #define D6 RD6 #define D7 RD7
يمكن تغيير تعريفات الدبوس هذه وفقًا لإعداد أجهزة المبرمجين. تذكر تغيير تكوين المنفذ المحترم في الوظيفة الرئيسية إذا قمت بالتغيير هنا.
الأجهزة الخاصة بهذا المشروع بسيطة للغاية. سنقوم بإعادة استخدام نفس وحدة الموافقة المسبقة عن علم التي استخدمناها في المرة السابقة وسنقوم بتوصيل وحدة LCD بالموافقة المسبقة عن علم الخاصة بنا باستخدام أسلاك التوصيل.
يمكن فهم الاتصال من خلال الجدول التالي:
رقم دبوس LCD |
اسم دبوس LCD |
MCU Pin Name |
MCU رقم التعريف الشخصي |
1 |
أرض |
أرض |
12 |
2 |
VCC |
+ 5 فولت |
11 |
3 |
VEE |
أرض |
12 |
4 |
تسجيل حدد |
RD2 |
21 |
5 |
قراءة و كتابة |
أرض |
12 |
6 |
ممكن |
RD3 |
22 |
7 |
بت البيانات 0 |
NC |
- |
8 |
بت البيانات 1 |
NC |
- |
9 |
بت البيانات 2 |
NC |
- |
10 |
بت البيانات 3 |
NC |
- |
11 |
بت البيانات 4 |
RD4 |
27 |
12 |
بت البيانات 5 |
RD5 |
28 |
13 |
بت البيانات 6 |
RD6 |
29 |
14 |
بت البيانات 7 |
RD7 |
30 |
15 |
LED إيجابي |
+ 5 فولت |
11 |
16 |
سلبي LED |
أرض |
12 |
الآن ، دعنا نقوم ببساطة بإجراء الاتصالات ، وتفريغ الكود إلى MCU الخاص بنا والتحقق من المخرجات.
إذا كان لديك أي مشكلة أو شك ، يرجى استخدام قسم التعليقات. تحقق أيضًا من عرض الفيديو أدناه.