ما هو الميكروكونترولر Microcontroller ؟

صفحة 3 من اصل 3 الصفحة السابقة  1, 2, 3

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الثلاثاء يونيو 13, 2017 1:26 pm

السفن سجمنت نوع الكاثود المشترك ومفسر الشفرة 7448 والميكروكونترولر PIC16F628 وعداد تصاعدى تنازلى من 00 إلى 99 :
الغرض :
إنشاء عداد تصاعدى / تنازلى من 00 إلى 99 يمكن أن يستخدم فى الكثير من التطبيقات مثل عد السيارت فى موقف السيارات أو عدد الأشخاص فى مكان ما .
قد يشكل حساب كود السفن سيجمنت فى كل مرة شىىء من الإزعاج للبعض .
هل هناك طريقة لاستخدام القيمة العشرية فقط لتعرضها السفن سيجمنت ؟
نعم ، الدائرة المتكاملة المسماة مفسر الشفرة من BCD إلى سفن سيجمنت ( 7447 للأنود المشترك و 7448 للكاثود المشترك ) تقوم بذلك نيابة عنك .

الدائرة الكهربية :







سوف نستخدم الدائرة المتكاملة 7448 كمفسر للشفرة من BCD إلى سفن سيمنت ، ومن ثم يجب أن نستخدم وحدتين سفن سيجمنت نوع "الكاثود المشترك" ، ويتم توصيل الخطوط A,B,C,D,E,F,G على التوازى مع استخدام طريقة الانتخاب بين كاثودى الوحدتين .
البرنامج عبارة عن عداد تصاعدى / تنازلى من 00 إلى 99 باستخدام 2 مفتاح ضاغط ( تمثل أى نوع من حساسات الدخل الرقمى المناسبة ) أحدهما للتزايد والآخر للتناقص .
شرح خطوات البرنامج :
1- فى البداية يتم استخدام الموجه #define فى تعريف وإنشاء مسميات سهلة ومتعارف عليها بدلا من مسميات خاصة . على سبيل المثال تسمية طرف توصيل مفتاح التزايد PORTA.F0 باسم Up وطرف توصيل مفتاح التناقص PORTA.F1 باسم Down وهكذا ، كما يلى :

الكود:
#define Up  PORTA.F0      //  We can write Up instead of PORTA.F0  ...
#define Down  PORTA.F1
 #define disp_unit1  PORTA.F2    //  We can write disp_uinit1 instead of PORTA.F2  ...
#define disp_unit2  PORTA.F3

2- إعلان (تعريف) المتغيرات وتخصيص قيم لها عند الرغبة . هنا يتم إعلان متغير العدد الكلى المراد عرضه Number ( يقع بين 00 و 99 ) ومتغير قيمة خانة آحاده Ones ومتغير قيمة خانة عشراته Tens ( تقع بين 0 و 9) من نوع char والتى تعنى ضمنيا (unsigned) char ( بين 0 و 255 ) ، مع تخصيص صفر للعدد Number=0 كحالة ابتدائية كما يلى :

الكود:
char Number=0 , Ones , Tens ;    // Variables

3- من المفضل تقسيم البرنامج إلى دوال منفصلة قدر المستطاع ، لتسهيل فهم وتتبع البرنامج . هنا سوف نقوم بإنشاء الدوال التالية :
أ‌- دالة العرض Display() : وهى دالة فارغة void لا تعود بقيمة وليس لها بارامترات مرتبطة بها بل يتم تنفيذ العبارات التى تحتوى عليها فقط ، وتكون بالصيغة التالية :

الكود:
void Display() //  Display function
{
…..
}

هذه الدالة بدورها تنقسم إلى قسمين هما :
• قسم استخراج خانة العشرات Tens وخانة الآحاد Ones من العدد الكلى Number ، وذلك عن طريق استخدام عامل القسمة "/" وعامل باقى القسمة "%" . نتيجة "قسمة عدد صحيح على عدد صحيح أخر" (كما هو الحال هنا) تكون العدد الصحيح ويتم تجاهل الكسر أو باقى القسمة (على سبيل المثال نتيجة قسمة 5 على 3 تكون 5/3 = 1 ) فى حين أن نتيجة " خارج قسمة عدد على عدد صحيح آخر " تكون عدد صحيح هو باقى القسمة ( مثال :نتيجة باقى قسمة 5 على 3 هو 5%3 = 2 ) . وبناء على ذلك نتيجة "قسمة العدد الصحيح Number (المكون من آحاد وعشرات) على العدد الصحيح "10 تكون العدد الصحيح المناظر لخانة العشرات لهذا العدد أى Tens=Number/10 . فى حين أن نتيجة "باقى قسمة العدد الصحيح Number (المكون من آحاد وعشرات) على العدد الصحيح "10 تكون العدد الصحيح المناظر لخانة الآحاد لهذا العدد أى Ones=Number%10 .

الكود:
Tens=Number/10; // Extracr : Tens & Ones from Number
Ones=Number%10;

• قسم الانتخاب وإرسال (تحميل) البيانات والخاص بوحدات السفن سيجمنت . حيث يتم تفعيل أحد وحدتى السفن سيجمت ، (وحدة العشرات disp_unit1=0 ، على سبيل المثال " كاثود مشترك" ) وفصل الوحدة الأخرى ( تكون وحدة الآحاد disp_unit2=1 ) مع تحميل بيانات الوحدة الفعالة (العشرات PORTB=Tens ) , ثم يتم العكس . كما يتم إجراء تأخير بسيط للسماح بعدم ظهور تداخل أو ظلال (أشباح) أثناء العرض كما يلى :

الكود:
disp_unit2=1;  // Ones unit disp_unit2 => off
 PORTB=Tens; // Load Tens Data
 disp_unit1=0; // Tens unit disp_unit1 => on
 delay_ms(3); // Delay

 disp_unit1=1; // Tens unit disp_unit1 => off
 PORTB=Ones; // Load Ones Data
 disp_unit2=0; // Ones unit disp_unit2 => on
delay_ms(3); // Delay

وتكون دالة العرض كما يلى :

الكود:
void Display() //  Display function
{
 Tens=Number/10; // Extracr : Tens & Ones from Number
 Ones=Number%10;
 
 disp_unit2=1;  //off => ones
 PORTB=Tens;
 disp_unit1=0; //on => tens
 delay_ms(3);
 
 disp_unit1=1; //off => tens
 PORTB=Ones;
 disp_unit2=0; //on => ons
 delay_ms(3);
}


ب‌- دالة تهيئة وإعداد أجهزة الميكروكونترولر المستهدف Setup() وهو هنا PIC16F628 كما يلى :

الكود:
void Setup()
{
 CMCON=7;    //All pins digital I/O
 TRISA.f0=1; TRISA.f1=1;  TRISA.f2=0;  TRISA.f3=0;//PORTA setup
 TRISB=0; //PORTB=0;                              //PORTB setup
 disp_unit1=1; disp_unit2=1;                            //Initial => off
}

4- فى النهاية يتبقى الدالة الرئيسية للبرنامج main() ، وفيها نبدأ باستدعاء دالة التهيئة Setup() ثم الدخول فى حلقة غير منتهية while(1) ، وفيها ننتظر تحقق شرط الضغط على أى من مفتاح التزايد if(Up) أو مفتاح التناقص if(Down) لتنفيذ تزايد Number++ أو تناقص Number— العدد Number بواحد . فى كل حالة يتم وضع بعض الشروط للتنفيذ السليم للبرنامج . على سبيل المثال لتجنب تغيير العدد أثناء الضغط يتم وضع شرط استمرار العرض حتى إزالة الضغط بحلقة while(Up) و حلقة while(Down) . كما أنه فى حالة التزايد ووصول العدد الكلى Number إلى القيمة 100 يتم استبدالها بالقيمة 0 بالعبارة if(Number==100)Number=0 , وفى حالة التناقص وصول العدد الكلى Number إلى القيمة 0 يتم استبدالها بالقيمة 100 بالعبارة if(Number==0)Number=100 .


البرنامج :

الكود:
#define disp_unit1  PORTA.F2 //  We can write disp_uinit1 instead of PORTA.F2  ...
#define disp_unit2  PORTA.F3
#define Up  PORTA.F0
#define Down  PORTA.F1

char Number=0,Ones,Tens; // Variables

void Display() //  Display function
{
 Tens=Number/10; // Extracr : Tens & Ones from Number
 Ones=Number%10;
 
 disp_unit2=1;  //off => ones
 PORTB=Tens;
 disp_unit1=0; //on => tens
 delay_ms(3);
 
 disp_unit1=1; //off => tens
 PORTB=Ones;
 disp_unit2=0; //on => ons
 delay_ms(3);
}
//*****************************************************************
void Setup()
{
 CMCON=7;    //All pins digital I/O
 TRISA.f0=1; TRISA.f1=1;  TRISA.f2=0;  TRISA.f3=0;//PORTA setup
 TRISB=0; //PORTB=0;                              //PORTB setup
 disp_unit1=1; disp_unit2=1;                            //Initial => off
}

//*****************************************************************

void main()
{
 Setup();
 while(1)
        {
          if(Up) // Press Up => PORTA.f0 high
                {
                    Number++;
                    if(Number==100)Number=0;
                    while(Up) // To avoid an increase in number wait until release => PORTA.f0 low.
                                  {
                                  Display();
                                  }
                    }

        if(Down) //Press Up => PORTA.f1 high
                    {
                    if(Number==0)Number=100;
                    Number--;
                    while(Down) // To avoid an increase in number wait until release => PORTA.f1 low.
                                  {
                                  Display();
                                  }
                    }

        Display();
        }
}
 

Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الثلاثاء يونيو 13, 2017 2:56 pm

عداد تصاعدى / تنازلى من 0000 إلى 9999 بأربع وحدات سفن سيحمنت ومفسر شفرة 7448 :
البرنامج :

الكود:
#define disp_unit1  PORTA.F2              //  Thousands Digit
#define disp_unit2  PORTA.F3              //Hundreds  Digit
#define disp_unit3  PORTA.F6              //Tens Digit
#define disp_unit4  PORTA.F7              //Ones Digit
#define Up  PORTA.F0
#define Down  PORTA.F1


unsigned Number=0,Ones,Tens,Hundreds,Thousands ,rem ; // Variables
void Display() //  Display function
{
Thousands = Number/1000;  // Thousands
rem = Number%1000 ;        // reminder
Hundreds  = rem/100;      // Hundreds
rem = rem%100 ;            // reminder
Tens = rem/10;            // Tens
Ones = rem%10;            //Ones
disp_unit2=1;              // off
disp_unit3=1;              // off
disp_unit4=1;              // off
PORTB=Thousands ;          //Load  Thousands Data
disp_unit1=0;              // Thousands => on
delay_ms(3);
 disp_unit1=1;              // off
disp_unit3=1;              // off
disp_unit4=1;              // off
PORTB=Hundreds ;                //Load  Hundreds Data
disp_unit2=0;                // Hundreds => on
delay_ms(3);
disp_unit1=1;              // off
disp_unit2=1;              // off
disp_unit4=1;              // off
PORTB=Tens ;                //Load  Tens Data
disp_unit3=0;                // Tens => on
delay_ms(3);

disp_unit1=1;              // off
disp_unit2=1;              // off
disp_unit3=1;              // off
PORTB=Ones ;                //Load Ones Data
disp_unit4=0;                // Ones => on
delay_ms(3);
}
//*****************************************************************
void Setup()
{
 CMCON=7;    //All pind digital I/O
 TRISA.f0=1; TRISA.f1=1;  TRISA.f2=0;  TRISA.f3=0;TRISA.f6=0;TRISA.f7=0;        //PORTA setup
 TRISB=0; PORTB=0;                              //PORTB setup
 disp_unit1=1; disp_unit2=1;disp_unit3=1;disp_unit4=1;//Initial => off
}
//*****************************************************************
void main()
{
 Setup();
 while(1)
        {
          if(Up)                // Press Up => PORTA.f0 high
                    {
                    Number++;
                    if(Number==10000)Number=0;
                    while(Up)        // To avoid an increase in number wait until release => PORTA.f0 low.
                                  {
                                  Display();
                                  }
                    }

        if(Down) //Press Up => PORTA.f1 high
                    {
                    if(Number==0)Number=10000;
                    Number--;
                    while(Down) // To avoid an increase in number wait until release => PORTA.f1 low.
                                  {
                                  Display();
                                  }
                    }

        Display();
        }
}
 

النتيجة :


Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الثلاثاء يونيو 20, 2017 12:17 am

وحدة عرض الحروف LCD :
وحدة عرض الحروف LCD مكونة من وحدات (موديولات) جاهزة . ميزة هذه الوحدات أنها تحتوى على ناقل للبيانات data bus وناقل للتحكم control bus . للتعامل مع هذه الأجهزة يوجد بمترجم الميكروسى برو مكتبات معرفة مسبقا (جاهزة) للتحكم فى وحدات LCD . الشكل التالى يبين المظهر الطبيعى ومنظر هذه الوحدات فى برنامج إيزيس ISIS :



تقوم وحدات العرض LCD بعرض الحروف التى تغذى بها فى شكل كود أسكى ASCII code . بالإضافة إلى كود أسكى ، يمكنها أن تعرض الحروف المصصمة بمعرفة المبرمج ، ميزة أخرى لوحدة العرض LCD ، وهى أن ناقل توصيل البيانات الطبيعى عبارة عن 8 خطوط ، لكن يمكن إعدادها لكى تعمل فقط بأربعة خطوط للبيانات . هذه الميزة توفر من عدد الأطراف المستخدمة ولكن على حساب تقليل سرعة نقل البيانات . المكتبة الجاهزة بالميكروسى معدة لتعمل بأربعة بتات 4-bit .
لعرض المكتبة الجاهزة لهذا الجهاز وللأجهزة الأخرى والمتواجدة بالميكروسى ، يجب عليك النقر على لوحة الأدوات الموجودة على الجانب الأيمن لنافذة تحرير البرنامج ، يتم التعرف على هذه اللوحة بعلامة التبويب التى تحتوى على العنوان Library Manager . عندما تنقر هذا التبويب تظهر لك نافذة بها قائمة بالمكتبات المختلفة والتى من الممكن العمل بها مع الميكروكونترولر المستخدم . فى هذه النافذة سوف تجد مكتبة باسم Lcd ، حيث يمكنك النقر على إى دالة واردة بالمكتبة لرؤية تعليمات الاستخدام المناظرة . الشكل التالى يوضح مظهر هذه النافذة :




تنفيذ العرض بوحدات LCD يتطلب استخدام تسلسل من التعليمات والأوامر للإعداد والعرض ، مكتبة الميكروسى تقلل هذا العمل لأنها المسؤولة عن عمل كل هذه الإعدادات مما يجعل مهمة المبرمج أسهل .

فى الخطوة الأولى لاستخدام LCD ، تحتاج لتعريف أطراف التوصيل وتنفيذ دالة بدء (تهيئة) تشغيل LCD عن طريق الدالة الجاهزة lcd_init () . تعريف الأطراف متروك للمبرمج وحسب الميكروكونترولرالمستخدم. يمكن استخدام العبارات التالية ، على سبيل المثال :


الكود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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 تحتاج فقط إلى ستة أطراف ، أربعة لبتات البيانات واثنان لبتات التحكم ، وحدة العرض بها طرف تحكم ثالث هو WR ، عادة لا نحتاج لهذا الطرف وببساطة يتم توصيله بالأرضى .
وفى النهاية يجب بدء تشغيل وحدة العرض LCD داخل الدالة الرئيسية بعد إعداد المنافذ . صيغة الدالة الرئيسية تكون كما يلى :

الكود:
void main (void)
{
   Lcd_init (); // Start the LCD.
   while (1) // infinite loop.
   {
   }
}
 

ويصبح كود البرنامج كما يلى :

الكود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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


void main (void)
{
   Lcd_init (); // Start the LCD.
   while (1) // infinite loop.
   {
   }
}

بعد تنفيذ الكود السابق تكون وحدة العرض LCD جاهزة لعرض الحروف ، بدءا من الموقع الموجود بالسطر(الصف) الأول والعامود الأول والذى يدل علية مؤشر يومض .
تصنع وحدات عرض الحروف فى أشكال وألوان متعددة حيث تتوفر بشاشة خضراء أو زرقاء أو صفراء . ويتم عرض الحروف فى شكل مصفوفة حروف مثل 2 صف مع 16 عامود وتعرف باسم 2x16 وبنفس الطريقة يوجد
1x16, 2x16, 2x8, 2x20, 4x20 وغيرها . على سبيل المثال ، سوف نستخدم وحدة عرض 2X16 .
لبدء محاكاة LCD ببرنامج إيزيس يتم جلب الأجهزة LM016L و PIC16F628A . الاسم المرجعى LM016L فى إيزيس هو لوحدة عرض 2X16 . وأخيرا يكون التوصيل كما فى الدائرة التالية:




وحدة العرض LCD بها طرف يسمى VEE، هذا الطرف وظيفته التحكم فى تباين contrast الشاشة ، ولكن فى أغراض المحاكاة ليس له تأثير ، هذا الطرف يمكن توصيله بالأرضى للحصول على أعلى تباين ، بعض الشاشات تحتاج لجهد سالب خارجى للتحكم فى التباين وكلما زاد الجهد السالب كلما قل التباين . وللأغراض العملية يمكن ضبط التباين عن طريق مقاومة متغيرة . كما هو موضح بالدائرة التالية :





Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الثلاثاء يونيو 20, 2017 3:12 pm

الخطوة التالية هى كتابة (طباعة) معلومات على الشاشة ، ولهذا الغرض يمكنك استخدام أربع دوال . دالتان منهم تسمحان لك بكتابة الأحرف characters ، والدالتان الأخريان تسمحان لك بكتابة السلاسل النصية strings .
يمكنك كتابة الحروف بطريقتين ، الأولى ، ببساطة كتابة الحروف بترتيب متسلسل معروف لوحدة العرض والطريقة الثانية كتابة الحروف فى السطر والعامود الذى يحدده المبرمج .

دوال كتابة (طباعة) الأحرف Functions to print characters
الدالة الأولى لكتابة الأحرف هى الدالة :

الكود:
  Lcd_Chr_Cp (char out_char);


هذه الدالة يتم استدعاؤها عند كتابة حرف من حروف كود أسكى ASCII code ، الموجود فى بارامتر الدخل out_char . وعند إحساس وحدة العرض بالأمر بكتابة حرف جديد فإن المؤشر ينتقل تلقائيا للموقع التالى مباشرة . لفهم أداء هذه الدالة راقب وحلل المثال التالى :

الكود:
 void main (void)
{
        Lcd_init ();                   // Start the LCD.
        Lcd_Chr_Cp('H');        // These functions printed letter by letter the word "Hello".
        Lcd_Chr_Cp('e');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('o');
        while (1)                     // infinite loop.
        {
        }
}

ويصبح البرنامج بالصيغة التالية :

الكود:
// Lcd_Chr_Cp (char out_char);
// Prints character on Lcd at current cursor position.
//Both variables and literals can be passed as a character.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

void main (void)
{
        Lcd_init ();                   // Start the LCD.
        Lcd_Chr_Cp('H');        // These functions printed letter by letter the word "Hello".
        Lcd_Chr_Cp('e');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('l');
        Lcd_Chr_Cp('o');
        while (1)                     // infinite loop.
        {
        }
}
 

الشكل التالى يبين المحاكاة :



لكتابة حروف من خلال إحداثيات الصفوف والأعمدة نستخدم الدالة :

الكود:
 Lcd_Chr (char row, char column, char out_char);

هذه الدالة تطبع الحرف out_char بالصف row والعامود column . المثال التالى يوضح لك هذا المفهوم :

الكود:
void main (void)
{
   Lcd_init ();                   // Start the LCD.
   Lcd_Chr_Cp ('H');        // These functions printed letter by letter the word "Hello".
   Lcd_Chr_Cp ('e');
   Lcd_Chr_Cp ('l');
   Lcd_Chr_Cp ('l');
   Lcd_Chr_Cp ('o');
   Lcd_Chr (1, 6, '1');           // prints the character 1, at row 1, column 6
   Lcd_Chr (2, 7, '2');           // prints the character 2, at row 2, column 7
   Lcd_Chr (3, 8, '3');           // prints the character 3, at row 3, column 8
   Lcd_Chr (4, 9, '4');           // Prints the character 4, at row 4, column 9
   while (1)                        // infinite loop.
   {
   }
}

 

كود البرنامج :

الكود:

// Lcd_Chr (char row, char column, char out_char);
// Prints character on Lcd at specified position.
//Both variables and literals can be passed as a character.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

 void main (void)
{
   Lcd_init ();                   // Start the LCD.
   Lcd_Chr_Cp ('H');        // These functions printed letter by letter the word "Hello".
   Lcd_Chr_Cp ('e');
   Lcd_Chr_Cp ('l');
   Lcd_Chr_Cp ('l');
   Lcd_Chr_Cp ('o');
   Lcd_Chr (1, 6, '1');           // prints the character 1, at row 1, column 6
   Lcd_Chr (2, 7, '2');           // prints the character 2, at row 2, column 7
   Lcd_Chr (3, 8, '3');           // prints the character 3, at row 3, column 8
   Lcd_Chr (4, 9, '4');           // Prints the character 4,at row 4, column 9
   while (1)                        // infinite loop.
   {
   }
}
 


الشكل التالى يبين المحاكاة :



دوال كتابة (طباعة) سلاسل النصوص Functions to print text strings :
أيضا كتابة السلاسل النصية إما أن يتم كتابتها فى موقع المؤشر الحالى (CP) وفق سريان الكتابة أو تكتب فى موقع يحدد بإحداثيات الصف والعامود .
لكتابة سلسلة نصية عند الموقع الحالى لمؤشر الكتابة نستخدم الدالة التالية :

الكود:
Lcd_Out_Cp (char * text); 

هذه الدالة لها بارامتر دخل واحد وهو مؤشر للسلسلة النصية والتى تسمى هنا text . للتعرف على استخدام هذه الدالة راقب وحلل هذا المثال :

الكود:
 
void main (void)
{
   Lcd_init ();             // Start the LCD.
   Lcd_Out_Cp ("Hello World ...");
   while (1)             // infinite loop.
   {
   }
}

يمكن تنفيذ هذه الدالة مع سلسلة من الثوابت أو من المتغيرات ، نعرف السلاسل بالأقواس المزدوجة فى بدايتها وفى نهايتها , على سبيل المثال "Hello World ...", ، صيغة المتغير يتم إعلانها بالشكل :

الكود:
char Text [20] = "Hello World ..." 

البرنامج :

الكود:

// Lcd_Out_Cp (char * text);
// Prints text on Lcd at current cursor position.
//Both string variables and literals can be passed as a text.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

void main (void)
{
   Lcd_init ();             // Start the LCD.
   Lcd_Out_Cp ("Hello World ...");
   while (1)             // infinite loop.
   {
   }
}


الشكل التالى يبين المحاكاة :




لكتابة السلسلة النصية إبتداء من نقطة إحداثيات محددة نستخدم الدالة :

الكود:
Lcd_Out (char row, char column, char * text);

هذه الدالة تعمل بطريقة مماثلة للدالة السابقة بإختلاف أن بيانات البارامترات تتضمن الصف والعامود . لفهم عمل هذه الدالة راقب وحلل المثال التالى :

الكود:
void main (void)
{
   Lcd_init ();                // Start the LCD.
   Lcd_Out (1, 1, "Row 1, Column 1");
   Lcd_Out (2, 2, "Row 2, Column 2");
   while (1)                // infinite loop.
   {
   }
}
 


البرنامج :

الكود:

// Lcd_Out (char row, char column, char * text);
// Prints text on Lcd starting from specified position.
//Both string variables and literals can be passed as a text.

// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

void main (void)
{
   Lcd_init ();                // Start the LCD.
   Lcd_Out (1, 1, "Row 1, Column 1");
   Lcd_Out (2, 2, "Row 2, Column 2");
   while (1)                // infinite loop.
   {
   }
}
 

الشكل التالى يبين المحاكاة :



Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 21, 2017 11:26 am

كتابة القيم العددية Printing numeric values :
طباعة القيم العددية أمر حيوى فى  العديد من التطبيقات . على سبيل المثال عندما تريد عرض حالة التغير لحساس مثل درجة الحرارة أو الرطوبة أو الضغط أو أى جهاز آخر يتم التعامل معه .
لتحقيق هذا الهدف يمكن استخدام دوال التحويل الجاهزة والموجودة ضمن المترجم ميكروسى . يمكنك استخدام مكتبة التحويلات  Conversions ، هذه المكتبة بها دوال تقوم بتحويل القيم العددية إلى سلسلة .
عندما يتطلب الأمر عرض قيمة لعدد صحيح يتم استخدام الدالة :

الكود:
IntToStr (int input, char *output) ;

هذه الدالة تقوم بتحويل العدد الصحيح نوع signed integer إلى سلسلة string . سلسلة الخرج يكون لها عرض ثابت 7 أحرف بما فى ذلك حرف الانتهاء (نهاية السلسلة) . سلسلة الخرج تكون بمحازاة اليمين والأماكن المتبقية جهة اليسار (إن وجدت) تملء بفراغات .    
هذه الدالة لها بارامتران هما :  input وهو قيمة العدد الصحيح المراد عرضه ، و output والذى يشير إلى متغير لسلسلة نصية والذى تريد وضع نتيجة تحويل القيمة العددية input إلى سلسلة نصية فيه .
يجب إعلان السلسلة المستهدفة لتكون بطول 7  أحرف على الأقل .
لفهم هذا التحويل راقب وحلل المثال التالى :


الكود:
void main (void)
{
 int Integer = 123; // Declaration of an integer variable with initial value 123.
 char Text [20]; // String data printing , at least 7 characters in length.
 Lcd_init (); // Start the LCD.
 IntToStr (Integer, Text); // function that does the conversion.
 Lcd_Out_Cp (Text) ; // print text on the LCD screen.
 while (1) // infinite loop.
 {
 }
}


البرنامج :

الكود:
// IntToStr (int input, char *output) ;
// Converts input signed integer number to a string.
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

void main (void)
{
 int Integer = 123; // Declaration of an integer variable with initial value 123.
 char Text [20]; // String data printing , at least 7 characters in length.
 Lcd_init (); // Start the LCD.
 IntToStr (Integer, Text); // function that does the conversion.
 Lcd_Out_Cp (Text) ; // print text on the LCD screen.
 while (1) // infinite loop.
 {
 }
}

كما ذكرنا ، عند طباعة العدد الصحيح كنص باستخدام هذه الدالة دائما يفترض أن العدد مداه سبعة حروف ، بما فى ذلك حرف الانتهاء ، فأن كان العدد أقل من ذلك فإن باقى الحروف سوف تكون مسافات فارغة ، ففى مثالنا تكون النتيجة هى السلسلة  “   123” أى ثلاثة مسافات فارغة جهة اليسار  .
بعد الترجمة والمحاكاة تكون النتيجة كما فى الشكل التالى :




يمكن طباعة الأعداد الحقيقية ذات العلامة العشرية باستخدام الدالة :

الكود:
FloatToStr (float FNUM, char * str);  

مبدأ عمل هذه الدالة مماثل للدالة السابقة .
ملحوظة :
سوف يتم بتر (اقتطاع) العدد float إلى السبع أرقام ذات الأهمية القصوى قبل التحويل .
يجب إعلان السلسلة المستهدفة لتكون بطول  14 حرف على الأقل .
مثال :

الكود:
float ff1 = -374.2;
float ff2 = 123.456789;
float ff3 = 0.000001234;
char txt[15];
...
FloatToStr(ff1, txt);  // txt is "-374.2"
FloatToStr(ff2, txt);  // txt is "123.4567"
FloatToStr(ff3, txt);  // txt is "1.234e-6"

لفهم هذه الدالة راقب وحلل المثال التالى :

الكود:

void main (void)
{
 int Integer = 123;   // Declaration of an integer variable with initial value 123.
 float Decimnal = 12.76543; // Declaring a variable with decimal point
 // initialized to 12.76543.
 char Text  [20]; // String data printing.
 Lcd_init (); // Start the LCD.
 IntToStr (Integer, Text); // Function that makes the whole conversion.
 Lcd_Out (1,1, Text); // print text on the LCD screen.
 FloatToStr (Decimnal, Text); // function that does the conversion decimal.
 Lcd_Out (2,1, Text); // print text on the LCD screen.
 while (1) // infinite loop.
 {
 }
}

البرنامج :

الكود:

// FloatToStr (float FNUM, char * str);
// Converts a floating point number to a string.
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

void main (void)
{
 int Integer = 123;   // Declaration of an integer variable with initial value 123.
 float Decimnal = 12.76543; // Declaring a variable with decimal point
 // initialized to 12.76543.
 char Text  [20]; // String data printing.
 Lcd_init (); // Start the LCD.
 IntToStr (Integer, Text); // Function that makes the whole conversion.
 Lcd_Out (1,1, Text); // print text on the LCD screen.
 FloatToStr (Decimnal, Text); // function that does the conversion decimal.
 Lcd_Out (2,1, Text); // print text on the LCD screen.
 while (1) // infinite loop.
 {
 }
}
 


الشكل التالى يبين نتيجة المحاكاة :



نفس العملية يمكن تنفيذها على الأنواع الأخرى للمتغيرات مثل :

• فى حالة المتغير نوع  unsigned short :

الكود:
ByteToStr(unsigned short input, char *output);

تقوم هذه الدالة بتحويل "بايت" الدخل input إلى السلسلة ouput . السلسلة output  يكون لها عرض ثابت 4 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 4 أحرف .
مثال :

الكود:
unsigned short t = 24;
char txt[4];
...
ByteToStr(t, txt);  // txt is " 24" (one blank here)


• فى حالة المتغير (signed) short (int) أو short نستخدم الدالة :

الكود:
ShortToStr (short input, char * output);

تقوم هذه الدالة بتحويل الدخل input إلى السلسلة ouput . السلسلة output  يكون لها عرض ثابت 5 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 5 أحرف .
مثال :

الكود:
short t = -24;
char txt[5];
...
ShortToStr(t, txt);  // txt is " -24" (one blank here)


وفى حالة المتغير unsigned  int  نستخدم الدالة :

الكود:
WordToStr (unsigned int input, char * output);

تقوم هذه الدالة بتحويل الدخل input إلى السلسلة ouput . السلسلة output  يكون لها عرض ثابت 6 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 6 أحرف .
مثال :

الكود:
unsigned t = 437;
char txt[6];
...
WordToStr(t, txt);  // txt is "  437" (two blanks here)

• فى حالة المتغير Long نستخدم الدالة :

الكود:
LongToStr (long input, char * output);

تقوم هذه الدالة بتحويل الدخل input إلى السلسلة ouput . السلسلة output  يكون لها عرض ثابت 12 حروف بما فى ذلك حرف الانتهاء . السلسلة output تكون بمحازاة اليمين والأماكن المتبقية على اليسار (إن وجدت) تملء بفراغات . إعلان السلسلة المستهدفة يجب ألا يقل طولها عن 12 أحرف .
مثال :

الكود:
long jj = -3700000;
char txt[12];
...
LongToStr(jj, txt);
// txt is "   -3700000" (three blanks here)

طريقة تحويل العدد الصحيح unsigned int ، رقم تلو الآخر إلى سلسة ، حرف تلو الآخر :
بالرجوع إلى جدول كود أسكى نجد أن كل حرف من أحرفه يقابله قيمة عددية معينة ، فحرف الصفر ‘0’ يقابلة العدد 48 ، وحرف الواحد ‘1’ يقابلة العدد 49(1+48) والحرف اثنين ‘2’ يقابله العدد 50(2+48)  وهكذا ، من ثم يمكن استنتاج أنه لتحويل أى رقم إلى حرف كود أسكى المناظر يتم إضافة القيمة العددية 48 . بعبارة أخرى ، 0+48=’0’ ، و 1+48=’1’ و 2+48=’2’ وهكذا .
مثال :
تتبع الخطوات التالية :  
• إعلان متغير نوع  unsigned int باسم number وإسناد قيمة ابتدائية له هى الصفر وهذا السجل سوف يحتوى على العدد المطلوب عرضه (قبل تحويله إلى كود أسكى) .
• الإعلان عن متغير بالإشارة إليه بالطريقة *text  وهو عبارة عن نص مكون من أربعة خانات وإسناد قيمة أصفار كقيمة ابتدائية وهو عبارة عن مصفوفة صف بها 4 عناصر .

الكود:
unsigned int number = 0; // Integer number
char *text = "0000"; // Pointer to string

• إنشاء دالة باسم Display تحتوى على تقسيم (إستخلاص) محتويات السجل   numberإلى أربعة خانات (أرقام) وتحويل كل خانة إلى كود أسكى المناسب للعرض على وحدة العرض LCD حيث يتم :
# استخلاص قيمة رقم خانة الآلاف بقسمة العدد number على1000    ويضاف إلى النتيجة العدد 48 لتحويله إلى كود أسكى وحفظ النتيجة كأول عنصر من عناصر المصفوفة text[0]  .
# استخلاص قيمة رقم خانة المئات بقسمة العدد number على 100 ثم إيجاد باقى خارج قسمة الناتج على 10 والنتيجة النهائية يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كثانى عنصر من عناصر المصفوفة
text[1]  .
# استخلاص قيمة رقم خانة العشرات بقسمة العدد number على 10 ثم إيجاد باقى خارج قسمة الناتج على 10 والنتيجة النهائية يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كثالث عنصر من عناصر المصفوفة
text[2]  .
# استخلاص قيمة رقم خانة الآحاد بإيجاد باقى خارج قسمة العدد number على 10 والنتيجة يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كرابع عنصر من عناصر المصفوفة text[3]  .
#  وأخير يمكن عرض هذه المصفوفة على وحدة العرض LCD ، على سبيل المثال ، فى الصف الثانى بدءا من العامود السابع كما يلى :  

الكود:
void Display ()   // define display_init;
{                    
 text[0] = number/1000 + 48;           // thousands digit, ASCII
 text[1] = (number/100)%10 +48;         // hundreds digit, ASCII  
 text[2] = (number/10)%10 + 48;       // tens digit ASCII
 text[3] = number%10 +48;               // unit digit ASCII;
 Lcd_Out(2,7, text);                     // display on LCD from Row 2, character 7
}

Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 21, 2017 11:33 am

تدريب رقم 1 : ربط وحدة العرض Interfacing a character LCD
الوصف
وحدات العرض LCD التى تعتمد على المتحكم HD4480 منتشرة لرخص سعرها ولأنه يمكنها عرض الحروف . علاوة على أنها من السهل ربطها مع الميكروكونترولر ومعظم المترجمات تتضمن مكتبات لروتينات تخصها .
سوف نستعرض ربط هذه الوحدة مع الميكروكونترولر PIC16F628A . يحتاج الربط إلى 6 خطوط مداخل / مخارج من الميكروكونترولر ، 4 خطوط للبيانات و 2 خط للتحكم . سوف نعرض السلسلة النصية التالية وهى تومض blinking كاختبار للربط :
“Welcome to ………” .
الدائرة الكهربية :
سوف يتم نقل البيانات بين الميكروكونترولر ووحدة LCD فى نظام 4-bit . الطرف (5) R/W لوحدة LCD يوصل بالأرضى بصفة دائمة لعدم وجود قراءة من وحدة LCD . الأطراف RB4-RB7 تستخدم كخطوط للبيانات . خطوط التحكم RS و E يتم توصيلها بالأطراف RB2 و RB3 . لذلك فإننا نستخدم 6 أطراف للربط بين الميكروكونترولر ووحدة LCD .



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

الكود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

// Define Messages
 char message1[] = "Welcome to";
 char message2[] = "Eng.F.Abdelaziz";

void main()
{
   
            TRISB = 0;          // PORTB All Outputs

Lcd_Init();                                // Initialize LCD
do
{

  Lcd_Cmd(_LCD_CLEAR);               // CLEAR display
  Lcd_Cmd(_LCD_CURSOR_OFF);           // Cursor off
  Lcd_Out(1,4,message1);                  // Write message1 in 1st row
  Lcd_Out(2,1,message2);                // Write message2 in 2nd row
  Delay_ms(1000);                            // Wait for 1 sec
  Lcd_Cmd(_LCD_CLEAR);          // Clear display
  Delay_ms(1000);          // Wait for 1 sec

  } while(1);                     // Infinite Loop
}
 

Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 21, 2017 11:39 am

تدريب رقم 2 : تحريك الرسائل .
الدائرة الكهربية :



البرنامج :
الكود:
 
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

char  txt1[] = "Eng.F. Abdelaziz" ;       
char txt2[] = "EasyPIC";
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(){

 

  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 8 times
      Lcd_Cmd(_LCD_SHIFT_LEFT);
      Move_Delay();
    }

    for(i=0; i<8; i++) {            // Move text to the right 8 times
      Lcd_Cmd(_LCD_SHIFT_RIGHT);
      Move_Delay();
    }
  }
}

Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 21, 2017 11:56 am

مشروع عد وعرض ومعالجة عدد الأشياء تصاعديا وتنازليا باستخدام PIC16F628 وLCD
يتم أستلام وعد النبضات من مدخلين حيث يخصص المدخل الأول RA0 لتزايد العداد والمدخل الثانى RA1 لتناقص العداد ويتم عرض الفرق بينهما على وحدة العرض LCD كعدد من 0000 إلى 9999 .
الدائرة الكهربية :


البرنامج :

الكود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

char Message1[]="COUNTER";      // Message for line1
unsigned int number = 0;

char *text = "0000";

void Display()              // define display_init
{
 text[0] = number/1000 + 48;             // thousands digit
 text[1] = (number/100)%10 +48;          // hundreds digit
 text[2] = (number/10)%10 + 48;           // tens digit
 text[3] = number%10 +48;                 // unit digit
 Lcd_Out(2,7, text);                         // display on LCD from column 2, character 7
}

bit oldstate1;
bit oldstate2;

void main()                            // main;
{
 CMCON = 7;                  // turn off analogue comparator and make PORTA to digital I/O
 TRISA0_bit = 1;                        // make PORT RA0 as input for button
 TRISA1_bit = 1;                        // make PORT RA1 as input for button
 TRISB = 0;                            // Set PORTB direction to be output;
 PORTB = 0;                           
 Lcd_init();                            // LCD Initialization
 Lcd_cmd(_LCD_CLEAR);                  // Clear LCD
 Lcd_cmd(_LCD_CURSOR_OFF);              // Cursor mode off
 Lcd_out(1,2,Message1);               

 do{

if (PORTA.F0==0) {              // Detect logical 0
delay_ms(100);
      oldstate1 = 1;                              // Update flag
    }
    if (oldstate1 && PORTA.F0==1 ) {  // Detect zero-to-one transition
        Delay_ms(100);  //; If button is depressed, delay 0,1s and increment "number" with 1
    number = number +1;
      oldstate1 = 0;                              // Reset flag
    }


        if (PORTA.F1==0) {              // Detect logical 0
delay_ms(100);

        oldstate2 = 1;                              // Update flag
}

if (oldstate2 && PORTA.F1==1 ) {  // Detect zero-to-one transition              Delay_ms(100);    // If button is depressed, delay 0,1s and decrement "number" with 1
          number = number -1;

oldstate2 = 0;                              // Reset flag
                          }
    if (number > 9999)                // if it's more than 9999 go to 0
    number = 0;
    Display();                    // call display()

if(number>10) PORTB.B0=1;
else  PORTB.B0=0;

if(number>20) PORTB.B1=1;
else  PORTB.B1=0;
    } while(1);                        // infinite loop;
 }

 


فى هذا البرنامج يمكن إجراء أى عمليات رياضية أو منطقية على محتوى سجل المتغير number على سبيل المثال تشغيل خرج RB0 عندما يزداد العدد عن 10 (كمثال) وأيضا تشغيل مخرج آخر عندما يزداد العدد عن 20 وهكذا .

تعديل دالة العرض :

الكود:

void Display()              // define display_init
{
 char text [7] ;
  IntToStr(number, text);
 Lcd_Out(2,7,text);                        // display on LCD from column 2, character 7
}

Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 21, 2017 12:46 pm

الحروف المخصصة (التفصيل) custom بشاشة LCD والمترجم ميكروسى برو :
وحدات عرض الحروف LCD عادة ما تستخدم متحكمات متوافقة مع المتحكم HD44780 ، وهى تسمح لنا بتعريف 8 حروف مخصصة بالإضافة إلى الحروف القياسية المبرمجة مسبقا . هذه الوحدات تحتوى على ثلاثة أنواع من الذاكرة وهى :
• ذاكرة مولد الحرف الثابتة CGROM – Character Generator ROM : وهى تحتفظ بنماذج 5x8 أو 5x10 نقطة للحروف المعرفة مسبقا فى وحدة LCD . هذه الذاكرة يمكن أن تولد 208 نموذح حرف 5x8 نقطة و 32 نموذج حرف 5x10 نقطة .
• ذاكرة عرض البيانات DDRAM – Display Data RAM : وهذه هى الذاكرة التى تحتفظ ببيانات الحرف الذى يتم عرضه حاليا على شاشة LCD . حجم هذه الذاكرة 80×8 bits أى 80 حرف .
• ذاكرة مولد الحرف المتغيرة CGRAM – Character Generator RAM : تعمل هذه الذاكرة بشكل يشبة الذاكرة CGROM ولكن نظرا لأنها من نوغ RAM فإنه يمكننا تعديل بياناتها فى أى وقت . ومن ثم يمكننا تخزين نماذج الحروف المخصصة بواسطتنا فى هذه الذاكرة من خلال البرنامج . يمكننا تخزين حتى 8 نماذج حروف 5x8 نقطة أو حتى 4 نماذج حرف 5x10 نقطة فى هذه الذاكرة .
إنشاء حروفك الخاصة :
وحدات عرض الحروف LCD لديها القدرة على تخزين حتى 8 حروف مصممة بواسطة المبرمج . قيم أسكى للحروف المصممة بالمستخدم تناظر القيم الرقمية من 0 إلى 7 .
على سبيل المثال , إذا رغبت فى طباعة أول حرف مصمم بواسطة المستخدم يتم ذلك عن طريق استخدام دوال طباعة الحروف كما يلى : Lcd_Chr_Cp (0); أو Lcd_Chr(1,1,0); . يتم تخزين الأحرف التى ينشؤها المستخدم فى ذاكرة RAM لشاشة وحدة العرض LCD ولهذا السبب يجب إعادة برمجتها فى كل مرة تقوم فيها ببدء LCD .
الحروف هى مجموعة من القيم الثنائية تشكل صورة نقطية ، والنتيجة هى صورة تعرض على الشاشة بدقة
5 x 7 pixels .
تحرير وبرمجة هذه البيانات هو مضيعة للوقت ، لكن المترجم ميكروسى برو يوجد ضمن أدواته محرر للحروف لتصميم الحروف بمعرفة المبرمج . فى هذا المحرر البسيط يتم تحرير حرف الصورة النقطية وتوليد كود لغة السى اللازم لتحديد الحرف على الشاشة . والخلاصة أنه يتم تحرير الحرف ثم نسخ ولصق كود المصدر الخاص به فى برنامج المشروع .
إظهار هذا المحرر يتم عن طريق قائمة الأدوات Tools ثم الخيار Custom Character LCD .



الشكل التالى يبين نافذة هذا المحرر :




فى هذا المحرر يقوم المستخدم بالنقر على المربعات (النقط) التى تشكل الحرف ، يتم اختيار قيمة أسكى التى تخصص للحرف من خلال مربع الاختيارChar: . هذه القيمة يجب أن تقع بين 0 و 7 . يتم إنهاء هذه العملية بالضغط على الزر
Generate Codeونسخ هذاالكود لاستخدامه فى البرنامج .
الشكل التالى يبين المحرر عند تحرير حرف أسكى وتخصيص الصفر له :



البرنامج التالى يوضح هذا المفهوم :

الكود:
 
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

 // Function to store in LCD RAM memory
// Constants created by the character editor, it contains the character bitmap.
 const char character [] = {17,14,21,14,31,4,27,0};
 void CustomChar (char pos_row , char pos_char)
 {
 char i;
 LCD_Cmd(64); // address character 0.
 for (i=0;i<=7;i++) LCD_Chr_Cp(character[i]);// Loop to save the bitmap.
 LCD_Cmd (_LCD_RETURN_HOME);// For practical purposes, this feature can be ignored.
 LCD_Chr(pos_row,pos_char,0); // Impression ASCII code 0.
 }
 void main (void)
 {
 Lcd_init(); // Start the LCD.
 CustomChar (1,1);// Print the character 0.
 while(1) // infinite loop.
 {
 }
 }

بعد الترجمة والمحاكاة نحصل على النتيجة التالية :




لتحقيق الاستخدام الأمثل للحروف يمكن للمبرمج تسجيل الإعدادات الابتدائية بالذاكرة ثم بعد ذلك يقوم بطباعة الحروف التى تم تحريرها وتخصيص الأرقام من 0 إلى 7 لها . لتوضيح هذا المفهوم راقب وحلل المثال التالى:

الكود:
 // Declaring Constants represent bitmaps,
// Animate a FIGs. These are the result code character editor
// MikroC PRO.
const char Fig1 [] = {17,14,21,14,31,4,27,0};    // Start CGRAM address 64 (Char=8 bit).
const char Fig2 [] = {17,14,21,14,31,4,10,0};    // start address 72(=64+8).
const char Fig3 [] = {17,14,21,14,31,21,10,0};    // start address 80(=72+8).
const char Fig4 [] = {24,28,30,31,30,28,24,0};    // start address 88(=80+8).
 
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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


 // Function to save Declamation characters in RAM.
 // This function is designed by the developer.
 void Lcd_RAM_Car  (char IntDir ,  const char * Map)    // RAM Address & Char. Map
 {
    char i;
    LCD_Cmd (IntDir);             // Start RAM address.
    // Loop to save the map in the LCD RAM.
    for (i= 0; i <8; i ++) LCD_Chr_Cp (Map [i]);
 }

 
void main (void)
 {
    Lcd_init ();       // Start the LCD.

    Lcd_RAM_Car (64, Fig1);   // Creat & Store the character 1 in first RAM address >>64
    Lcd_RAM_Car (72, Fig2);   // Creat &Store the character 2 ( 72=64+8)
    Lcd_RAM_Car (80, Fig3);   // Creat &Store the character 3 ( 80=72+8)
    Lcd_RAM_Car (88, Fig4);   // Creat &Store the character 4 ( 88=80+8)

    LCD_Chr (1, 1, 0);      // Finally : Print the character Fig1.(0 in ASCII) in pos ( 1,1)
    LCD_Chr (1, 2, 1);       // Print the character Fig2.(1 in ASCII) in pos ( 1,2)
    LCD_Chr (1, 3, 2);       // Print the character Fig3.(2 in ASCII) in pos ( 1,3)
    LCD_Chr (1, 4, 3);       // Print the character Fig4.(3 in ASCII)  in pos (1,4)

    while (1) // infinite loop.
    {
    }
 }

بعد الترجمة والمحاكاة نحصل على النتيجة التالية :



طباعة المعلومات على LCD ، فى بعض الحالات قد تحتاج لتغيير خواص المؤشر cursor . لهذا ، فمن الممكن تغيير المؤشر بآخر غير ممتلىء أو ليس به تأثير الوميض ، بل يمكنك عدم إظهاره .
لتغيير خواص LCD يتم استخدام الدالة :

الكود:
  Lcd_Cmd (char out_char)  ; 

والتى تدخل ضمن أوامر الإعداد ، باستخدام البارامتر out_char .
لتغيير المؤشر بآخر غير ممتلىء فى شكل شرطة يتم استخدام الدالة :

الكود:
Lcd_Cmd (_LCD_UNDERLINE_ON) ;

ولتفعيل وميض المؤشر نستخدم الدالة :

الكود:
Lcd_Cmd (_LCD_BLINK_CURSOR_ON);

ولعدم إظهار المؤشر نستخدم الدالة :

الكود:
 Lcd_Cmd (_LCD_CURSOR_OFF);


Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الأربعاء يونيو 21, 2017 12:56 pm

تدريب :





الخطوات :
• تحديد حجم الخط Font size وليكن 5x7 .
• تحديد عنوان الذاكرة CGRAM address أى من 0 إلى 7 .
• تصميم حرفك الخاص بالنقر فوق مربعات شكل نموذج النقط .
• بعد ذلك يتم النقر على الزر Generate Code ، ثم نسخ الكود .
سوف تحصل على دالة لحفظ وعرض الحرف الخاص على وحدة LCD . عن طريق تغيير عنوان الذاكرة CGRAM يمكنك تخزين حتى 8 حروف خاصة فى ذاكرة وحدة LCD . فيما يلى كود البرنامج المعدل والذى سوف يخزن ويعرض 8 حروف خاصة على وحدة LCD .

الكود:
// Define LCD module connections.
sbit LCD_RS at RB2_bit;
 sbit LCD_EN at RB3_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 TRISB2_bit;
 sbit LCD_EN_Direction at TRISB3_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

const char character0[] = {0,0,10,31,31,14,4,0};
const char character1[] = {14,27,17,17,17,17,31,0};
const char character2[] = {14,27,17,17,17,31,31,0};
const char character3[] = {14,27,17,17,31,31,31,0};
const char character4[] = {14,27,17,31,31,31,31,0};
const char character5[] = {14,31,31,31,31,31,31,0};
const char character6[] = {0,4,2,31,2,4,0,0};
const char character7[] = {0,0,14,17,17,10,27,0};

