ربط الميكروكونترولر PIC16F877A مع لوحة مفاتيح Keypad ووحدة عرض LCD

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

ربط الميكروكونترولر PIC16F877A مع لوحة مفاتيح Keypad ووحدة عرض LCD

مُساهمة من طرف Admin في السبت أبريل 25, 2015 9:50 am

ربط الميكروكونترولر PIC16F877A مع لوحة مفاتيح Keypad ووحدة عرض LCD
سوف نستعرض كيفية قراءة مدخلات لوحة مفاتيح نوع 3X4 وكتابة النتيجة على وحدة عرض LCD ، الطريقة سهلة وبسيطة .

لوحة المفاتيح Keypad :
لوحة المفاتيح هى مصفوفة matrix من المفاتيح الضاغطة مرتبة فى صفوف وأعمدة لتوفير مدخلات المستخدم ، الشكل التالى يبين المخطط الأساسى للوحة المفاتيح نوع 3X4 :



كما فى المخطط ، تتكون لوحة المفاتيح من ثلاثة أعمدة columns وأربعة صفوف rows ، ومن هنا جاء الاسم ، عندما يضغط المستخدم على أحد مفاتيح اللوحة يحدث قصر (توصيل) بين العامود والصف المناظر لهذا المفتاح ، على سبيل المثال ، إذا ضغط المستخدم المفتاح “5” يدث قصر بين العامود الثانى col2 والصف الثانى row2 ، وإذا ضغط المستخدم على المفتاح “0” يحدث قصر بين العامود الثانى col2 والصف الرابع row4 ، وهلم جرا .

استخدام المترجم CCS C لقراءة لوحة المفاتيح :
يوفر المترجم CCS C مكتبة لقراءة لوحة المفاتيح تسمى kbd.c ، كل ما عليك القيام به هو ضم هذه المكتبة فى برنامجك (#include <kpd.c>) ، واستخدام الدالة kbd_getc(); لمسح لوحة المفاتيح .
المكتبة kbd.c تستخدم المنفذ Port D أو المنفذ Port B لربط لوحة المفاتيح كما هو مبين بالدائرة المبينة أدناه .
ملحوظة :
الدالة kbd_getc(); تعود بكود أسكى للمفتاح المضغوط ( تعود بحرف character) .

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




البرنامج :

الكود:


/* PIC16F877A interface to 3x4 Keypad and 16x2 LCD */
#include <16f877a.h>
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>
#include <kbd.c>

void main()
{
  char k=0;                    // Character k to store keypad input
 
  /* Peripherals Configurations */
  lcd_init();                  // Turn LCD ON, along with other initialization commands
  kbd_init();                  // Initialize Keypad
   
  lcd_gotoxy(1,1);              // point LCD cursor to col1 row1
  lcd_putc("Hello World !!");  // print on LCD
  lcd_gotoxy(1,2);              // point LCD cursor to col1 row2

  while(TRUE) // infinite loop
  {
      k = kbd_getc();            // read keypad input (if exists)
      if(k!=0)                  // if key captured
      {
        lcd_putc(k);            // print captured key to lcd
        k=0;                    // reset k for another loop round
        delay_ms(250);          // delay between key presses
      }
  }
}


Admin
Admin

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

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

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

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


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