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

أدوات الموضوع

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 14-03-2016, 11:28 AM المشاركة 1   
افتراضي دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO Twitter FaceBook Google+



دليل برمجة وحدة العرض LCD باستخدام المترجم mikroC PRO

أولا : مكتبة وحدة العرض 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!");
• كما ذكرنا ، تستخدم الدالة Lcd_Out لطباعة "نص" text إبتداء من موقع محدد . يمكن طباعة كل من المتغيرات أو الثوابت المحددة كنص text .
• هذه الدالة تقوم بتمرير ثلاثة بارامترات دخل حيث يتم تحديد موقع السطر(الصف) (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
الغرض :
إرسال أمر لوحدة العرض






احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 14-03-2016, 01:03 PM المشاركة 2   
افتراضي


ثانيا : التدريب على استخدام المكتبة :




هذا التدريب يستعرض استخدام دوال (روتينات) مكتبة 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
• انتهى التعريف بتوصيلات موديول LCD

الخطوة الثانية : الإعلان عن المتغيرات :
النص عبارة عن حروف مرصوصة فى شكل صف لذلك يتم إعلانها بمصفوفة صف وهو يشبه الإعلان عن المتغير مع إضافة القوسين [ ] بعد الاسم النوع هنا حروف 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();
    }
  }
}

احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً gheas, عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب gheas, عبدالله حجازى ( أعجبته المشاركة )
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية gheas
gheas
:: مهندس متواجد ::
تاريخ التسجيل: May 2005
الدولة: https://t.me/pump_upp
المشاركات: 128
نشاط [ gheas ]
قوة السمعة:0
قديم 14-03-2016, 05:03 PM المشاركة 3   
افتراضي


بارك الله فيك

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً F.Abdelaziz ( شكر العضو على هذه المشاركة )

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 14-03-2016, 06:02 PM المشاركة 4   
افتراضي


تدريب على استخدام كل من دالة التحويل من تناظرى لرقمى ودوال وحدة العرض LCD :

التدريب الشامل على استخدام وحدات العرض 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 ثم تأخير زمنى وتكرار الحلقة إلى مالانهاية .

النتيجة :



احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً عبدالله حجازى ( شكر العضو على هذه المشاركة )
اعجاب عبدالله حجازى ( أعجبته المشاركة )

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


إجراء تعديل بسيط لقياس درجة الحرارة باستخدام الحساس 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);
    }
}

النتائج :



merzouk_rdz
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2014
الدولة: Algeria
المشاركات: 56
نشاط [ merzouk_rdz ]
قوة السمعة:0
قديم 16-03-2016, 11:28 PM المشاركة 6   
افتراضي شكرا


شكرا لك لهذا العمل الرائع.

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2024