void CustomChar0() {
  char i;
  Lcd_Cmd(64);// RAM address for the custom char. Next custom char it to be in RAM address 72 and so on.
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character0[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar1() {
  char i;
  Lcd_Cmd(72);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character1[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar2() {
  char i;
  Lcd_Cmd(80);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character2[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar3() {
  char i;
  Lcd_Cmd(88);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character3[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar4() {
  char i;
  Lcd_Cmd(96);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character4[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar5() {
  char i;
  Lcd_Cmd(104);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character5[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar6() {
  char i;
  Lcd_Cmd(112);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character6[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void CustomChar7() {
  char i;
  Lcd_Cmd(120);
  for (i = 0; i<=7; i++) Lcd_Chr_CP(character7[i]);
  Lcd_Cmd(_LCD_RETURN_HOME);
}

void main()  {
  Lcd_Init(); // Initialize LCD

  Lcd_Cmd(_LCD_CLEAR); // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

  //Send Custom Charactors to CGRAM
  CustomChar0();
  CustomChar1();
  CustomChar2();
  CustomChar3();
  CustomChar4();
  CustomChar5();
  CustomChar6();
  CustomChar7();
  //End

  //Display Custom Characters
  Lcd_Chr(1,1,0);
  Delay_ms(1000);
  Lcd_Chr(1,2,1);
  Delay_ms(1000);
  Lcd_Chr(1,3,2);
  Delay_ms(1000);
  Lcd_Chr(1,4,3);
  Delay_ms(1000);
  Lcd_Chr(1,5,4);
  Delay_ms(1000);
  Lcd_Chr(1,6,5);
  Delay_ms(1000);
  Lcd_Chr(1,7,6);
  Delay_ms(1000);
  Lcd_Chr(1,8,7);
  Delay_ms(1000);
}
 

Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في الجمعة يونيو 23, 2017 11:50 pm

استخدام مصفوفة لوحة المفاتيح matrix Using keyboards
تتطلب تطبيقات الميكروكونترولر فى بعض الحالات استخدام المفاتيح لإدخال البيانات العددية والوظائف وحتى حروف النصوص . الخيار الأكثر عمليا هو استخدام مصفوفة لوحة المفاتيح ، والتى تتكون من مفاتيح ضاغطة مرتبة فى صفوف rows وأعمدة columns ، لتقليل عدد التوصيلات الكهربائية . الشكل التالى يبين المظهر الطبيعى لمصفوفة لوحة مفاتيج 4X4 والدائرة المكافئة :



مصفوفة لوحة المفاتيح يمكن أن يكون لها أبعاد أكثر وفقا لحاجة المبرمج . يمكن تصنيع لوحات المفاتيح من غشاء مطاطى خاص ويوزع عليها رقم المفتاح لتلبى احتياجات المستخدم . مع ذلك فإن لوحة المفاتيح 4X4 تسمح لتكون واجهة كاملة بما يكفى للعديد من التطبيقات . عمل مصفوفة لوحة المفاتيح يتم بتفعيل واحد من الأربع أعمدة وفحص الصف الذى يتم تنشيطه ، هذه العملية تحدد المفتاح الذى تم ضغطه ، ويمكن الوصول إلى نفس النتيجة عن طريق عكس الأعمدة بالصفوف (تفعيل صف وفحص الأعمدة) .

يحتوى مترجم الميكروسى برو على مكتبة للتحكم وقراءة لوحة المفاتيح 4X4 ، هذه المكتبة بها ثلاثة دوال مخصصة لهذا الغرض .



دوال المكتبة التى تسمح باستخدام لوحة المفاتيح 4X4 هى :
الدالة الأولى :

الكود:
 void Keypad_Init (void);

• تستخدم هذه الدالة لتهيئة (إعداد) لوحة المفاتيح للاستخدام إعتمادا على المنفذ المصمم لهذا الغرض والذى تم إعلانه مسبقا .
• هذه الدالة لا تعود بشىء void ، وتتطلب إعلان المنفذ المعد لتوصيلها بصيغة محددة كما فى المثال التالى :

الكود:
// Keypad module connections
char keypadPort at PORTD;
// End of keypad module connections
...
Keypad_Init();



الدالة الثانية :

الكود:
  char Keypad_Key_Press(void);
Reads the key from keypad when key gets pressed.

• تستخدم هذه الدالة فى قراءة المفتاح من لوحة المفاتيح عندما ستم الضغط على المفتاح .
• هذه الدالة تقوم بإرجاع (العودة) كود المفتاح الذى تم الضغط عليه كقيمة من 0 إلى 16 ، قيمة الصفر (0) تعنى أن لم يتم الضغط على أى مفتاح ، والقيم من (1) إلى (16) تمثل 16 مفتاح متاح أى تقوم على الفور بإرجاع حالة المفتاح فى كل مرة يتم استدعاؤها . هذه الدالة تتطلب تهيئة منفذ توصيل لوحة المفاتيح .
مثال :

الكود:
char kp;
...
kp = Keypad_Key_Press();


الدالة الأخيرة :

الكود:
  char Keypad_Key_Click(void);

سلوك هذه الدالة مطابق للدالة السابقة ، والفرق الحيوى هو أنه إذا كشفت الدالة الضغط على المفتاح ، فإنها تعود بقيمته فقط عندما يتم تحرير هذا المفتاح أى أن الدالة تنتظر حتى يتم الضغط على مفتاح ما وتحريره .
إذا تم الضغط على أكثر من مفتاح فى نفس الوقت ، فإن الدالة سوف تنتظر حتى يتم تحرير جميع المفاتيح ، وبعد ذلك تعود بكود أول مفتاح تم الضغط عليه . هذه الدالة تتطلب تهيئة منفذ توصيل لوحة المفاتيح .
مثال :

الكود:
char kp;
...
kp = Keypad_Key_Click();

تدريب تمهيدى 1 :
لدراسة خواص لوحة المفاتيح ، سوف نستعرض مشروع جديد ببرنامج ISIS والذى يحتاج للأجهزة التالية : PIC16F877A, RES, BUTTON, LM016L . فقط يجب عليك إنشاء مشروع جديد بمترجم الميكروسى برو .
الشكل التالى يبين الدائرة الكهربية :



البرنامج التالى يقوم بقراءة لوحة المفاتيح وعرض نتيجة العودة على LCD . لهذا الهدف راقب وحلل البرنامج :


الكود:
// Declaration 4x4 keyboard port
char keypadPort at PORTC;

// Define pins for LCD.
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;
// Definition of TRIS registers for LCD.
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 (void)
{
   // Declaration of variables.
   unsigned short Key;
   char Text  [20];
   // Setup and initialization of PIC.
   Keypad_Init();                          // Initialize Keypad
   Lcd_init ();          // Initialize the LCD.
   Lcd_Cmd(_LCD_CLEAR);                    // Clear display
   Lcd_Cmd (_LCD_CURSOR_OFF);    // Turns off the cursor.
   Lcd_Out (1, 1, "Key");       // Print text.
   while (1)             // infinite loop.
   {
       Key = Keypad_Key_Press (); // It reads the keyboard and stores the result in key.
       ByteToStr (Key, Text);       // conversion from integer to text.
       Lcd_Out (2,1, Text);       // Display the value returned by the keyboard.
   }
}




المحاكاة : يمكنك مشاهدة القيم التى تعود عند الضغط على المفتاح ، الشكل التالى يبين أنه عند الضغط على المفتاح بالمسمى 8 فأن نتيجة العودة هى (10) وهى ترتيب المفتاح ، بينما عندما لا يكون هناك مفتاح مضغوط فتظهر قيمة العائد بصفر (0) .







لهذه الحالة المحددة بالمثال يتم مسح لوحة المفاتيح من اليسار إلى اليمين ومن أعلى إلى أسفل بدءا من المفتاح (1) ,إنتهاء بالمفتاح (D) . هذا يعنى أن عوائد دالة لوحة المفاتيح كما يلى :




تدريب تمهيدى 2 :
حتى هذه النقطة يمكنك قراءة لوحة المفاتيح كسلسلة من الأعداد ولكنها لا تكافىء المفتاح المضغوط ، لتصحيح هذا الوضع يجب تنفيذ دالة لفك شفرة القيم المعطاة بلوحة المفاتيح لكى تصبح حروف حقيقية لما تمثله المفاتيح . لهذا الهدف يتم عمل الدالة التالية عن طريق عبارة switch case لفك شفرة لوحة المفاتيح:

الكود:
 // Function to decode the keyboard.
char ReadKeyboard  (void)
{
// Switch case structure to assess the values returned
// by press keyboard.
   switch (Keypad_Key_Press ())
   {
      case 1: return ‘1’;
      case 2: return ‘2’;
      case 3: return ‘3’;
      case 4: return ‘A’;
      case 5: return ‘4"’;
      case 6: return ‘5’;
      case 7: return ‘6’;
      case 8: return ‘B’;
      case 9: return ‘7’;
      case 10: return ‘8’;
      case 11: return ‘9’;
      case 12: return ‘C’;
      case 13: return ‘*’;
      case 14: return ‘0’;
      case 15: return ‘#’;
      case 16: return ‘D’;
      default: return 0;    // button not pressed.
   }
}

برنامج هذا التطبيق يصبح كما يلى :


الكود:
// Declaration 4x4 keyboard port
 char keypadPort at PORTC;

 // Definition pins for LCD.
 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;
 // Definition of TRIS registers for LCD.
 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;
 // Function to decode the keyboard.
 char ReadKey (void)
 {
 // Switch case structure to assess the values ??returned
 // by press keyboard.
 switch (Keypad_Key_Press ())
 {
 case 1: return '1';
 case 2: return '2';
 case 3: return '3';
 case 4: return 'A';
 case 5: return '4';
 case 6: return '5';
 case 7: return '6';
 case 8: return 'B';
 case 9: return '7';
 case 10: return '8';
 case 11: return '9';
 case 12: return 'C';
 case 13: return '*';
 case 14: return '0';
 case 15: return '#';
 case 16: return 'D';
 default: return 0; // button not pressed.
 }
 }

void main (void)
 {
    // Declaration of variables.
    char key;
    // Setup and initialization of PIC.
   Keypad_Init();                          // Initialize Keypad
    Lcd_init ();          // Initialize the LCD.
   Lcd_Cmd(_LCD_CLEAR);                    // Clear display
    Lcd_Cmd (_LCD_CURSOR_OFF);    // Turns off the cursor.
    Lcd_Out (1, 1, "key");       // Print text.
    while (1)             // infinite loop.
    {
        Key = ReadKey ();       // It reads the keyboard and its result is stored in key.
        Lcd_Chr (2,1, key);       // Display the value returned by the keyboard.
    }
 }

بمجرد التحرير يتم الترجمة والمحاكاة حيث يعرض على الشاشة الحرف المقابل للمفتاح المضغوط بلوحة المفاتيح كما فى الشكل التالى :





Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 24, 2017 11:55 am

تدريب تمهيدى 3 ، مثال مكتبة keypad بالمترجم ميكروسى برو :
فيما يلى مثال بسيط على استخدام مكتبة لوحة المفاتيح ، وهو يدعم لوحة المفاتيح مع من 1 إلى 4 صف و من 1 إلى 4 عامود . عائد الدالة Keypad_Key_Click() هو عدد فى المدى من 1 إلى 16 . فى هذا المثال يتم تحويل عائد الدالة إلى كود أسكى (0….9,A…F) والعرض على وحدة العرض LCD ، فى الصف الأول . بالإضافة إلى عرض عدد مرات الضغط على المفتاح ، فى الصف الثانى لوحدة العرض LCD ، من خلال متغير العداد بسعة بايت .

البرنامج :

الكود:
unsigned short kp, cnt, oldstate = 0;
char txt[6];

// Keypad module connections
char  keypadPort at PORTC;
// End Keypad module connections

// 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

void main() {
  cnt = 0;                                      // Reset counter
  Keypad_Init();                                 // Initialize Keypad                             
  Lcd_Init();                                   // Initialize LCD
  Lcd_Cmd(_LCD_CLEAR);                       // Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF);                // Cursor off
  Lcd_Out(1, 1, "Key  :");                      // Write message text on LCD
  Lcd_Out(2, 1, "Times:");

  do {
    kp = 0;                                      // Reset key code variable

    // Wait for key to be pressed and released
       do
        // kp = Keypad_Key_Press();          // Store key code in kp variable
         kp = Keypad_Key_Click();            // Store key code in kp variable
       while (!kp);
  // Prepare value for output, transform key to it's ASCII value
    switch (kp) {
      case  1: kp = 49; break; // 1       
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      case  4: kp = 65; break; // A
      case  5: kp = 52; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      case  8: kp = 66; break; // B       
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      case 12: kp = 67; break; // C
      case 13: kp = 42; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 35; break; // #
      case 16: kp = 68; break; // D

    }

    if (kp != oldstate) {                  // Pressed key differs from previous
      cnt = 1;
      oldstate = kp;
      }
    else {                                // Pressed key is same as previous
      cnt++;
      }

    Lcd_Chr(1, 10, kp);                    // Print key ASCII value on LCD

    if (cnt == 255) {                      // If counter varialble overflow
      cnt = 0;
      Lcd_Out(2, 10, "  ");
      }

    WordToStr(cnt, txt);                  // Transform counter value to string
    Lcd_Out(2, 10, txt);                  // Display counter value on LCD
  } while (1);
}
 

النتيجة :



Admin
Admin

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

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

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

رد: ما هو الميكروكونترولر Microcontroller ؟

مُساهمة من طرف Admin في السبت يونيو 24, 2017 1:30 pm

مشروع قفل إلكترونى بسيط بكلمة سر محددة مسبقا :



لوحة المفاتيح الرقمية تستخدم فى كثير من المجالات ، من أنظمة الأمان وحتى التليفونات المحمولة . فى هذا المشروع سوف نستخدم لوحة مفاتيح 4x3 لإدخال كلمة المرور password ، إذا كانت كلمة المرور صواب يتم فتح القفل الإلكترونى .
الدائرة الكهربية :




فى هذا المشروع سوف نستخدم الميكروكونترولر PIC16F877A ، والذى يعمل على تردد 4MHz . فى البداية يطلب إدخال كلمة المرور والتى تم تحديدها فى البرنامج مسبقا ، وهى “2345” والتى تم حفظها فى مصفوفة السلسلة pass . إذا تطابقت كلمة المرور التى يقوم المستخدم بإدخالها مع كلمة المرور المحددة مسبقا سوف يتم تشغيل ريلاى لمدة 10 ثوانى ، أما إذا لم يكن هناك تطابق بينهما ، غير صواب ، يتم طلب إدخال كلمة المرور مرة أخرى . البرنامج بسيط ويمكن فهمه بسهولة . يجدر ملاحظة أنه قد تم استخدام عبارة switch-case هنا لتحويل القيم من لوحة المفاتيح (1,2,3….16) إلى مكافىء كود أسكى حتى نتمكن من عرضها على وحدة العرض LCD ، هناك طرق أخرى لتنفيذ هذا التحويل . أيضا لعلك لاحظت ترتيب أطراف التوصيل ، يجب توصيل الأعمدة بالأطراف (0,1,2,3) للمنفذ المستخدم ، وتوصيل الصفوف بالأطراف (4,5,6,7) لنفس المنفذ ، فى حالة لوحة المفاتيح 4X3 لا يوجد عامود رابع ويترك طرفه بدون توصيل .

البرنامج :

الكود:
// LCD connections
sbit LCD_RS at RB2_bit;
sbit LCD_EN at RB3_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 TRISB2_bit;
sbit LCD_EN_Direction at TRISB3_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;
//=================================
char password[4],i=0,j=7,kp=0;
const char pass[5]="2345"; //The password was set at 2345.
char  keypadPort at PORTD; // The keypad will be connected to the PORTD.

void main() {
trisb.f0=0;
portb.f0=0;

Keypad_Init();                          // Keypad Set up.
Lcd_Init();                              // LCD Set up .

Lcd_Cmd(_LCD_CLEAR);                    // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF);                // Close the cursor.
Lcd_out(1,1,"Enter Password:");
lcd_out(2,7,"____");
while(1)
{
kp=0;
   while(kp==0)         // Continuously scans keys when no key is pressed.
   {
      kp=Keypad_Key_Click();   //Press the keypad to get the value.
      delay_ms(10);         // 10ms delay .
   }

   switch (kp) {   // ASCII conversion is done (eg ASCII code 49 which corresponds to 1 character).
      case  1: kp = 49; break; // 1
      case  2: kp = 50; break; // 2
      case  3: kp = 51; break; // 3
      //case  4: kp = 65; break; // A      
      case  5: kp = 52; break; // 4
      case  6: kp = 53; break; // 5
      case  7: kp = 54; break; // 6
      //case  8: kp = 66; break; // B
      case  9: kp = 55; break; // 7
      case 10: kp = 56; break; // 8
      case 11: kp = 57; break; // 9
      //case 12: kp = 67; break; // C
      case 13: kp = 42; break; // *
      case 14: kp = 48; break; // 0
      case 15: kp = 35; break; // #
      //case 16: kp = 68; break; // D
   }

   lcd_chr(2,j,'*');
   j++;
   if(j==11)j=7;
   
   password[i]=kp;
   i++;
   if(i==4)
   {
      i=0;
      if(password[0]==pass[0] && password[1]==pass[1] && password[2]==pass[2] && password[3]==pass[3])
      // If the password is correct, it will ON the relay for 10 seconds ...
      {
         portb.f0=1;
         
          Lcd_Cmd(_LCD_CLEAR);
         lcd_out(1,1,"Password is :");
         lcd_out(2,1,"correct!");
         delay_ms(10000);
         
         Lcd_Cmd(_LCD_CLEAR);                    // Clear LCD
         Lcd_out(1,1," Enter Password:");
         lcd_out(2,7,"____");
         portb.f0=0;
      }
      else              // If the password is wrong, ask for the password again ...
      {
      Lcd_Cmd(_LCD_CLEAR);
      Lcd_Out(1,1," Wrong password!");
      portb.f7=0;
      delay_ms(2000);
      Lcd_out(1,1," Enter Password:");
      lcd_out(2,7,"____");
      }
   }
}
}
 

النتيجة :





Admin
Admin

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

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

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

صفحة 3 من اصل 3 الصفحة السابقة  1, 2, 3

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

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

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