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

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

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

مُساهمة من طرف Admin في الإثنين مارس 14, 2016 11:24 am

دليل برمجة وحدة العرض 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
الغرض :
إرسال أمر لوحدة العرض






Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

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

مُساهمة من طرف Admin في الإثنين مارس 14, 2016 1:00 pm

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




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

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

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

مُساهمة من طرف Admin في الإثنين مارس 14, 2016 5:58 pm

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

النتيجة :




Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

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

مُساهمة من طرف Admin في الإثنين مارس 14, 2016 11:45 pm

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

النتائج :


Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة

- مواضيع مماثلة

 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى