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

   

أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 193
نشاط [ أشرف الخطيب ]
قوة السمعة:
قديم 05-05-2009, 08:49 PM المشاركة 9   
angry



شرح البرنامج

فى البداية سنجعل البيك يظهر على الشاشة كلمة CALCULATOR لمدة نصف ثانية فقط من خلال الأوامر
كود:
lcd_out(1,4,"CALCULATOR") ; delay_ms(500) ; lcd_cmd(lcd_clear) ;
نأتى للأهم فى الكود

سنجعل البيك ينتظر من المستخدم أن يضغط المستخدم على أى مفتاح من مفاتيح الكيباد ثم يرفع يده من على الزر وذلك من خلال الأمر
كود:
m = keypad_released() ;
( كل زر من أزرار الكيباد يرجع قيمة معينة عند الضغط عليه وبما ان الكيباد المستخدمة 4X4 أى بها 16زر فإن الأرقام التى ترجعها تلك الدالة ستكون من 1 إلى 16 )



وستكون القيمة التى ترجعها تلك الدالة فى حالة عدم الضغط على أى زر هى صفر

كود:
get_first_number : m = keypad_released() ; if ( m==0 ) goto get_first_number ; if ( m==1||m==5||m==9||m==13||m==14 ) goto operation ; lcd_chr_cp(number[m]) ; x1 = ( x1*10 ) + number2[m] ; x3 = ( x3*10 ) + number3[m] ; goto get_first_number ;
الأمر التالى هام للحصول على قيمة للعدد الأول

كود:
x1 = ( x1*10 ) + number2[m] ;
إذا أراد المستخدم أن يدخل 74 فسيضغط أولا 7 ثم 4 ...... كبف سيفهم البيك أنه 74 ؟؟؟
عن الضغط على رقم 7 سيخزن البيك القيمة الأولى وهى 7 فى المتغير x1 ثم سيضغط المستخدم على رقم 4 عندها سيأخذ البيك القيمة 7 وهى القيمة الحالية الموجودة فى x1 ويضربها فى عشرة ثم يجمع عليها 4 ويضعها فى x1 وهكذا ............


طبعا إذا ضغط المستخدم على أى من الأزرار + أو - أو x أو / فسينتقل البيك إلى السطر operation لطباعة العلامة التى ضغط عليها المستخدم على الشاشة ثم الإنتقال إلى get_second_number لتحصيل العدد الثانى
انظر الأمر التالى
كود:
if ( m==1||m==5||m==9||m==13||m==14 ) goto operation ;
بعد طباعة العلامة على الشاشة سينفذ نفس الأوامر التى نفذها للحصول على العدد الأول

كود:
get_second_number : m = keypad_released() ; if ( m==0||m==1||m==5||m==9||m==13 ) goto get_second_number ; if ( m==14 ) goto get_result ; lcd_chr_cp(number[m]) ; x2 = ( x2*10 ) + number2[m] ; x4 = ( x4*10 ) + number3[m] ; goto get_second_number ;
وبعد ذلك إذا ضغط المستخدم على علامة = سيفهم البيك أن المستخدم قد انتهى من كتابة العددين وسيقوم بالعملية الحسابية المطلوبة على حسب القيمة الموجودة فى المتغير m1 الذى يحوى القيمة التى تدل على الزر الذى يدل على العملية الحسابية الذى يريدها المستخدم
انظر التالى

كود:
operation : m1 = m ; lcd_chr_cp(number[m1]) ;

اعلانات

الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 05-05-2009, 09:29 PM المشاركة 10   
افتراضي


اخي اشرف شكرا لك على التوضيح وارجو ان تجيب على اسئلتي جزاك الله خيرا
1- ما هي ميزة المتغير من نوع const و نوع float ؟
2- ما هو عمل هذا الكود
كود:
floattostr(result2 , txt ) ;
وهذا الكود ايضا
كود:
 
inttostr( result, txt ) ;

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

أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 193
نشاط [ أشرف الخطيب ]
قوة السمعة:
قديم 05-05-2009, 10:15 PM المشاركة 11   
افتراضي


أهلا بك أخى حيدر أتمنى أن تكون على خير حال

ما هي ميزة المتغير من نوع const و نوع float ؟
أنت تعلم أن المتغيرات المستخدمة فى الكود يقوم البيك بحفظها فى الرام وهى ذاكرة تتغير محتوياتها حسب سريان الكود
أما إذا تم تعريف المتغير على أنه const فسقوم البيك بحفظه فى الروم وهى ذاكرة دائمة لاتتغير محتوياتها
وقد تم تعريف المصفوفة من النوع const لعدم شغل مساحة كبيرة من الرام خاصة وأن ذلك البرنامج يستخدم العديد من المتغيرات

جرب أن تمسح كلمة const من الأوامر التالية وانظر ماذا سيحدث .....

كود:
const char number[] ={'y','/','9','8','7','x','6','5','4','-','3','2','1','+','=','0','y'} ; const unsigned int number2[]={'y','/', 9 , 8 , 7 ,'x', 6 , 5 , 4 ,'-', 3 , 2 , 1 ,'+','=', 0 ,'y'} ; const float number3[]={'y','/', 9 , 8 , 7 ,'x', 6 , 5 , 4 ,'-', 3 , 2 , 1 ,'+','=', 0 ,'y'} ;
ستجد أنه عند عمل build للبرنامج ستظهر رسالة خطأ not enough ram

