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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 30-04-2011, 05:49 PM المشاركة 1   
افتراضي مشروع عد وعرض ومعالجة عدد الأشياء تصاعديا وتنازليا باستخدام PIC16F628 وLCD متعدد Twitter FaceBook Google+



مشروع عد وعرض ومعالجة عدد الأشياء تصاعديا وتنازليا يصلح لتطبيقات متعددة

يتم أستلام وعد النبضات من مدخلين حيث يخصص المدخل الأول RA4 لتزايد العداد والمدخل الثانى RA5 لتناقص العداد ويتم عرض الفرق بينهما على وحدة العرض LCD كعدد من 0000 إلى 9999 .
يتم توصيل وحدة العرض كما يلى :D4 with RB0 وD5 with RB1و D6 with RB2 و
D7 with RB3 و RS with RB4 و EN with RB5 .
الدائرة الكهربية :



اعلانات

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


البرنامج :

كود:
/* '******************************************************************************* ' Alphanumeric LCD and Push Button. ' Description: ' In this experiment we will work with alphanumeric LCD and push button. ' Communication with LCD will be performed through 4-bits and connections ' is made as follows: D4 with RB0, D5 with RB1, D6 with RB2, D7 with RB3; ' RS with RB4 and EN with RB5. ' The Push button is connected to PORT RA4 (for increment) and PORT RA6 ' (for decrement). Of course both button have pull-up resistors (4k7). ' To make this project more interesting , you can reach from 0000 to 9999 ' by pressing the button. ' Test configuration: ' MCU: PIC16F628A ' SW: MikroC PRO for PIC 2010 (version v4.15) ' Configuration Word ' Oscillator: INTOSC:I/O on RA.6, I/O on RA.7 ' Watchdog Timer: OFF ' Power up Timer: Disabled ' Master Clear Enable: Enabled ' Browun Out Detect: Enabled ' Low Voltage Program: Disabled ' Data EE Read Protect: Disabled ' Code Protect: OFF '******************************************************************************* */ // LCD module connections sbit LCD_RS at RB4_bit; // LCD_RS assigned to PORT RB4; sbit LCD_EN at RB5_bit; // LCD_EN assigned to PORT RB5; sbit LCD_D4 at RB0_bit; // LCD_D4 assigned to PORT RB0; sbit LCD_D5 at RB1_bit; // LCD_D5 assigned to PORT RB1; sbit LCD_D6 at RB2_bit; // LCD_D6 assigned to PORT RB2; sbit LCD_D7 at RB3_bit; // LCD_D7 assigned to PORT RB3; sbit LCD_RS_Direction at TRISB4_bit; // LCD_RS assigned to TRIS B4; sbit LCD_EN_Direction at TRISB5_bit; // LCD_EN assigned to TRIS B5; sbit LCD_D4_Direction at TRISB0_bit; // LCD_D4 assigned to TRIS B0; sbit LCD_D5_Direction at TRISB1_bit; // LCD_D5 assigned to TRIS B1; sbit LCD_D6_Direction at TRISB2_bit; // LCD_D6 assigned to TRIS B2; sbit LCD_D7_Direction at TRISB3_bit; // LCD_D7 assigned to TRIS B3; // End LCD module connections char Message1[]="COUNTER"; // Message for line1; unsigned int number = 0; char *digit = "0000"; void Display_init() // define display_init; { digit[0] = number/1000 + 48; // thousands digit; digit[1] = (number/100)%10 +48; // hundreds digit; digit[2] = (number/10)%10 + 48; // tens digit; digit[3] = number%10 +48; // unit digit; Lcd_Out(2,7,digit); // display on LCD from column 2, character 7; } bit oldstate1; // Old state flag bit oldstate2; void main() // main; { CMCON |= 7; // turn off analogue comparator and make PORTA to digital I/O; TRISA6_bit = 1; // make PORT RA6 as input for button; TRISA7_bit = 1; // make PORT RA7 as input for button; PORTA = 0; // Turn ON PORTA; TRISB = 0; // Set PORTB direction to be output; PORTB = 0; // Turn ON PORTB; Lcd_init(); // LCD Initialization; Lcd_cmd(_LCD_CLEAR); // Clear LCD; Lcd_cmd(_LCD_CURSOR_OFF); // Cursor mode, off; Lcd_out(1,2,Message1); // display message1 from column 1, character 3; do{ if (Button(&PORTA, 4, 1, 1)) { // Detect logical oldstate1 = 1; // Update flag } if (oldstate1 && Button(&PORTA, 4, 1, 0)) { // Detect one-to-zero transition Delay_ms(200); // If button is pressed, delay 0,2s and decrement "number" with 1; number = number +1; oldstate1 = 0; // Update flag }
if(Button(&PORTA,6,1,1)){ oldstate2 = 1; // Update flag } if (oldstate2 && Button(&PORTA, 6, 1, 0)) { // Detect one-to-zero transition Delay_ms(200); // If button is pressed, delay 0,2s and decrement "number" with 1; number = number -1; oldstate2 = 0; // Update flag } if (number > 9999u) // if it's more than 9999 go to 0; number = 0; display_init(); // call display_init(); if(number>10) PORTB.B6=1; else PORTB.B6=0; if(number>20) PORTB.B7=1; else PORTB.B7=0; } while(1); // infinite loop; }

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

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


التعليق على البرنامج :
1- مقدمة (رأس) البرنامج :

كود:
/* '******************************************************************************* ' Alphanumeric LCD and Push Button.
' Description: ' In this experiment we will work with alphanumeric LCD and push button. ' Communication with LCD will be performed through 4-bits and connections ' is made as follows: D4 with RB0, D5 with RB1, D6 with RB2, D7 with RB3; ' RS with RB4 and EN with RB5. ' The Push button is connected to PORT RA4 (for increment) and PORT RA6 ' (for decrement). Of course both button have pull-up resistors (4k7). ' To make this project more interesting , you can reach from 0000 to 9999 ' by pressing the button. ' Test configuration: ' MCU: PIC16F628A ' Test.Board: WB-106 Breadboard 2420 dots ' SW: MikroC PRO for PIC 2010 (version v4.15) ' Configuration Word ' Oscillator: INTOSC:I/O on RA.6, I/O on RA.7 ' Watchdog Timer: OFF ' Power up Timer: Disabled ' Master Clear Enable: Enabled ' Browun Out Detect: Enabled ' Low Voltage Program: Disabled ' Data EE Read Protect: Disabled ' Code Protect: OFF '******************************************************************************* */


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


2- تحديد أطراف توصيل وحدة العرض لزوم استخدام مكتبة LCD :

كود:
// LCD module connections sbit LCD_RS at RB4_bit; // LCD_RS assigned to PORT RB4; sbit LCD_EN at RB5_bit; // LCD_EN assigned to PORT RB5; sbit LCD_D4 at RB0_bit; // LCD_D4 assigned to PORT RB0; sbit LCD_D5 at RB1_bit; // LCD_D5 assigned to PORT RB1; sbit LCD_D6 at RB2_bit; // LCD_D6 assigned to PORT RB2; sbit LCD_D7 at RB3_bit; // LCD_D7 assigned to PORT RB3;
sbit LCD_RS_Direction at TRISB4_bit; // LCD_RS assigned to TRIS B4; sbit LCD_EN_Direction at TRISB5_bit; // LCD_EN assigned to TRIS B5; sbit LCD_D4_Direction at TRISB0_bit; // LCD_D4 assigned to TRIS B0; sbit LCD_D5_Direction at TRISB1_bit; // LCD_D5 assigned to TRIS B1; sbit LCD_D6_Direction at TRISB2_bit; // LCD_D6 assigned to TRIS B2; sbit LCD_D7_Direction at TRISB3_bit; // LCD_D7 assigned to TRIS B3; // End LCD module connections


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


3- تعريف (إعلان) المتغيرات والرسائل :
# الرسالة الثابتة التى سوف تعرض فى الصف الأول حسب الرغبة وهى باسم Message1[] وهى عبارة عن مصفوفة صف من الحروف المعرفة بين القوسين "…" .
# تعريف (إعلان- حجز) سجل لمتغير نوع unsigned int باسم number وإسناد قيمة ابتدائية له هى الصفر وهذا السجل سوف يحتوى على العدد المطلوب عرضه (قبل تحويله إلى كود أسكى) .
#الإعلان عن حجز سجل متغير بالإشارة إليه بالطريقة *digit وهو عبارة عن نص مكون من أربعة خانات وإسناد قيمة أصفار كقيمة ابتدائية وهو عبارة عن مصفوفة صف به 4 عناصر .

كود:
char Message1[]="Counter"; // Message for line1; unsigned int number = 0;
char *digit = "0000";


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


4- إنشاء دالة باسم Display_init تحتوى على تقسيم محتويات السجل numberإلى أربعة خانات وتحويل كل خانة إلى كود أسكى المناسب ااعرض على وحدة العرض LCD حيث يتم :
# استخلاص قيمة خانة الآلاف بقمة العدد على1000 ويضاف إلى النتيجة الرقم 48 لتحويله إلى كود أسكى وحفظ النتيجة كأول عنصر من عناصر المصفوفة digit[0] .
# استخلاص قيمة خانة المئات بالقسمة على 100 ثم إيجاد باقى خارج قسمة الناتج على 10 والنتيجة النهائية يتم تحويلها إلى كود أسكى بإضافة وحفظ النتيجة كثانى عنصر من عناصر المصفوفة digit[1] .
48.
# استخلاص قيمة خانة العشرات بالقسمة على 10 ثم إيجاد باقى خارج قسمة الناتج على 10 والنتيجة النهائية يتم تحويلها إلى كود أسكى بإضافة وحفظ النتيجة كثالث عنصر من عناصر المصفوفة digit[2] .
48 .
# استخلاص قيمة خانة الآحاد بإيجاد باقى خارج القسمة على 10 والنتيجة يتم تحويلها إلى كود أسكى بإضافة 48 وحفظ النتيجة كرابع عنصر من عناصر المصفوفة digit[3] .
# وأخير عرض هذه المصفوفة فى الصف الثانى بدءا من العامود السابع

كود:
void Display_init() // define display_init; { digit[0] = number/1000 + 48; // thousands digit; digit[1] = (number/100)%10 +48; // hundreds digit; digit[2] = (number/10)%10 + 48; // tens digit; digit[3] = number%10 +48; // unit digit; Lcd_Out(2,7,digit); // display on LCD from column 2, character 7; }


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


# تعريف (إعلان) عن خانتين لحفظ الحالة القديمة (الابتدائية) لكل مفتاح :

كود:
bit oldstate1; // Old state flag bit oldstate2;


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


5- بداية الدالة الرئيسية :
· إعدادات أطراف المنافذ ووحدة العرض LCD :
# فصل موديول المقارن لجعل أطراف المنفذ PORTA كمداخل / مخارج رقمية .
# إعداد الطرف RA6 والطرف RA7 كمداخل . وتصفير المنفذ PORTA .
# إعداد أطراف المنفذ PORTB كمخارج وتصفيره .
# تهيئة وحدة العرض للبدء العمل وتصفيرها ومنع ظهور المؤشر وعرض الرسالة الثابتة فى أول صف بدءا من العامود الثانى .

كود:
void main() // main; { CMCON |= 7; // turn off analogue comparator and make PORTA to digital I/O; TRISA6_bit = 1; // make PORT RA6 as input for button; TRISA7_bit = 1; // make PORT RA7 as input for button; PORTA = 0; // Turn ON PORTA; TRISB = 0; // Set PORTB direction to be output; PORTB = 0; // Turn ON PORTB;
Lcd_init(); // LCD Initialization; Lcd_cmd(_LCD_CLEAR); // Clear LCD; Lcd_cmd(_LCD_CURSOR_OFF); // Cursor mode, off; Lcd_out(1,2,Message1); // display message1 from column 1, character 3;

إضافة رد

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

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

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


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

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