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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 25-04-2011, 02:47 PM المشاركة 1   
افتراضي تفاصيل مكتبة لوحة المفاتيح والتدريب على استخدامها Keypad Library Twitter FaceBook Google+



مكتبة لوحة المفاتيح والتدريب على استخدامها Keypad Library
يوفر المترجم mikroC PRO مكتبة للعمل بلوحة مفاتيح 4x4 keypad (أربعة صفوف وأربعة أعمدة) .
يمكن أيضا استخدام روتينات المكتبة مع لوحات المفاتيح 4x1, 4x2, 4x3 .
الشكل التالى يبين توصيل لوحة المفاتيح :







التوابع الخارجية لمكتبة لوحة المفاتيح :

اعلانات

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


التوابع الخارجية لمكتبة لوحة المفاتيح :
فى جميع المشاريع التى تستخدم لوحة المفاتيح يجب تعريف منفذ توصيل لوحة المفاتيح على سبيل المثال التوصيل بالمنفذ PORTD يستخدم التعبير (الأمر) :


كود:
char keypadPort at PORTD ;

دوال أو روتينات المكتبة :

1- الدالة أو الروتين Keypad_Init " إعداد أو تهيئة لوحة المفاتيح للبدء"
  • نموذج لصيغة كتابة الدالة
كود:
void Keypad_Init(void);
  • العائدات : لا يوجد .
  • الغرض (الوصف) : إعداد (تهيئة) المنفذ لبدء العمل مع لوحة المفاتيح .
  • المطالب : يجب تعريف المتغير keypadPort قبل استخدام الدالة .
مثال :







2- الدالة أو الروتين Keypad_Key_Press " الضغط على مفتاح من لوحة المفاتيح "
  • نموذج لصيغة كتابة الدالة :
كود:
char Keypad_Key_Press(void);
  • العائدات : كود رقم المفتاح الذى تم الضغط عليه (1..16). وإذا لم يكن هناك أى مفتاح مضغوط فإن العائد يكون بصفر (0) .
  • الغرض (الوصف) : قراءة حالة مفتاح من لوحة المفاتيح عندما يتم الضغط عليه .
  • المطالب : يجب إعداد المنفذ وتهيئة لوحة المفاتيح .
مثال :






3- الدالة أو الروتين Keypad_Key_Click "النقر على مفتاح من لوحة المفاتيح "
  • نموذج لصيغة كتابة الدالة :
كود:
char Keypad_Key_Click(void);
  • العائدات : كود رقم المفتاح الذى تم النقر عليه (1..16). وإذا لم يكن هناك أى مفتاح تم النقر عليه فإن العائد يكون بصفر (0) .
  • الغرض (الوصف) : تظل الدالة فى حالة إنتظار حتى يتم النقر على مفتاح (الضغط ثم التحرير ) . عند التحرير تعود الدالة بالعائد وهو من 1 إلى 16 تبعا للمفتاح .إذا تم الضغط على أكثر من مفتاح فى نفس الوقت فسوف تنتظر الدالة حتى يتم تحرير جميع المفاتيح وبعد ذلك تعود الدالة بكود رقم أول مفتاح تم الضغط عليه .
  • المطالب : يجب إعداد المنفذ وتهيئة لوحة المفاتيح .
مثال :






التدريب على لوحة المفاتيح :

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:328
قديم 25-04-2011, 02:59 PM المشاركة 3   
افتراضي


التدريب على لوحة المفاتيح :

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


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


كود:
// PIC16F877*4MHz unsigned short kp, cnt, oldstate = 0; char txt[6]; // Keypad module connections char keypadPort at PORTD; // 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_Click(); // Store key code in kp variable Delay_ms(10);} //wait a bit while (!kp); // Prepare value for output, transform key to it's ASCII value switch (kp) {
case 1: kp = 49; break; // 1 // Uncomment this block for keypad4x4 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); }


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


التعليق على البرنامج :
يتناول هذا التدريب مشروع لربط لوحة مفاتيح 4X4 (أربعة صفوف وأربعة أعمدة) بالميكروكونترولر PIC16F877A باستخدام مكتبة دوال الروتينات المتوفرة بالمترجم mikroc PRO . هذه الروتينات تجعل البرمجة أكثر سهولة .
التقنية الأساسية هى جعل الأعمدة columns كمداخل input ثم تشغيل الصفوف rows كمخارج outputوعملية قراءة لوحة المفاتيح هذه تسمى بعملية "المسح" scanning .
لكشف أى المفاتيح هو المضغوط من ضمن مجموعة الصفوف والأعمدة ( تسمى ماتريكس matrix) نجعل خطوط الصف فى الحالة المنخفضة (كمخارج) واحدا تلو الآخر ويتم قراءة حالة الأعمدة (كمداخل) . فإذا كان أى مفتاح فى الصف الأول مضغوط فسوفيجعل العامود المناظر منخفضا أى أن إذا كان المفتاح الثانى فى الصف الأول هو المضغوط عندئذ يعطى العامود الثانى (كرقم المفتاح) الحالة المنخفضة . بهذه الطريقة نعرف أن المفتاح الثانى key 2 بالصف الأول ROW1 هو الذى تم الضغط عليه . وهذه هى طريقة عمل المسح .
لمسح لوحة المفاتيح بالكامل نحتاج لجعل الصفوف منخفضة صف تلو الآخر وقراءة الأعمدة فى كل مرة .
هذه العملية هى ما تقوم به نيابة عنك الدالة Keypad_Key_Click() والتى سوف نستخدمها وبمجرد أن نحصل على رقم مفتاح نقارنه بقيمة أسكى للحصول على المفتاح الصحيح .


1- إعلان المتغيرات :kp, cnt, oldstate وتخصيص قيمة صفر للمتغير oldstate = 0.ثم إعلان متغير مصفوفة صف من 6 عناصر باسم text (سوف نرى أنه يتم عرضه على الشاشة فى الصف الثانى بدءا من العامود العاشر ) .

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


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


1- تحديد توصيلات لوحة المفاتيح بالمنفذ PORTD حسب التوصيل المتفق عليه ليتلائم روتينات مكتبة لوحة المفاتيح حتى تتعامل معها بطريقة صحيحة .

كود:
// Keypad module connections char keypadPort at PORTD; // End Keypad module connections


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


1- تحديد توصيلات وحدة العرض LCD بالمنفذ PORTB حتى تتعامل معها مكتبتها بطريقة صحيحة .

كود:
// 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


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


1- بداية الدالة الرئيسية

كود:
void main() {
· تصفير متغير العداد cnt
كود:
cnt = 0; // Reset counter
· تهيئة لوحة المفاتيح للبدء .

كود:
Keypad_Init(); // Initialize Keypad
· · تهيئة وحدة العرض LCD للبدء .


كود:
Lcd_Init(); // Initialize LCD
· مسح الشاشة .
كود:
Lcd_Cmd(_LCD_CLEAR); // Clear display
· عدم إظهار المؤشر .
كود:
 
Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

إضافة رد

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

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

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


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

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