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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 23-06-2017, 11:38 PM المشاركة 1   
افتراضي استخدام مصفوفة لوحة المفاتيح matrix Using keyboards Twitter FaceBook Google+



استخدام مصفوفة لوحة المفاتيح 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.
 	}
 }
بمجرد التحرير يتم الترجمة والمحاكاة حيث يعرض على الشاشة الحرف المقابل للمفتاح المضغوط بلوحة المفاتيح كما فى الشكل التالى :






التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 23-06-2017 الساعة 11:53 PM
احصائية الشكر والاعجاب - 2 شكراً, 0 عدم اعجاب, 2 اعجاب
شكراً سعيد قادر, عريبى محمود ( شكر العضو على هذه المشاركة )
اعجاب سعيد قادر, عريبى محمود ( أعجبته المشاركة )
اعلانات

abu-thabit
:: مهندس متميز ::
تاريخ التسجيل: Oct 2010
المشاركات: 339
نشاط [ abu-thabit ]
قوة السمعة:0
قديم 24-06-2017, 05:56 AM المشاركة 2   
افتراضي


هل الكيبور keyboard هي نفسها الكي باد keypad ؟

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 24-06-2017, 10:57 AM المشاركة 3   
افتراضي


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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 24-06-2017, 11:40 AM المشاركة 4   
افتراضي


تدريب تمهيدى 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);
}
النتيجة :




الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 24-06-2017, 01:29 PM المشاركة 5   
افتراضي


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



لوحة المفاتيح الرقمية تستخدم فى كثير من المجالات ، من أنظمة الأمان وحتى التليفونات المحمولة . فى هذا المشروع سوف نستخدم لوحة مفاتيح 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,"____");
		}
	}
}
}
النتيجة :





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

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

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

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


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

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