أما التعريف float لأن المتغير من النوع float يمكنك من التعامل مع الأعداد الكسرية ونحن بحاجة إلى ذلك كى تكون عملية القسمة صحيحة .....لماذا ؟
لأن خارج قسمة int/int سيعطى int بمعنى أنك لو قسمت 8 على 6 سيكون الناتج 1 وهو مالانريده لذلك قمنا بتعريف متغيرين من النوع float يمثلان العددين ويكون ناتج القسمة أيضا من النوع float وبذلك سيكون خارج قسمة 8 على 6 ( بعد تعريفهما على أنهما float ) هى 1.3 وهو الناتج الصحيح

انظر كيف تم تعريف المتغيرات المستخدمة فى عملية القسمة فقط
كود:
float x3 = 0 , x4 = 0 , result2 = 0 ;
طبعا العمليات الأخرى( الجمع والطرح والضرب ) سيكون التعريف integer وليس float


ما هو عمل هذا الكود
كود:

floattostr(result2 , txt ) ;
هذا الأمر يأخذ متغيرا float ويحوله إلى string من النوع char حتى نتمكن من عرضها على شاشة lcd لأنه كما تعرف لابد أن يكون المعروض على الشاشة من النوع char ولابد أن تكون تلك ال string مكونة من 13 عنصر على الأقل
لذلك تم تعريفها فى بداية البرنامج
كود:
unsigned char m = 0 , m1 = 0 , txt[13] , lcd[13] , i = 0 , j = 0 ;
وبالمثل الأمر
كود:
inttostr( result, txt ) ;
يأخذ متغيرا من النوع integer ويحوله إلى مصفوفة من النوع char ولابد ان يكون بها على الأقل 7 عناصر

لاحظ أن المتغير result2 يحوى الناتج من عملية القسمة وهو من النوع float
أما المتغير result يحوى الناتج من أى عملية أخرى وهو من النوع integer

أتمنى أن أكون قد وفقت فى الإجابة أخى حيدر ..
إن بقى شىء لم يتضح أرجو أن تذكره وآسف على تأخرى فى الإجابة لظروف ليست بيدى.......


الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 05-05-2009, 11:31 PM المشاركة 12   
افتراضي


بارك الله فيك اخي اشرف وفيت وكفيت . لكن هل تعلم انك ارجعتنا بهذه المعلومات الى قبل 15 سنه تقريبا عندما كنا نتعامل معها في لغة الفورتران
هههه . لاحظ اخي اشرف هل ترى كلمة فورتران في الموقع .


أشرف الخطيب
:: مهندس متواجد ::
تاريخ التسجيل: Mar 2009
الدولة: مصــــــــــــــــــــــــــــــر
المشاركات: 193
نشاط [ أشرف الخطيب ]
قوة السمعة:
قديم 05-05-2009, 11:48 PM المشاركة 13   
افتراضي


لكن هل تعلم انك ارجعتنا بهذه المعلومات الى قبل 15 سنه تقريبا عندما كنا نتعامل معها في لغة الفورتران
معك حق أخى حيدر ........ ربما يأتى يوم نتكلم فيه عن الميكروسى كما نتكلم الآن عن الفورتران .....
لغات البرمجة فى تطور كبير ولاأحد يعلم إلى أين تأخذنا......


الصورة الرمزية حيدر علاج حسن
حيدر علاج حسن
:: مشرف منتدى الهندسة الكهربائية ::
تاريخ التسجيل: Mar 2005
الدولة: IRAQ
المشاركات: 9,848
نشاط [ حيدر علاج حسن ]
قوة السمعة:
قديم 06-05-2009, 10:10 AM المشاركة 14   
افتراضي


انا فعلا عانيت من حالة امتلاء الرام بسبب المتغيرات وبالاخص المصفوفات وكان هذا واضحا في برنامج الساعة الرقمية الذي رفعته هنا . لاني كنت مضطرا للتعامل مع المتغيرات المؤشرة لا لعلمي بها ولكن وجدتها فقط التي ممكن استخدامها . لذلك انا ادعوك ان تعطينا شرحا مبسطا عن المتغيرات وتطرح فيه خواص كل المتغيرات التي لك معرفة بها . وان يكون ذلك في موضوع مستقل . واشكرك جزيل الشكر .


زكي شاكر
:: عضو ماسي ::
تاريخ التسجيل: May 2006
الدولة: المغرب
المشاركات: 2,945
نشاط [ زكي شاكر ]
قوة السمعة:
قديم 07-05-2009, 12:28 AM المشاركة 15   
افتراضي


ربما يأتى يوم نتكلم فيه عن الميكروسى كما نتكلم الآن عن الفورتران .....
لغات البرمجة فى تطور كبير ولا أحد يعلم إلى أين تأخذنا......
السلام عليكم
بداية شكرا جزيلا على مشاركتك القيمة الهادفة الى تعميق تعلم البرمجة بالميكروسي..
نعم أخي البرامج في تقدم مستمر وكل هذا يساهم في تبسيط البرمجة وفي فلوكود والميكروسي مثال على ذلك..
وقد لاحظت بالصدفة خروج نسخة رائعة بها إضافات جد هامة وميزات مكملة :
2009 MikroC Pro
يمكن البحث عنها بهذا العنوان :
mikroc pro for pic
نسخة جديرة بالاهتمام حقا..
تحياتي للجميع


pepoelrwash
:: مهندس ::
تاريخ التسجيل: May 2009
المشاركات: 4
نشاط [ pepoelrwash ]
قوة السمعة:
قديم 10-05-2009, 07:04 PM المشاركة 16   
ha


ممكن اعرف هل البيك 16f84a ممكن ان تشتغل هذا الكود انا اريد ان اعمل حاسبه ولكن بدون lcd لانى وجدتها مكلفه وايضا لا اعرف الدائره الكهربيه لتشغيل البيك وتوصلها بالكى باد واعرف انها تحتاج الى كريستاله هل من الممكن ان تكون 4 ميجا مع هذه البيك ؟ اشكركم واتمنى الرد



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