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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:32 PM المشاركة 89   
افتراضي



عملية الانتخاب Multiplexing :
عادة تميز شرائح وحدة العرض بالحروف من a إلى gولكن لا توجد قاعدة تشير إلى طرف
الميكروكونترولر الذى يجب أن توصل به . لهذا السبب من المهم جدا التأكد من التوصيل قبل بدء كتابة البرنامج أو تصميم الجهاز.
تحتل وحدات العرض المتصلة بالميكروكونترولر عدد كبير من أطراف المداخل / المخارج I/O pins المتاحة وهو ما يمكن أن يكون مشكلة كبيرة خصوصا عندما يكون هناك حاجة لعرض أعداد ذات أرقام (خانات) متعددة. هذه المشكلة لها حل يسمى عملية "الانتخاب من متعدد " Multiplexing .تعتمد هذه الطريقة فى عملها على مبدأ الخداع البصري مثل ما يحدث عند عمل فيلم مصور بالكاميرا . رقم digit (خانة)واحد فقطهو الذى يكون فعال (نشط) فى لحظة ما , ويتم تغيرحالة الأرقام بسرعةبحيث تترك إنطباع عند المشاهد بأنجميعأرقامالعددنشطة (فعالة) في وقت واحد.





ففى الشكل السابق :
أولا يتم توصيل البايت byte الذى يمثل رقم خانة الآحاد إلى منفذ الميكروكونترولر المتصل بالشرائح السبعة وفى نفس الوقتيكون الترانزستور T1 فى حالة توصيل ON. بعد برهة يتحول الترانزستور T1 إلى حالة الفصل OFF , عندئذ يتم توصيل البايت الذى يمثل رقم خانة العشرات إلى منفذ الميكروكونترولر المتصل بالشرائح السبعة وفى نفس الوقت يتحول الترانزستور T2 إلى حالة التوصيل ON . هذه العملية تتكرر دوريا بسرعة عالية لجميع الأرقام والترانزستورات المقابلة.
والواقع المخيب للآمال هو أن الميكروكونترولر هو مجرد نوع من الكمبيوترالمصغر مصمم فقط لفهم لغة الآحاد والأصفار والتى يجب أن نعبر بها عن الأرقام المطلوب عرضها . بعبارة أخرى الميكروكونترولر لا يفهم معنى خانة الآحاد أو خانة العشرات أو المئات ولا الأرقام العشرية التى نستخدمها .
لذلك يجب أن يمر كل رقم نريد عرضه بالخطوات التالية :
  • فى البداية يتم تقسيم العدد المتعدد الأرقام إلى آحاد و عشرات و مئات وتخزن كل بيانات خانة فى بايت خاص بها .
  • يتم جعل الأرقام فى شكل قابل للتعرف عليها بإجراء عملية تسمى "إخفاء" أو "عمل قناع" "masking" , أوبعبارة أخرى، يتم استبدال الشكل الثنائي لكل رقم بمجموعة مختلفة من البتات باستخدام برنامج فرعى بسيط . على سبيل المثال الرقم الثنائى (0000 1000) يتم استبداله برقم بشكل ثنائي آخر هو0111 1111) ) من أجل تفعيل جميع ليدات عرض الرقم 8. الليد الوحيد الذى يكون غير فعال فى هذه الحالة محجوز للفاصلة العشرية . بمعنى آخر الرقم 8 معروف بأنه رقم عشرى والرقم الثنائى (0000 1000) معروف أيضا أنه يكافئه ولكن الرقم 0111 1111) ) مكون من آحاد وأصفار وعند توصيله إلى الشرائح (الدايودات) وكان منفذ الميكروكونترولر متصل بوحدة العرض بطريقة بحيث أن الخانة bit0 تنشط الشريحة a والخانة bit1 تنشط الشريحة b والخانة bit2 تنشط الشريحة c وهكذا , عندئذ فإن هذا الرقم سوف يؤدى إلى عرض الرقم 8 على وحدة العرض لذلك يسمى هذا الرقم بالرقم المقنع أو المتنكر .

الشكل التالى يبين الرقم 5 العشرى والرقم الثنائى المكافىء له (00000101) ثم الرقم المقنع الذى يجب أن يظهر الرقم 5 على وحدة العرض ذات السبع شرائح .



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



بالإضافة إلى الأرقام من 0 إلى 9 يوجد الحروف A, C, E, J, F, U, H, L, b, c, d, o, r, t
والتى يمكن أيضا عرضها عن طريق عمل القناع المناسب .
فى حالة استخدام وحدة عرض نوع الآنود المشترك فإن جميع الآحاد 1 فى الجدول السابق يجب استبدالها
بأصفار 0 والعكس بالعكس . بالإضافة إلى تغير نوع الترانزستور إلى PNP .

اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:36 PM المشاركة 90   
افتراضي


التدريبات :
الدائرة الكهربية للتجارب :
هذه الدائرة هى جزء من وحدة التجارب العملية QL200 والخاصة بوحدات العرض 7 Segment وهى :
· من نوع الأنود المشترك common anode .
· يتصل الأنود المشترك لكل وحدة بمجمع ترانزستورتحكم نوع PNP ويتصل مشعه بالجهد الموجب وتتصل قاعدته بطرف من أطراف المنفذ PORTA بالميكروكونترولر للتحكم لتوصيل وفصل الوحدة
· كاثودات ليدات الشرائح تتص ببعضها على التوازى وموصلة بالمنفذ PORTD .
· ترقم الوحدات من اليسار إلى اليمين وتسمى DIG1 إلى DIG6 على الترتيب .


الدائرة الكهربية ببرنامج Proteus :

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:39 PM المشاركة 91   
افتراضي


التدريب الأول :
الغرض :
التدريب على إنشاء كود مناظر لرقم أو حرف بغرض عرضه على العرض 7 segment .
البرنامج :
كود:
/* Seven segment display Tutorials * Project name: Tutorial 1 Basic method for display basic numbers 0,1,2...9 On : common anode Seven segment display * Description: This code demonstrates how to display number(0-9) on one 7-segment display (common anode). Display is connected to PORTD (RD0..RD7, segment A to RD0, segment B to RD1, etc); common anode is connected to the pin RA0 on PORTA. Number is incremented every 1s. * Test configuration: MCU: PIC16F877A Oscillator: XT, 04.0000 MHz SW:mikroC PRO for PIC ENG.F.ABDELAZIZ http://www.eeecb.com/vb/index.php */ //1- Define seven segment connections sbit seg_a at RD0_bit; sbit seg_b at RD1_bit; sbit seg_c at RD2_bit; sbit seg_d at RD3_bit; sbit seg_e at RD4_bit; sbit seg_f at RD5_bit; sbit seg_g at RD6_bit; //2- Declaratins unsigned short count=0; // Variable (0-255) for switch-case statement void main() { //3- Initialization ADCON1=0X07; //set A PORT general I/O TRISD = 0b00000000; // PORTD All Outputs PORTD=0xFF; //All segment off ( high on cathode) TRISA=0; //PORTD All Outputs PORTA.B0=0; //High pin >>>PNP transistirs off & 0>>on // Endless loop do { switch (count) {// At first count =0 s0>>>case 0 : case 0 : seg_a=0; seg_b=0; seg_c=0; seg_d=0; seg_e=0; seg_f=0; seg_g=1; //Display "0" 0>>on & 1>>off break; //exit after execution to count ++ case 1 : seg_a=1; seg_b=0; seg_c=0; seg_d=1; seg_e=1; seg_f=1; seg_g=1; //Display "1" break; case 2 : seg_a=0; seg_b=0; seg_c=1; seg_d=0; seg_e=0; seg_f=1; seg_g=0; //Display "2" break; case 3 : seg_a=0; seg_b=0; seg_c=0; seg_d=0; seg_e=1; seg_f=1; seg_g=0; //Display "3" break; case 4 : seg_a=1; seg_b=0; seg_c=0; seg_d=1; seg_e=1; seg_f=0; seg_g=0; //Display "4" break; case 5 : seg_a=0; seg_b=1; seg_c=0; seg_d=0; seg_e=1; seg_f=0; seg_g=0; //Display "5" break; case 6 : seg_a=01; seg_b=1; seg_c=0; seg_d=0; seg_e=0; seg_f=0; seg_g=0; //Display "6" break; case 7 : seg_a=0; seg_b=0; seg_c=0; seg_d=1; seg_e=1; seg_f=1; seg_g=1; //Display "7" break; case 8 : seg_a=0; seg_b=0; seg_c=0; seg_d=0; seg_e=0; seg_f=0; seg_g=0; //Display "8" break; case 9 : seg_a=0; seg_b=0; seg_c=0; seg_d=1; seg_e=1; seg_f=0; seg_g=0; //Display "9" break; } //case end count ++; // increased by one : 0>>>1 if(count ==10) count =0; // Test : if end (9) then at count=10 >>> begin again (0) Delay_ms(1000); // Wait for 1 sec before updating the display } while(1); // Infinite Loop }

النتائج :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:44 PM المشاركة 92   
افتراضي


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



البرنامج :


كود:
/* 
Seven segment display Tutorials
Tutorial 2
Modified method for display basic numbers 0,1,2...9
Seven segment display : common anode
 * Description:
     This code demonstrates how to display number(0-9) on one 7-segment display
     (common ANODE). Display is connected to PORTD (RD0..RD7, segment A to
     RD0, segment B to RD1, etc); common ANODE connected to the pin RA0 on
     PORTA. 
     Number is incremented every 1s.
 * Test configuration:
     MCU:  PIC16F877A 
     Oscillator:      XT, 04.0000 MHz
     Ext. Modules:    -
     SW:mikroC PRO for PIC

ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/
// Returns mask for common cathode 7-seg. display
unsigned short mask(unsigned short num) {
  switch (num) {
    case 0 : return 0xC0;
    case 1 : return 0xF9;
    case 2 : return 0xA4;
    case 3 : return 0xB0;
    case 4 : return 0x99;
    case 5 : return 0x92;
    case 6 : return 0x82;
    case 7 : return 0xF8;
    case 8 : return 0x80;
    case 9 : return 0x90;
  } //case end
}//~

unsigned short i;

void main() {
ADCON1=0X07;                               //set A PORT general I/O
  PORTA  = 0xFF;
  TRISA  = 0;
  PORTD  = 0xFF;
  TRISD  = 0;

  do {
    for (i = 0; i <= 9u; i++) {
     PORTD = mask(i);           // bring appropriate value to PORTD
      PORTA = 0;                 // turn on appropriate 7seg. display
      Delay_ms(1000);
    }
  } while (1);                   //endless loop
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:47 PM المشاركة 93   
افتراضي


التدريب الثالث : عرض رقمين 0-99 :
البرنامج :


كود:
/*
 * Project name:
Tutorial 3
    Decimal UP Counter with two 7-Segment Display Multiplexing

 * Description:
     This code is an example of multiplexed Seven Segment Displays.
     MCU:  PIC16F877A, 4.0 MHz  clock
     The common anodes of two seven segment dispalys are
     connected to RA0, RA1 whereas the seven
     segments are driven through PORTD pins
MikroC PRO
ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/

unsigned short i, DD0, DD1; 
unsigned int Count;

//-Function to Return mask for common anode 7-seg. display
unsigned short mask(unsigned short num) {
 switch (num) {
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xF8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 } //case end
}
void main() {
  ADCON1=0X07;        //set A PORT general I/O
  TRISD = 0; // Set PORTB direction to be output
  PORTD = 0xFF;    // Turn OFF LEDs on PORTD
  TRISA = 0; 
  Count   =    0;  // Initial Value of Counter

  do {
  DD0 = Count%10;  // Extract Ones Digit
  DD0 = mask(DD0);

  DD1 = (Count/10)%10; // Extract Tens Digit
  DD1 = mask(DD1);

  for (i = 0; i<=100; i++) {

      PORTD = DD0; // Data for ones Digit
      RA0_bit = 1;      
      RA1_bit = 0;// Select Ones Digit
            delay_ms(5);

      PORTD = DD1;//Data for Tens Digit
      RA0_bit = 0;// Select Tens Digit
      RA1_bit = 1;     
      delay_ms(5);

      }

      Count = Count + 1 ;

      if (Count > 99) Count = 0;

  } while(1);          // endless loop
}



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:49 PM المشاركة 94   
افتراضي


التدريب الرابع :
عرض أربعة أرقام :

البرنامج :


كود:
/*
 * Project name:
Tutorial4
    Decimal UP Counter with Four 7-Segment Display Multiplexing
  * Description:
     This code is an example of multiplexed Seven Segment Displays.
     MCU:  PIC16F877A, 4.0 MHz  clock
     The common anodes of four seven segment dispalys are
     connected to RA0, RA1, RA2 and RA3, whereas the seven
     segments are driven through PORTD pins
MikroC PRO
ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/

unsigned short i, DD0, DD1, DD2, DD3; 
unsigned int Count;

//------ Function to Return mask for common anode 7-seg. display
unsigned short mask(unsigned short num) {
 switch (num) {
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xF8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 } //case end
}
void main() {
  ADCON1=0X07;        //set A PORT general I/O
  TRISD = 0; // Set PORTB direction to be output
  PORTD = 0xFF;    // Turn OFF LEDs on PORTD
  TRISA = 0; 
  Count   =    0;  // Initial Value of Counter

  do {
  DD0 = Count%10;  // Extract Ones Digit
  DD0 = mask(DD0);
  DD1 = (Count/10)%10; // Extract Tens Digit
  DD1 = mask(DD1);
  DD2 = (Count/100)%10; // Extract Hundreds Digit
  DD2 = mask(DD2);
  DD3 = (Count/1000);  // Extract Thousands Digit
  DD3 = mask(DD3);

  for (i = 0; i<=50; i++) {
      PORTD = DD0; // Data for ones Digit
      RA0_bit = 1;      
      RA1_bit = 1;
      RA2_bit = 1;
      RA3_bit = 0;// Select Ones Digit
      delay_ms(5);
      PORTD = DD1;//Data for Tens Digit
      RA0_bit = 1;
      RA1_bit = 1;     
      RA2_bit = 0;// Select Tens Digit
      RA3_bit = 1;
      delay_ms(5);
      PORTD = DD2;//Data for Hundred Digit
      RA0_bit = 1;
      RA1_bit = 0;// Select Hundreds Digit
      RA2_bit = 1;     
      RA3_bit = 1;
      delay_ms(5);
      PORTD   = DD3;//Data for Thousands Digit
      RA0_bit = 0;// Select Thousands Digit
      RA1_bit = 1;
      RA2_bit = 1;
      RA3_bit = 1;     
      delay_ms(5);
      }

      Count = Count + 1 ;

      if (Count > 9999) Count = 0;

  } while(1);          // endless loop
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:51 PM المشاركة 95   
افتراضي


التدريب الخامس :
استخدام المؤقت Timer0 فى عملية الانتخاب

البرنامج :


كود:
/*
Tutorial 5:
In this project two common anode 7-segment LED displays are connected to
PORTD of a PIC16F877A  microcontroller and the microcontroller is operated
from a 4MHz resonator. 
Digit 1 (left digit) enable pin is connected to port pin RA0
and digit 2 (right digit) enable pin is connected to port pin RA1 of the microcontroller.
The program counts up from 0 to 99 with one second delay between each count.
The display is updated in a timer interrupt service routine at every 5ms by :
Reload TMR0=100 & prescaler ration 1:32>> imer interrupt service routine at
 (255-100) *32us=5ms = scanning time
MikroC PRO
ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/

#define DIGIT1 PORTA.F0 //tens unit
#define DIGIT2 PORTA.F1//ones unit

//Global variable 
unsigned char Cnt = 0;
unsigned char Flag = 0;

//-Function to Return mask for common anode 7-seg. display
unsigned short mask(unsigned short num) {
 switch (num) {
 case 0 : return 0xC0;
 case 1 : return 0xF9;
 case 2 : return 0xA4;
 case 3 : return 0xB0;
 case 4 : return 0x99;
 case 5 : return 0x92;
 case 6 : return 0x82;
 case 7 : return 0xF8;
 case 8 : return 0x80;
 case 9 : return 0x90;
 } //case end
}


// TMR0 timer interrupt service routine. The program jumps to the ISR at every 5ms.
void interrupt ()
{

//Local variable
unsigned char Msd, Lsd; // Msd =tens= DD1 left unit &Lsd=ones=DD2 right unit

TMR0 = 100; // Re-load TMR0>>255-100=155usx32(prescaler)=5ms 

INTCON = 0x20; // >>>>Set T0IE and clear T0IF<<<<

Flag = ~ Flag; // Toggle Flag as switch 

if(Flag == 0) // Do digit 1
{
DIGIT2 = 1;// Disable digit 2
Msd = Cnt / 10; // MSD digit >>tens
PORTD = mask(Msd); // Send to PORTD
DIGIT1 = 0; // Enable digit 1>>RA0
}

else
{ // Do digit 2
DIGIT1 = 1; // Disable digit 1
Lsd = Cnt % 10; // LSD digit >> ones
PORTD = mask(Lsd); // Send to PORTD
DIGIT2 = 0; // Enable digit 2 >>RA1
}
}
//
// Start of MAIN Program. configure PORTA and PORTD as outputs.
// In addition, configure TMR0 to interrupt at every 10ms
//
void main()
{
ADCON1=0X07;                               //set A PORT general I/O
TRISD= 0; // PORTD are outputs
TRISA = 0; // RA0, RA1 are outputs
DIGIT1 = 1; // Disable digit 1
DIGIT2 = 1; // Disable digit 2

// Configure TMR0 timer interrupt

OPTION_REG = 0xC4; // Prescaler = 32
TMR0 = 100; // Load TMR0L with 100
INTCON = 0xA0; // Enable TMR0 interrupt
Delay_ms(1000);

for(;;) // Endless loop
{
Cnt++; // Increment Cnt
if(Cnt == 100) Cnt = 0; // Count between 0 and 99
Delay_ms(1000); // Wait 1 second
}
}


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 29-03-2012, 08:53 PM المشاركة 96   
افتراضي


التدريب السادس :

عرض رقم المفتاح المضغوط :

البرنامج :


كود:
/*
Tutorial 6 :
experiment purpose: familiar how to judge key pressed
when no key pressed LED display FF
have a key pressed LED display the number of the pressing key
Keys: S1*RA0,S2*RA1,S3*RA2,S4*RA3& S5*RB0,S6*RB1,S7*RB2,S8*RB3
Commmon anode : RA4 
MCU : PIC16F877A 
MikroC PRO
ENG.F.ABDELAZIZ
http://www.eeecb.com/vb/index.php
*/

 int  result;
 void  init();               //I/O PORT initialize function declare
 void  scan();               //key scan function declare
 void  display(int x);       //display function declare
//------------------------------------------------
//main program
void main()
 {
    while(1)                 //dead circle
      {
        init();              //call initialize function
        scan();              //call key scan function
        display(result);     //call display result function
      }
 }

//------------------------------------------------
//initialize program
void  init()
 {
  ADCON1=0X07;             //set A PORT general I/O PORT
  TRISA =0X0F;             //A PORT high 2 bits OUTPUT,low 4 bits INPUT
  TRISB=0X0F;              //B PORT low 4 bits INPUT
  TRISD=0X00;              //D PORT OUTPUT
  PORTA=0XFF;
  PORTB=0XFF;
  PORTD=0XFF;              //close all display
 }
//------------------------------------------------
//Scan
void  scan()
 {
   result=8;                              //initialize key scan result , default switch-case

   if(PORTA.B0==0)                           // judge if A0 press
      result=0;               //yes: the scan result is 0


   if(PORTA.B1==0)               // judge if A1 press
      result=1;           //yes:the scan result is 1

   if(PORTA.B2==0)                // judge if A2 press
      result=2;

   if(PORTA.B3==0)               // judge if A3 press
      result=3;

   if(PORTB.B0==0)              //judge if B0 press
      result=4;

   if(PORTB.B1==0)              //judge if B1 press
      result=5;

   if(PORTB.B2==0)              //judge if B2 press
      result=6;

   if(PORTB.B3==0)              //judge if B3 press
      result=7;
  }

//display result program
void  display(int x)
 {
   switch(x)                //different x,different deal
     {
      case 0:
         PORTD=0X88; // =Display A letter on :
         PORTA=0X2F;//left unit ON > RA4=0 
         Delay_ms(1);

         PORTD=0XC0; // Display 0 number on : 
         PORTA=0X1F; // right unit ON>RA5=0 
         Delay_ms(1);
          break;  //A0
      case 1:
         PORTD=0X88;PORTA=0X2F;Delay_ms(1);PORTD=0XF9;PORTA=0X1F;Delay_ms(1);break;  //A1
      case 2:
         PORTD=0X88;PORTA=0X2F;Delay_ms(1);PORTD=0XA4;PORTA=0X1F;Delay_ms(1);break;  //A2
      case 3:
         PORTD=0X88;PORTA=0X2F;Delay_ms(1);PORTD=0XB0;PORTA=0X1F;Delay_ms(1);break;  //A3
      case 4:
         PORTD=0X83;PORTA=0X2F;Delay_ms(1);PORTD=0XC0;PORTA=0X1F;Delay_ms(1);break;  //b0
      case 5:
         PORTD=0X83;PORTA=0X2F;Delay_ms(1);PORTD=0XF9;PORTA=0X1F;Delay_ms(1);break;  //b1
      case 6:
         PORTD=0X83;PORTA=0X2F;Delay_ms(1);PORTD=0XA4;PORTA=0X1F;Delay_ms(1);break;  //b2
      case 7:
         PORTD=0X83;PORTA=0X2F;Delay_ms(1);PORTD=0XB0;PORTA=0X1F;Delay_ms(1);break;  //b3
      case 8:
         PORTD=0X8E;PORTA=0X2F;Delay_ms(1);PORTD=0X8E;PORTA=0X1F;Delay_ms(1);break;  //no key press
      }
}



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