دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: الميكروكونترولر PIC والبرجة بلغة السى والمترجم مسكروسى برو :: الميكروكونترولر PIC والبرمجة بلغة السى والمترجم ميكروسى برو
صفحة 1 من اصل 1
دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO
دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO
أولا : مكتبة وحدة العرض LCD
يوفر المترجم mikroC PRO مكتبة للاتصال بوحدات العرض LCD (التى تستخدم الميكروكونترولر هيتاشى HD44780 ) من خلال الربط بأربعة بتات 4-bit interface .
تعليق :
• ترك لك المترجم حرية اختيار أطراف منافذ توصيل وحدة العرض ( حسب الرغبة وفقا للدائرة الكهربية المستخدمة ) بشرط أن تخبره أولا عن هذه الأطراف (ستة أطراف منافذ PORT) وعن البتات التى تتحكم فى اتجاهها (ستة بتات تحكم TRIS ) .
• الشكل التالى يبين مثال لتوصيل وحدة العرض LCD .
مثال لإعدادات توصيلات وحدة العرض LCD مع الميكروكونترولر :
التعريف بأطراف التوصيل بين وحدة LCD وبين الميكروكونترولر يتم باستخدام الكلمة المحجوزة sbit وتعنى تعريف بت بسجل وظائف خاصة : يليها اسم البت وليكن LCD_RS ثم الإشارة البت المستخدمة بالكلمة المحجوزة at ويذكر بعدها البت من سجل الوظائف الخاصة وهى هنا سجل المنفذ PORTB البت RB0_bit وهكذا لباقى الأطراف .
الدوال الأساسية لمكتبة LCD المتاحة بالمترجم ميكروسى برو :
• الدالة Lcd_Init
• الدالة Lcd_Out
• الدالة Lcd_Out_Cp
• الدالة Lcd_Chr
• الدالة Lcd_Chr_Cp
• الدالة Lcd_Cmd
1- دالة تهيئة وحدة العرض LCD : Lcd_Init()
تقوم هذه الدالة بتهيئة (إعداد) أجهزة وحدة LCD لبدء العمل . وهى ليس لها عائد ويجب تعريف توصيل الوحدة LCD قبل استخدام هذه الدالة . يجب إطلاق هذه الدالة قبل أن يتم استخدام أى دالة من دوال وحدة العرض LCD .
مثال :
2- الدالة Lcd_Out
الغرض :
طباعة نص text على LCD بدءا من موضع محدد . يمكن أن تنتقل كل من متغيرات السلاسل النصية والثوابت بوصفها نصا .
صيغة استخدام الدالة :
مثال :
• كما ذكرنا ، تستخدم الدالة Lcd_Out لطباعة "نص" text إبتداء من موقع محدد . يمكن طباعة كل من المتغيرات أو الثوابت المحددة كنص text .
• هذه الدالة تقوم بتمرير ثلاثة بارامترات دخل حيث يتم تحديد موقع السطر(الصف) (1) والعامود (3) و يجب تحديد النص بين قوسين مزدوجين "Hello!" . أو إعلانه قبل الدالة وتخصيص قيمة له علما بأنه من نوع الحرف char كما يلى :
Char text[]="Hello !";
مثال لبرنامج يوضح الفكرة :
3- الدالة Lcd_Out_Cp :
الغرض :
طباعة (نص) text عند الموقع (المكان) الحالى للمؤشر . يمكن طباعة كل من المتغيرات أو الثوابت المحددة كنص text . بارامتر الدخل هو النص text فقط وهو من نوع char .
صيغة الدالة :
نموذج استخدام الدالة :
مثال :
كما فى المثال السابق
هذه الدالة تقوم بتمرير بارامترواحد هو النص المراد طباعته يتم تحديد موقع الكتابة بالموقع الحالى للمؤشر ويجب تحديد النص بين قوسين مزدوجين " " . المؤشر يبدأ من عند الصف الأول والعامود الأول .
4- الدالة Lcd_Chr
الغرض :
طباعة "حرف" character عند موقع (مكان) محدد . يتم تمرير كل من المتغيرات والثوابت المحددة كحرف character . هذه الدالة لها ثلاثة بارامترات كمداخل : رقم صف وعامود الموقع علاوة على الحرف المطلوب كتابته .
الصيغة العامة :
مثال :
مثال : كتابة الحرف 'i' (لاحظ القوسين المفردين فى حالة الحرف) بالسطر الثانى والعامود الثالث .
5- الدالة Lcd_Chr_Cp
الغرض :
طباعة "حرف" character فى المكان الحالى للمؤشر . يمكن تمرير كل من المتغيرات والثوابت المحددة "كحرف" character .
الصيغة العامة :
مثال : طباعة "الحرف" character "e" فى مكان المؤشر الحالى :
6- الدالة Lcd_Cmd
الغرض :
إرسال أمر لوحدة العرض
أولا : مكتبة وحدة العرض LCD
يوفر المترجم mikroC PRO مكتبة للاتصال بوحدات العرض LCD (التى تستخدم الميكروكونترولر هيتاشى HD44780 ) من خلال الربط بأربعة بتات 4-bit interface .
تعليق :
• ترك لك المترجم حرية اختيار أطراف منافذ توصيل وحدة العرض ( حسب الرغبة وفقا للدائرة الكهربية المستخدمة ) بشرط أن تخبره أولا عن هذه الأطراف (ستة أطراف منافذ PORT) وعن البتات التى تتحكم فى اتجاهها (ستة بتات تحكم TRIS ) .
• الشكل التالى يبين مثال لتوصيل وحدة العرض LCD .
مثال لإعدادات توصيلات وحدة العرض LCD مع الميكروكونترولر :
التعريف بأطراف التوصيل بين وحدة LCD وبين الميكروكونترولر يتم باستخدام الكلمة المحجوزة sbit وتعنى تعريف بت بسجل وظائف خاصة : يليها اسم البت وليكن LCD_RS ثم الإشارة البت المستخدمة بالكلمة المحجوزة at ويذكر بعدها البت من سجل الوظائف الخاصة وهى هنا سجل المنفذ PORTB البت RB0_bit وهكذا لباقى الأطراف .
- الكود:
// Define LCD module connections.
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB4_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB4_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D7_Direction at TRISB7_bit;
// End LCD module connection definition
الدوال الأساسية لمكتبة LCD المتاحة بالمترجم ميكروسى برو :
• الدالة Lcd_Init
• الدالة Lcd_Out
• الدالة Lcd_Out_Cp
• الدالة Lcd_Chr
• الدالة Lcd_Chr_Cp
• الدالة Lcd_Cmd
1- دالة تهيئة وحدة العرض LCD : Lcd_Init()
تقوم هذه الدالة بتهيئة (إعداد) أجهزة وحدة LCD لبدء العمل . وهى ليس لها عائد ويجب تعريف توصيل الوحدة LCD قبل استخدام هذه الدالة . يجب إطلاق هذه الدالة قبل أن يتم استخدام أى دالة من دوال وحدة العرض LCD .
مثال :
- الكود:
// Lcd pinout settings
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D7 at RB3_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D4 at RB0_bit;
// Pin direction
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D7_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB0_bit;
...
void main(){
………
Lcd_Init();
………
2- الدالة Lcd_Out
الغرض :
طباعة نص text على LCD بدءا من موضع محدد . يمكن أن تنتقل كل من متغيرات السلاسل النصية والثوابت بوصفها نصا .
صيغة استخدام الدالة :
- الكود:
Lcd_Out(char row, char column, char *text);
مثال :
- الكود:
// Write text "Hello!" on Lcd starting from row 1, column 3:
Lcd_Out(1, 3, "Hello!");
• هذه الدالة تقوم بتمرير ثلاثة بارامترات دخل حيث يتم تحديد موقع السطر(الصف) (1) والعامود (3) و يجب تحديد النص بين قوسين مزدوجين "Hello!" . أو إعلانه قبل الدالة وتخصيص قيمة له علما بأنه من نوع الحرف char كما يلى :
Char text[]="Hello !";
مثال لبرنامج يوضح الفكرة :
- الكود:
// LCD module connections
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;
// End LCD module connections
char txt [] = " Hello !";
void main(){
Lcd_Init(); // Initialize LCD
Lcd_Out(1,3,txt); // Write text in first row
while(1) // Endless loop
{
}
}
3- الدالة Lcd_Out_Cp :
الغرض :
طباعة (نص) text عند الموقع (المكان) الحالى للمؤشر . يمكن طباعة كل من المتغيرات أو الثوابت المحددة كنص text . بارامتر الدخل هو النص text فقط وهو من نوع char .
صيغة الدالة :
- الكود:
Lcd_Out_Cp(char *text);
نموذج استخدام الدالة :
- الكود:
// Write text "Here!" at current cursor position:
Lcd_Out_Cp("Here!");
مثال :
كما فى المثال السابق
- الكود:
void main(){
Lcd_Init(); // Initialize LCD
Lcd_Out_Cp("Here!"); // Write text in first row
while(1) // Endless loop
{
}
}
هذه الدالة تقوم بتمرير بارامترواحد هو النص المراد طباعته يتم تحديد موقع الكتابة بالموقع الحالى للمؤشر ويجب تحديد النص بين قوسين مزدوجين " " . المؤشر يبدأ من عند الصف الأول والعامود الأول .
4- الدالة Lcd_Chr
الغرض :
طباعة "حرف" character عند موقع (مكان) محدد . يتم تمرير كل من المتغيرات والثوابت المحددة كحرف character . هذه الدالة لها ثلاثة بارامترات كمداخل : رقم صف وعامود الموقع علاوة على الحرف المطلوب كتابته .
الصيغة العامة :
- الكود:
Lcd_Chr(char row, char column, char out_char);
مثال :
مثال : كتابة الحرف 'i' (لاحظ القوسين المفردين فى حالة الحرف) بالسطر الثانى والعامود الثالث .
- الكود:
// Write character "i" at row 2, column 3:
Lcd_Chr(2, 3, 'i');
5- الدالة Lcd_Chr_Cp
الغرض :
طباعة "حرف" character فى المكان الحالى للمؤشر . يمكن تمرير كل من المتغيرات والثوابت المحددة "كحرف" character .
الصيغة العامة :
- الكود:
Lcd_Chr_Cp(char out_char); Lcd_Chr_Cp(char out_char);
مثال : طباعة "الحرف" character "e" فى مكان المؤشر الحالى :
- الكود:
// Write character "e" at current cursor position:
Lcd_Chr_Cp('e'); // note>>>'e'
6- الدالة Lcd_Cmd
الغرض :
إرسال أمر لوحدة العرض
رد: دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO
ثانيا : التدريب على استخدام المكتبة :
هذا التدريب يستعرض استخدام دوال (روتينات) مكتبة LCD .
الخطوة الأولى : التعريف بتوصيلات موديول LCD وتشمل :
• خط اختيار السجل RS (أوامر أو بيانات ) متصل بالطرف RB4 .
• خط التمكين E متصل بالطرف RB5 .
• خطوط البيانات من D4 إلى D7 متصلة بالأطراف من RB0 إلى RB3
أيضا يجب التعريف ببتات التحكم فى الاتجاة وتشمل :
• خانة التحكم فى خط اختيار السجل RS هى TRISB4_bit والمقابلة للطرف RB4 .
• خانة التحكم فى خط التمكين E هى TRISB5_bit والمقابلة للطرف RB5 .
• كذلك بالنسبة لخطوط البيانات من D4 إلى D7 .
• انتهى التعريف بتوصيلات موديول LCD
الخطوة الثانية : الإعلان عن المتغيرات :
النص عبارة عن حروف مرصوصة فى شكل صف لذلك يتم إعلانها بمصفوفة صف وهو يشبه الإعلان عن المتغير مع إضافة القوسين [ ] بعد الاسم النوع هنا حروف char . ويتم تخصيص نص بكتابتة بعد علامة = بين قوسين تنصيص " …."
• الإعلان عن المتغير i لحلقة التكرار for وهو من نوع char (بسعة بايت أى 8 خانات ) .
الخطوة الثالثة : إنشاء دالة خاصة بتأخير تحريك النص وذلك للتحكم فى سرعة حركة النص بتغيير زمن التأخير باستخدام دالة التأخير القياسية Delay_ms بغرض سهولة التغيير فى الدالة فقط بدلا .
الخطوة الرابعة : الدالة الرئيسية :
1- لا توجد قنوات دخل تناظرى مستخدمة ، لذلك يتم تهيئة سجلات التحكم بحيث حتى تصبح جميع الأطراف كمداخل / مخارج رقمية فقط :
2- تهيئة وحدة العرض LCD لبدء العمل بها
• نبدأ بتهيئة وحدة العرض LCD بالدالة
• ثم نقوم بمسح الشاشة بالدالة وبالأمر الخاص بذلك :
• مع فصل المؤشر حتى لا يظهر أثناء العرض فيسبب ارتباك بالدالة وبالأمر الخاص بذلك.
3- كتابة سطرين على الشاشة كافتتاحية :
• نستخدم الدالة Lcd_Out فى كتابة نص بالصف الأول : يبدأ بالصف الأول والعامود السادس (حتى يتوسط النص شاشة العرض) والنص هو النص الثالث أى "Lcd4bit" .
• ونكتب نص بالصف الثانى : يبدأ من الصف الثانى والعامود السادس (ليكون تحت بداية الصف الأول ) والنص هو النص الرابع أى "example"
• الانتظار أو البقاء على هذه الحالة (عرض سطرى المقدمة) لمدة 2 ثانية بما يسمح بالتعرف على النصوص وقراءتها .
4- كتابة السطرين الأساسيين على الشاشة :
• نبدأ بمسح الشاشة من جديد للتجهير للعرض القادم بالدالة وبالأمر الخاص بذلك :
• نستخدم الدالة Lcd_Out فى كتابة نص بالصف الأول : يبدأ بالصف الأول والعامود الأول (النص يملأ شاشة العرض ) ، النص هو "Eng.F. Abdelaziz" .
• وكتابة نص بالصف الثانى يبدأ من الصف الثانى والعامود الخامس ، النص هو "EasyPIC6".
• الانتظار أو البقاء على هذه الحالة (عرض سطرى المقدمة) لمدة 2 ثانية بما يسمح بالتعرف على النصوص وقراءتها .
5- تحريك النص : لليمين أربع مرات باستخدام حلقة for والدالة والأمر الخاص بذلك :
6- تحريك النص جهة اليسار سبع مرات وجهة اليمين سبع مرات أخرى والتكرار إلى ما لانهاية :
• بعد الخروج من حلقة for يتم إنشاء حلقة غير منتهية وفيها يتم تحريك النص جهة اليسار لسبع مرات باستخدام حلقة for والدالة والأمر الخاص بذلك :
• ثم يتم تحريك النص لسبع مرات أخرى جهة اليمين باستخدام حلقة for والدالة والأمر الخاص بذلك :
البرنامج :
هذا التدريب يستعرض استخدام دوال (روتينات) مكتبة LCD .
الخطوة الأولى : التعريف بتوصيلات موديول LCD وتشمل :
• خط اختيار السجل RS (أوامر أو بيانات ) متصل بالطرف RB4 .
• خط التمكين E متصل بالطرف RB5 .
• خطوط البيانات من D4 إلى D7 متصلة بالأطراف من RB0 إلى RB3
- الكود:
// LCD module connections
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;
أيضا يجب التعريف ببتات التحكم فى الاتجاة وتشمل :
• خانة التحكم فى خط اختيار السجل RS هى TRISB4_bit والمقابلة للطرف RB4 .
• خانة التحكم فى خط التمكين E هى TRISB5_bit والمقابلة للطرف RB5 .
• كذلك بالنسبة لخطوط البيانات من D4 إلى D7 .
- الكود:
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;
// End LCD module connections
الخطوة الثانية : الإعلان عن المتغيرات :
النص عبارة عن حروف مرصوصة فى شكل صف لذلك يتم إعلانها بمصفوفة صف وهو يشبه الإعلان عن المتغير مع إضافة القوسين [ ] بعد الاسم النوع هنا حروف char . ويتم تخصيص نص بكتابتة بعد علامة = بين قوسين تنصيص " …."
- الكود:
char txt1[] = "Eng.F. Abdelaziz" ;
char txt2[] = "EasyPIC6";
char txt3[] = "Lcd4bit";
char txt4[] = "example";
• الإعلان عن المتغير i لحلقة التكرار for وهو من نوع char (بسعة بايت أى 8 خانات ) .
- الكود:
char i; // Loop variable
الخطوة الثالثة : إنشاء دالة خاصة بتأخير تحريك النص وذلك للتحكم فى سرعة حركة النص بتغيير زمن التأخير باستخدام دالة التأخير القياسية Delay_ms بغرض سهولة التغيير فى الدالة فقط بدلا .
- الكود:
void Move_Delay() { // Function used for text moving
Delay_ms(500); // You can change the moving speed here
}
الخطوة الرابعة : الدالة الرئيسية :
- الكود:
void main(){
1- لا توجد قنوات دخل تناظرى مستخدمة ، لذلك يتم تهيئة سجلات التحكم بحيث حتى تصبح جميع الأطراف كمداخل / مخارج رقمية فقط :
- الكود:
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
2- تهيئة وحدة العرض LCD لبدء العمل بها
• نبدأ بتهيئة وحدة العرض LCD بالدالة
- الكود:
Lcd_Init(); // Initialize LCD
• ثم نقوم بمسح الشاشة بالدالة وبالأمر الخاص بذلك :
- الكود:
Lcd_Cmd(_LCD_CLEAR); // Clear display
• مع فصل المؤشر حتى لا يظهر أثناء العرض فيسبب ارتباك بالدالة وبالأمر الخاص بذلك.
- الكود:
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
3- كتابة سطرين على الشاشة كافتتاحية :
• نستخدم الدالة Lcd_Out فى كتابة نص بالصف الأول : يبدأ بالصف الأول والعامود السادس (حتى يتوسط النص شاشة العرض) والنص هو النص الثالث أى "Lcd4bit" .
- الكود:
Lcd_Out(1,6,txt3); // Write text in first row
• ونكتب نص بالصف الثانى : يبدأ من الصف الثانى والعامود السادس (ليكون تحت بداية الصف الأول ) والنص هو النص الرابع أى "example"
- الكود:
Lcd_Out(2,6,txt4); // Write text in second row
• الانتظار أو البقاء على هذه الحالة (عرض سطرى المقدمة) لمدة 2 ثانية بما يسمح بالتعرف على النصوص وقراءتها .
- الكود:
Delay_ms(2000);
4- كتابة السطرين الأساسيين على الشاشة :
• نبدأ بمسح الشاشة من جديد للتجهير للعرض القادم بالدالة وبالأمر الخاص بذلك :
- الكود:
Lcd_Cmd(_LCD_CLEAR); // Clear display
• نستخدم الدالة Lcd_Out فى كتابة نص بالصف الأول : يبدأ بالصف الأول والعامود الأول (النص يملأ شاشة العرض ) ، النص هو "Eng.F. Abdelaziz" .
• وكتابة نص بالصف الثانى يبدأ من الصف الثانى والعامود الخامس ، النص هو "EasyPIC6".
- الكود:
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(2,5,txt2); // Write text in second row
• الانتظار أو البقاء على هذه الحالة (عرض سطرى المقدمة) لمدة 2 ثانية بما يسمح بالتعرف على النصوص وقراءتها .
- الكود:
Delay_ms(2000);
5- تحريك النص : لليمين أربع مرات باستخدام حلقة for والدالة والأمر الخاص بذلك :
- الكود:
// Moving text
for(i=0; i<4; i++) { // Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
6- تحريك النص جهة اليسار سبع مرات وجهة اليمين سبع مرات أخرى والتكرار إلى ما لانهاية :
• بعد الخروج من حلقة for يتم إنشاء حلقة غير منتهية وفيها يتم تحريك النص جهة اليسار لسبع مرات باستخدام حلقة for والدالة والأمر الخاص بذلك :
- الكود:
while(1) { // Endless loop
for(i=0; i<8; i++) { // Move text to the left 7 times
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();
}
• ثم يتم تحريك النص لسبع مرات أخرى جهة اليمين باستخدام حلقة for والدالة والأمر الخاص بذلك :
- الكود:
for(i=0; i<8; i++) { // Move text to the right 7 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
}
}
البرنامج :
- الكود:
/*
* Project name:
Lcd_Test (Demonstration of the LCD library routines)
* Description:
This code demonstrates how to use LCD 4-bit library. LCD is first
initialized, then some text is written, then the text is moved.
* Test configuration:
MCU: PIC16F887
Oscillator: HS, 08.0000 MHz
SW: mikroC PRO for PIC
http://www.mikroe.com/eng/products/view/7/mikroc-pro-for-pic/
*/
// LCD module connections
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;
// End LCD module connections
char txt1[] = "Eng.F. Abdelaziz" ;
char txt2[] = "EasyPIC6";
char txt3[] = "Lcd4bit";
char txt4[] = "example";
char i; // Loop variable
void Move_Delay() { // Function used for text moving
Delay_ms(500); // You can change the moving speed here
}
void main(){
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
Lcd_Out(1,6,txt3); // Write text in first row
Lcd_Out(2,6,txt4); // Write text in second row
Delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Out(1,1,txt1); // Write text in first row
Lcd_Out(2,5,txt2); // Write text in second row
Delay_ms(2000);
// Moving text
for(i=0; i<4; i++) { // Move text to the right 4 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
while(1) { // Endless loop
for(i=0; i<8; i++) { // Move text to the left 7 times
Lcd_Cmd(_LCD_SHIFT_LEFT);
Move_Delay();
}
for(i=0; i<8; i++) { // Move text to the right 7 times
Lcd_Cmd(_LCD_SHIFT_RIGHT);
Move_Delay();
}
}
}
رد: دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO
تدريب على استخدام كل من دالة التحويل من تناظرى لرقمى ودوال وحدة العرض LCD :
التدريب الشامل على استخدام وحدات العرض LCD فى قياس الجهد أودرجة الحرارة أو أى كمية فيزيائية أخرى
هذا التدريب يوضح استخدام المحول من تناظرى لرقمى ADC ووحدة العرض LCD .
توجد عدة تقنيات لكتابة هذا البرنامج وسوف اتبع التقنية الأوسع انتشارا .
دوال المكتبات تسهل هذا البرنامج وهو ما يعني أن الجهود المبذولة لإنشاء برمجيات تؤتي ثمارها في النهاية.
الغرض :
• فى البداية يتم عرض رسالة إفتتاحية مكونة من سطرين ( يمكنك تغييرهما ) .
• بعد ثانيتين تتغير الرسالة الافتتاحية المعروضة فى السطر الثانى ليتم عرض الجهد الموجود على مدخل المحول A/D بالطرف RA2 بعد معالجة نتيجة التحويل ليكون العرض بالشكل المطلوب .
• فى الأجهزة الفعلية يمكن عرض درجة الحرارة الحالية أو أى قيمة فيزيائية أخرى بدلا من الجهد .
البرنامج :
عناصر البرنامج :
1- المقدمة .
2- التعريف بتوصيلات وحدة العرض LCD .
3- الإعلان عن المتغيرات :
• المتغير unsigned char ch ( 1 بايت – المدى 0 - 255) .
• المتغير unsigned int adc_rd (2 بايت – المدى 0 - 65535 )
• المتغير char *text مؤشر إلى النص المطلوب كتابته وهو من نوع char .
• المتغير tlong ((signed) long (int) 4 بايت)
4- الدالة الرئيسية :
أ- إعداد المنافذ .
إعداد القناة الثانية AN2 بالطرف RA2 كمدخل تناظرى وباقى الأطراف كمداخل / مخارج رقمية .
ب- تهيئة وحدة العرض LCD
5- التهيئة بالدالة Lcd_Init( ) ; وعدم إظهار المؤشر بالأمر Lcd_Cmd(_LCD_CURSOR_OFF) ; ومسح الشاشة بالأمر Lcd_Cmd(_LCD_CURSOR_OFF) ; .
ت- كتابة الافتتاحية :
السطر الأول ENG.F.ABD ELAZIZ والسطر الثانى LCD example حيث يتم إسناد نص للمتغير text الذى تم الإشارة إلية text = "ENG.F.ABD ELAZIZ" ; واستخدام الدالة Lcd_Out(1,1,text) ; ) فى إرساله إلى وحدة العرض وتحديد بدايته بالصف الأول والعامود الأول .
بينما النص text = "LCD example" ; فيتم تحديد بدايته بالصف الثانى والعامود الأول .
ونستخدم دالة التأخير Delay_ms(2000) ; ) فى الانتظار المدة الكافية للعرض قبل الانتقال للعرض القادم وهى هنا 2 ثانية .
ث- بداية العرض الثانى والدائم :
سوف نترك السطر الأول كما هو (بالطبع يمكن تغييره) ونغير فى الصف الثانى بحيث يظهر على الصور voltage:2.497V . وهو مكون من عدة أجزاء وسوف يتم معالجة جزء جزء .
الجزء الأول هو كلمة (النص) voltage: " " ويتم كتابتة بالطريقة المعتادة حيث يعرف أولا بالصيغة text = "voltage:" ; لحين كتابته بالدالة Lcd_Out .
ج- إنشاء حلقة غير منتهية while (1) {….} تحتوى على :
قراءة الجهد التناظرى من على دخل القناة التناظرية الثانية وتحويله إلى قيمة رقمية ذو عشر خانات ونسخها إلى المتغير adc_rd بالدالة adc_rd = ADC_Read(2); .
كتابة النص "voltage:" من بدايةالصف الثانى والعاكود الأول بالدالة Lcd_Out(2,1,text) ;
د- تحويل نتيجة التحول وهى عدد يقع بين 0 و 1023 إلى قيمة إخرى تمثل جهد يقع بين 0 و 5000mV . بمعنى أن نفس العدد الداخلى 1023 يجب إظهاره خارجيا على الشاشة فى شكل العدد 5000 فإذا ضرب العدد 1023 فى 5000 وقسمنا النتيجة على 1023 لكانت النتيجة 5000 فقط أى تم تحويل المدى من 0 إلى 1023 لكى يظهر على صورة مدى من 0 إلى 5000 وهو ما يعرف بموائمة التدريج scale ، وهذا ما يحدث مع أى عدد يمثل النتيجة التناظرية الحالية adc_rd حيث يجب ضربه فى 5000 ثم قسمة الناتج على 1023 وحفظ الناتج فى المتغير tlong مع ملاحظة الآتى :
i. أن الضرب أولا ثم القسمة .
ii. وعند ضرب محتويات المتغير adc_rd فى 5000 سوف تخرج عن المدى المعلن عنه فى البداية وهو unsigned int adc_rd (2 بايت – المدى 0 - 65535 ) لذلك يجب توسعته بكتابة (long) قبله حتى تكون سعته 4 بايت .
أصبح لدينا قيمة مكونة من أربع أرقام تبدأ بالعدد صفر 0000 وتنتهى بالعدد 5000 أى تتكون من اليسار من : رقم للآلاف - ورقم للمئات – ورقم للعشرات – ورقم للآحاد .
6- للحصول على رقم الآلاف نقسم النتيجة على 1000 والعدد الصحيح هو الرقم المطلوب ويحفظ فى المتغير ch والكسر لن يظهر ولن يؤثر لأن النتيجة المطلوبة هى صحيح خارج القسمة وهى خاصية عملية القسمة باستخدام المؤثر " / " .
بالطبع هذا الرقم يقع بين 0 و 9 وكى يظهر فى هذا الشكل على وحدة العرض LCD يجب تحويله من خريطة أسكى أو باختصار يضاف إليه العدد 48 ليكون 48+ch . من ثم نكتب هذا الرقم باستخدام دالة كتابة "حرف" Lcd_chr فى الصف الثانى والعمود التاسع ( يلى الثمانى أحرف voltage: مباشرة )
نكتب العلامة العشرية كحرف فى الموقع الحالى للمؤشر أى بعد رقم الآلاف بالدالة Lcd_Chr_CP :
الحصول على رقم المئات : بقسمة محتويات المتغير tiong ( بالملى فولت) أولا على 100 لايجاد آخر رقمين من على اليسار ثم نوجد باقى قسمة الناتج على الرقم 10 بالموثر "% " فينتج الرقم الموجود فى خانة المئات فيتم حفظه بالمتغير ch أى ch = (tlong / 100) % 10 ;. ثم كتابته (بعد تحويله بإضافة العدد 48) فى مكان المؤشر الحالى أى بعد العلامة العشرية بالدالة Lcd_Chr_CP(48+ch) ; .
نكرر ذلك لرقم العشرات ، ولرقم الآحاد .
وأخيرا كتابة حرف V ثم تأخير زمنى وتكرار الحلقة إلى مالانهاية .
النتيجة :
التدريب الشامل على استخدام وحدات العرض LCD فى قياس الجهد أودرجة الحرارة أو أى كمية فيزيائية أخرى
هذا التدريب يوضح استخدام المحول من تناظرى لرقمى ADC ووحدة العرض LCD .
توجد عدة تقنيات لكتابة هذا البرنامج وسوف اتبع التقنية الأوسع انتشارا .
دوال المكتبات تسهل هذا البرنامج وهو ما يعني أن الجهود المبذولة لإنشاء برمجيات تؤتي ثمارها في النهاية.
الغرض :
• فى البداية يتم عرض رسالة إفتتاحية مكونة من سطرين ( يمكنك تغييرهما ) .
• بعد ثانيتين تتغير الرسالة الافتتاحية المعروضة فى السطر الثانى ليتم عرض الجهد الموجود على مدخل المحول A/D بالطرف RA2 بعد معالجة نتيجة التحويل ليكون العرض بالشكل المطلوب .
• فى الأجهزة الفعلية يمكن عرض درجة الحرارة الحالية أو أى قيمة فيزيائية أخرى بدلا من الجهد .
البرنامج :
- الكود:
/*Header******************************************************/
// LCD module connections
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;
// End LCD module connections
unsigned char ch; //
unsigned int adc_rd; // Declare variables
char *text; //
long tlong; //
void main() {
ANSEL = 0x04; // Pin RA2 is configured as an analog input
ANSELH = 0; // Rest of pins are configured as digital
TRISA = 0x04;
Lcd_Init(); // LCD display initialization
Lcd_Cmd(_LCD_CURSOR_OFF); // LCD command (cursor off)
Lcd_Cmd(_LCD_CLEAR); // LCD command (clear LCD)
text = "ENG.F.ABD ELAZIZ "; // Define the first message
Lcd_Out(1,1,text); // Write the first message in the first line
text = "LCD example"; // Define the second message
Lcd_Out(2,1,text); // Define the first message
Delay_ms(2000);
text = "voltage:"; // Define the third message
while (1) {
adc_rd = ADC_Read(2); // A/D conversion. Pin RA2 is an input.
Lcd_Out(2,1,text); // Write result in the second line
tlong = (long)adc_rd * 5000; // Convert the result in millivolts
tlong = tlong / 1023; // 0..1023 -> 0-5000mV
ch = tlong / 1000; // Extract volts (thousands of millivolts)
// from result
Lcd_Chr(2,9,48+ch); // Write result in ASCII format
Lcd_Chr_CP('.');
ch = (tlong / 100) % 10; // Extract hundreds of millivolts
Lcd_Chr_CP(48+ch); // Write result in ASCII format
ch = (tlong / 10) % 10; // Extract tens of millivolts
Lcd_Chr_CP(48+ch); // Write result in ASCII format
ch = tlong % 10; // Extract digits for millivolts
Lcd_Chr_CP(48+ch); // Write result in ASCII format
Lcd_Chr_CP('V');
Delay_ms(1);
}
}
عناصر البرنامج :
1- المقدمة .
2- التعريف بتوصيلات وحدة العرض LCD .
3- الإعلان عن المتغيرات :
• المتغير unsigned char ch ( 1 بايت – المدى 0 - 255) .
• المتغير unsigned int adc_rd (2 بايت – المدى 0 - 65535 )
• المتغير char *text مؤشر إلى النص المطلوب كتابته وهو من نوع char .
• المتغير tlong ((signed) long (int) 4 بايت)
4- الدالة الرئيسية :
أ- إعداد المنافذ .
إعداد القناة الثانية AN2 بالطرف RA2 كمدخل تناظرى وباقى الأطراف كمداخل / مخارج رقمية .
ب- تهيئة وحدة العرض LCD
5- التهيئة بالدالة Lcd_Init( ) ; وعدم إظهار المؤشر بالأمر Lcd_Cmd(_LCD_CURSOR_OFF) ; ومسح الشاشة بالأمر Lcd_Cmd(_LCD_CURSOR_OFF) ; .
ت- كتابة الافتتاحية :
السطر الأول ENG.F.ABD ELAZIZ والسطر الثانى LCD example حيث يتم إسناد نص للمتغير text الذى تم الإشارة إلية text = "ENG.F.ABD ELAZIZ" ; واستخدام الدالة Lcd_Out(1,1,text) ; ) فى إرساله إلى وحدة العرض وتحديد بدايته بالصف الأول والعامود الأول .
بينما النص text = "LCD example" ; فيتم تحديد بدايته بالصف الثانى والعامود الأول .
ونستخدم دالة التأخير Delay_ms(2000) ; ) فى الانتظار المدة الكافية للعرض قبل الانتقال للعرض القادم وهى هنا 2 ثانية .
ث- بداية العرض الثانى والدائم :
سوف نترك السطر الأول كما هو (بالطبع يمكن تغييره) ونغير فى الصف الثانى بحيث يظهر على الصور voltage:2.497V . وهو مكون من عدة أجزاء وسوف يتم معالجة جزء جزء .
الجزء الأول هو كلمة (النص) voltage: " " ويتم كتابتة بالطريقة المعتادة حيث يعرف أولا بالصيغة text = "voltage:" ; لحين كتابته بالدالة Lcd_Out .
ج- إنشاء حلقة غير منتهية while (1) {….} تحتوى على :
قراءة الجهد التناظرى من على دخل القناة التناظرية الثانية وتحويله إلى قيمة رقمية ذو عشر خانات ونسخها إلى المتغير adc_rd بالدالة adc_rd = ADC_Read(2); .
كتابة النص "voltage:" من بدايةالصف الثانى والعاكود الأول بالدالة Lcd_Out(2,1,text) ;
د- تحويل نتيجة التحول وهى عدد يقع بين 0 و 1023 إلى قيمة إخرى تمثل جهد يقع بين 0 و 5000mV . بمعنى أن نفس العدد الداخلى 1023 يجب إظهاره خارجيا على الشاشة فى شكل العدد 5000 فإذا ضرب العدد 1023 فى 5000 وقسمنا النتيجة على 1023 لكانت النتيجة 5000 فقط أى تم تحويل المدى من 0 إلى 1023 لكى يظهر على صورة مدى من 0 إلى 5000 وهو ما يعرف بموائمة التدريج scale ، وهذا ما يحدث مع أى عدد يمثل النتيجة التناظرية الحالية adc_rd حيث يجب ضربه فى 5000 ثم قسمة الناتج على 1023 وحفظ الناتج فى المتغير tlong مع ملاحظة الآتى :
i. أن الضرب أولا ثم القسمة .
ii. وعند ضرب محتويات المتغير adc_rd فى 5000 سوف تخرج عن المدى المعلن عنه فى البداية وهو unsigned int adc_rd (2 بايت – المدى 0 - 65535 ) لذلك يجب توسعته بكتابة (long) قبله حتى تكون سعته 4 بايت .
أصبح لدينا قيمة مكونة من أربع أرقام تبدأ بالعدد صفر 0000 وتنتهى بالعدد 5000 أى تتكون من اليسار من : رقم للآلاف - ورقم للمئات – ورقم للعشرات – ورقم للآحاد .
6- للحصول على رقم الآلاف نقسم النتيجة على 1000 والعدد الصحيح هو الرقم المطلوب ويحفظ فى المتغير ch والكسر لن يظهر ولن يؤثر لأن النتيجة المطلوبة هى صحيح خارج القسمة وهى خاصية عملية القسمة باستخدام المؤثر " / " .
بالطبع هذا الرقم يقع بين 0 و 9 وكى يظهر فى هذا الشكل على وحدة العرض LCD يجب تحويله من خريطة أسكى أو باختصار يضاف إليه العدد 48 ليكون 48+ch . من ثم نكتب هذا الرقم باستخدام دالة كتابة "حرف" Lcd_chr فى الصف الثانى والعمود التاسع ( يلى الثمانى أحرف voltage: مباشرة )
نكتب العلامة العشرية كحرف فى الموقع الحالى للمؤشر أى بعد رقم الآلاف بالدالة Lcd_Chr_CP :
الحصول على رقم المئات : بقسمة محتويات المتغير tiong ( بالملى فولت) أولا على 100 لايجاد آخر رقمين من على اليسار ثم نوجد باقى قسمة الناتج على الرقم 10 بالموثر "% " فينتج الرقم الموجود فى خانة المئات فيتم حفظه بالمتغير ch أى ch = (tlong / 100) % 10 ;. ثم كتابته (بعد تحويله بإضافة العدد 48) فى مكان المؤشر الحالى أى بعد العلامة العشرية بالدالة Lcd_Chr_CP(48+ch) ; .
نكرر ذلك لرقم العشرات ، ولرقم الآحاد .
وأخيرا كتابة حرف V ثم تأخير زمنى وتكرار الحلقة إلى مالانهاية .
النتيجة :
رد: دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO
إجراء تعديل بسيط لقياس درجة الحرارة باستخدام الحساس LM35 :
النتائج :
- الكود:
/*Header******************************************************/
// LCD module connections
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;
// End LCD module connections
unsigned char ch; //
unsigned int adc_rd; // Declare variables
char *text; //
long tlong; //
void main() {
ANSEL = 0x04; // Pin RA2 is configured as an analog input
ANSELH = 0; // Rest of pins are configured as digital
TRISA = 0x04;
Lcd_Init(); // LCD display initialization
Lcd_Cmd(_LCD_CURSOR_OFF); // LCD command (cursor off)
Lcd_Cmd(_LCD_CLEAR); // LCD command (clear LCD)
text = "BOILER TEMP. "; // Define the first message
Lcd_Out(1,1,text); // Write the first message in the first line
text = "LCD example"; // Define the second message
Lcd_Out(2,1,text); // Define the first message
Delay_ms(2000);
text = "TEMPER.:"; // Define the third message
while (1) {
adc_rd = ADC_Read(2); // A/D conversion. Pin RA2 is an input.
Lcd_Out(2,1,text); // Write result in the second line
tlong = (long)adc_rd * 5000; // To Convert the result in mv * 5000/1025
tlong = tlong / 1024; //
tlong = tlong / 10; // To change from mv to C
ch = tlong / 100; // Extract hundreds of TEMP
// from result
Lcd_Chr(2,9,48+ch); // Write result in ASCII format
ch = (tlong / 10) % 10; // Extract tens of TEMP
Lcd_Chr_CP(48+ch); // Write result in ASCII format
ch = tlong % 10; // Extract digits for TEMP
Lcd_Chr_CP(48+ch); // Write result in ASCII format
Lcd_Chr_CP('C');
Delay_ms(1);
}
}
النتائج :
مواضيع مماثلة
» تدريب : برنامج بسيط لعداد تصاعدى تنازلى باستخدام وحدة العرض LCD :
» تدريب : برنامج إنشاء ساعة بسيطة قابلة للإعداد (الضبط) باستخدام وحدة العرض LCD :
» فكرة إنشاء ثرموستات باستخدام المقاومة السالبة NTC والمحول ADC ووحدة العرض LCD مع المترجم CCS C
» فكرة إنشاء ثرموستات باستخدام المقاومة السالبة NTC والمحول ADC ووحدة العرض LCD مع المترجم CCS C
» دليل ربط شاشة LCD نوع 2X16 بالميكروكونترولر PIC16F877A مع استخدام المترجم CCS C :
» تدريب : برنامج إنشاء ساعة بسيطة قابلة للإعداد (الضبط) باستخدام وحدة العرض LCD :
» فكرة إنشاء ثرموستات باستخدام المقاومة السالبة NTC والمحول ADC ووحدة العرض LCD مع المترجم CCS C
» فكرة إنشاء ثرموستات باستخدام المقاومة السالبة NTC والمحول ADC ووحدة العرض LCD مع المترجم CCS C
» دليل ربط شاشة LCD نوع 2X16 بالميكروكونترولر PIC16F877A مع استخدام المترجم CCS C :
منتديات الهندسة الكهربية والإلكترونية والميكاترونكس والكومبيوتر :: الميكروكونترولر PIC والبرجة بلغة السى والمترجم مسكروسى برو :: الميكروكونترولر PIC والبرمجة بلغة السى والمترجم ميكروسى برو
صفحة 1 من اصل 1
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى