كود تفعيل العضوية - الابلاغ عن روابط لاتعمل - صيانة التلفزيون - الحاسبة - الأعضاء المتميزين - البرامج و المخططات - بث مباشر للقنوات الفضائية - إذاعة - تردد القنوات - بحث
|
التسجيل | اجعل كافة المشاركات مقروءة |
منتدى الإلكترونيات قسم الالكترونكس لمناقشة الافكار والمعلومات المتعلقة بالهندسة الالكترونية للمبتدئين والهواة والفنيين - Electronics |
![]() |
|
أدوات الموضوع |
![]() |
#1 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]() لماذا تدفع ثمنا فى شاشة LCD تسلسلية فى حين يمكنك أن تصنع واحدة خاصة بك
تمهيد : وحدات العرض LCD المعتمدة على الميكروكونترولر HD44780 تحظى بشعبية كبيرة من أجل المشاريع المدمجة لأنها رخيصة وسهلة الربط والتوصيل ، ويمكنها عرض الأحرف ، وتستهلك قدرة أقل بكثير من وحدات العرض السفن سيجمنت ، ومعظم برامج الترجمة تمتلك مكتبة دوال خاصة بها . ولكن ، العيب الوحيد هو أنها تتطلب على الأقل 6 أطراف دخل/خرج من الميكروكونترولر . حسنا، قد تسأل، أليس ذلك أقل مما تتطلبه وحدات السفن سيجمنت ؟ الإجابة : نعم، هذا صحيح ولكن هناك ظروف حيث قد لا تجد أطراف كافية لوحدة العرض LCD. على سبيل المثال ، إذا كنت تنوى تصميم جهاز استشعار بدرجة الحرارة مبنى على الميكروكونترولر PIC12F683 ، والذى لديه 6 أطراف دخل/خرج فقط ، فقد لا يكون لديك أطراف لربط LCD . أحد الحلول فى مثل هذه الظروف هو استخدام وحدة العرض LCD التسلسلية . لكنه قد لا تكون متاحة فى السوق كما أن ثمنها أكثر من ضعف وحدة LCD القياسية والتى تعتمد على HD44780 . شاشات LCD التسلسلية لا يزال يكون بها وحدة LCD قياسية لكنها تمتلك وحدة إضافية والتى تستقبل البيانات / الأوامر من الميكروكونترولر فى شكل تسلسلى وتحولها إلى الشكل المتوازى المقابل والمناسب لدخل وحدة LCD القياسية بالميكروكونترولر D44780 . الهدف من هذا الموضوع هو استعراض كيفية صنع شاشة LCD تسلسلية باستخدام ثلاثة خطوط لاستخدامه مع الميكروكنترولر ذات الأطراف قليلة العدد مثل سلسلة PIC12F وذلك عن طريق استخدام مسجل إزاحة دخل تسلسلى خرج متوازى (هنا سوف نستخدم الدائرة المتكاملة 74HC595 ) . ولقد تم اختيار الميكروكونترولر PIC12F683 . وحيث أن الدائرة المتكاملة 74HC595 هى مجرد مسجل الإزاحة ليس إلا ، لذلك يقع العبء على الميكروكونترولر المضيف (PIC12F683) لنقل ،وبشكل مناسب ، بيانات أحرف /أوامر وحدة العرض LCD وإشارات التحكم فى شكل تسلسلى . يتم دمج هذا الجزء الذكى داخل ذاكرة برنامج الميكروكونتروار PIC12F683. الأطراف الثلاثة المطلوبة من الميكروكونترولر PIC12F683 هى كما يلى : 1- طرف نقل البيانات التسلسلية Serial data إلى مسجل الإزاحة 74HC595 . 2- إشارة الساعة Clock signal من أجل مسجلى الإزاحة والتخزين بمسجل الإزاحة 74HC595 . 3- إشارة التمكين Enable signal إلى موديول LCD القياسى مع HD44780 . ![]()
__________________
مقالات المهندس فتح الله عبدالعزيز التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 12-05-2016 الساعة 06:32 AM. |
![]() |
![]() |
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب |
![]() ![]() |
|
اعلانات |
![]() |
#2 |
مهندس متواجد
![]()
المشاركات: 53
معدل تقييم المستوى: 0
|
![]() جزاك الله كل خير على هذه المعلومات
|
![]() |
![]() |
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب |
![]() |
|
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها ) | |||
|
![]() |
#3 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]() نبذة عن مسجل الإزاحة 74HC595 :
74الدائرة المتكاملة 74HC595 هى مسجل إزاحة ،عالى السرعة ، 8 بت دخل تسلسلى ، خرج تسلسلى أو متوازى . كما أنه أيضا على سجل ، ومخارج ثلاثية الحالة . سجلى الإزاحة والتخزين له خط ساعة منفصل هما SH_CP و ST_CP على التوالى . يتم إزاحة البيانات فى سجل الإزاحة عند الحافة الصاعدة لنبضة الساعة SH_CP ، ومحتويات مسجل الإزاحة سوف تنتقل إلى مسجل التخزين عند الحافة الصاعدة لنبضة الساعة ST_CP . إذا تم توصيل خطى الساعة معا ، فوسوف يكون مسجل الإزاحة متقدما عن مسجل التخزين بنبضة ساعة واحدة . طرف تمكين الخرج OE ، عندما يتم سحبه إلى الحالة المنخفضة low ، يمكن البيانات ذات 8 بتات الموجودة بسجل التخزين من الظهور على المداخل المتوازية Q0-Q7 . ![]() ولهذا الغرض يتم ربط خطى الساعة SH_CP و ST_CP معا وتشغيلها معا بطرف من أطراف الميكروكونترولر. لذلك ، فإن مخارج مسجل التسجيل تكون متأخرة (خلف) مسجل الإزاحة بنبضة ساعة واحدة ، وهذا يتطلب نبضة ساعة إضافية بعد أن يتم تغذية آخر بت إلى المدخل التسلسلى بحيث تظهر على المخارج . نبذة عن وحدة LCD المعتمدة على الميكروكونترولر HD44780 : هذه الشاشة تستخدم 14 طرف للتوصيل : 8 خطوط بيانات 8 data lines (D0-D7) ، وثلاثة خطوط تحكم 3 control lines (RS, E, R/W), ، وثلاثة خطوط قدرة (Vdd, Vss, Vee) . بعض شاشات LCD تأتي مع ميزة الإضاءة الخلفية والتي تساعد على قراءة البيانات وعرضها في ظروف الإضاءة المنخفضة. فى هذه الحالة يكون لدى الشاشة اثنين من أطراف التوصيل الإضافية (LED+ and LED-) . وصف الأطراف : أطراف التحكم : طرف التحكم RS (اختيار السجل) يحدد ما إذا كان نقل البيانات بين موديول LCD والميكروكونترولر هو بيانات أحرف فعلية أو أو أمر/حالة command/status . عندما يحتاج الميكروكونترولر إلى إرسال أوامر commands إلى موديول LCD أو قراءة حالة الموديول ، يجب سحب هذا الخط إلى الحالة المنخفضة . بالمثل ، يجب سحب هذا الخط إلى الحالة المرتفعة إذا احتاج الميكروكونترولر إرسال أو استقبال بيانات حرف إلى أو من موديول LCD . طرف التحكم R/W : يحدد اتجاه انتقال البيانات . إذا تم سحبه إلى الحالة المنخفضة ، فإن بيانات الأوامر أو الحرف يتم كتابتها (إرسالها) إلى موديول LCD . وإذا تم سحبه إلى الحالة المرتفعة ، يتم قراءة بيانات الحرف أو معلومات الحالة من سجلات موديول LCD . هنا ، سوف نستخدم طريق واحد لنقل البيانات ، أى من الميكروكونترولر إلى موديول LCD ، لذلك فإن الطرف R/W سوف يتم توصيله بالأرضى بشكل دائم . طرف التحكم E : يتحكم فى إطلاق (بدء) النقل الفعلى للبيانات . عند الكتابة إلى شاشة LCD ، يتم نقل البيانات فقط عند الانتقال من الحالة المرتفعة إلى الحالة المنخفضة (الحافة الهابطة) للطرف E . . ![]() أطراف مصدر القدرة : يستخدم الجهد +5V DC لتشعيل موديول LCD ، لكن البعض منها قد يعمل على مدى أوسع من الجهد (3.0 to 5.5 V) . يجب توصيل الطرف Vdd (2) بالجهد الموجب لمصدر القدرة وتوصيل الطرف Vss (1) إلى الأرضى . الطرف Vee(3) مخصص من أجل ضبط تباين الشاشة ويتم توصيله بجهد بين 0V و 2V عن طريق مقاومة متغيرة . أطراف البيانات : الأطراف D0-D7(7-14) هى أطراف البيانات . يمكن تحقيق انتقال البيانات من وإلى الشاشة إما بنظام 8-bit أو بنظام 4-bit . نظام 8-bit يستخدم جميع خطوط البيانات الثمانية لنقل بايت ، بينما فى نظام 4-bit يتم نقل البايت باعتباره مكون من 2 نبل كل نبل مكون من 4-bit . فى الحالة الأخيرة ، يتم فقط استخدام الأربعة خطوط العليا للبيانات (D4-D7) . هذه التقنية تكون مفيدة لأنها توفر بعض من أطراف الدخل /الخرج للميكروكونترولر . مخطط الرسم البياني لهذا المشروع هو بسيطة الى حد كبير. كما ذكر سابقا، فإن جزءا تحديا من هذا المشروع هو برنامج التشغيل المطلوبة لPIC12F683. يستخدم لنقل البيانات LCD وضع 4 بت. لذلك، يتم إرسال أية بيانات الأوامر أو حرف 8 بت في خطوتين: أرسل أعلى عاب الأول، ثم عاب أقل. ويرتكز دبوس R / W السيطرة لأنه لا يوجد بيانات أو وضع قراءة من وحدة LCD في هذا المشروع. يتم نقل البيانات عاب 4 بت والتسجيل اختر (RS) إشارة التحكم بشكل متسلسل إلى 74HC595. تظهر في Q0-Q4 على نبض مدار الساعة 6TH. ترتبط ملاحظة، Q0-Q3 إلى D4-D7 وQ4 لRS. عندما تكون جاهزة في خطوط LCD البيانات (D4-D7) والسيطرة RS دبوس، تمكين يتم إنشاء نبض من قبل PIC12F683. هذا الترتيب، لذلك، يتطلب 3 دبابيس من متحكم لعرض البيانات الشخصية على شاشة LCD الموازي: 2 دبابيس لتوفير على مدار الساعة والبيانات إلى 74HC595، و 1 دبوس لتمكين التحكم (E) دبوس من وحدة LCD.
__________________
مقالات المهندس فتح الله عبدالعزيز |
![]() |
![]() |
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب |
![]() ![]() |
|
![]() |
#4 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]() الدائرة الكهربية :
![]() الدائرة الكهربية لهذا المشروع بسيطة الى حد كبير . لكن التحدى فى الجزء الخاص ببرنامج التشغيل المطلوب للميكروكونترولر PIC12F683. • لنقل بيانات LCD سوف نستخدم نظام 4-bit . لذلك، يتم إرسال أى أمر أو بيانات حرف 8 بت على خطوتين: فى البداية يتم إرسال النبل 4-bit العلوى ، بعد ذلك يتم إرسال النبل 4-bit السفلى . • يتم توصيل طرف التحكم R/W بالأرضى لأنه لا يوجد قراءة لبيانات أو حالة من موديول LCD ، فى حالتنا. • يتم نقل بيانات النبل 4-bit وإشارة التحكم فى اختيار السجل RS بشكل متسلسل إلى 74HC595 . وسوف تظهر على المخارج Q0-Q4 عند نبضة الساعة السادسة . ملاحظة ، المخارج Q0-Q3 تكون متصلة بخطوط البيانات D4-D7 والمخرج Q4 يكون متصلا بالخط RS . • عندما تكون البيانات جاهزة على خطوط بيانات (D4-D7) موديول LCD وطرف التحكم RS ، يتم توليد نبضة التمكين بواسطة PIC12F683 . لذلك ، فإن هذا الترتيب يتطلب 3 أطراف من الميكروكونترولر لعرض بيانات حرف على شاشة LCD متوازية : 2 طرف لتوفير الساعة Clock والبيانات Data لمسجل الإزاحة 74HC595 ، وطرف من أجل التحكم فى التمكين E لموديول LCD .
__________________
مقالات المهندس فتح الله عبدالعزيز |
![]() |
![]() |
![]() |
#5 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]() البرنامج :
سوف يتم استخدام المترجم ميكروسى برو فى إنشاء روتينات (دوال) مشغل driver موديول LCD باستخدام ثلاثة خطوط . فى الوضع الافتراضى ، بداية تشغيل موديول LCD تكون فى النظام 8-bit . هذا يتطلب تسلسل من الأوامر لإعداد هذا الموديول فى النظام 4-bit . الروتينات المذكورة هنا مخصصة لموديول LCD من نوع 16X2 ، ومع ذلك ، يمكن تعديلها للعمل مع موديولات LCD من نوع آخر . ملحوظة : ناشر هذا البرنامج هو Jayanth Devarayanadurga ويقول أنه قام بتعديل البرنامج المكتوب بمعرفة Rajendra Bhatt ، بغرض أن يكون لدينا دوال مثل المستخدمة ضمن المترجم ميكروسى برو نفسه ، أى : Serial_LCD_Out Serial_LCD_Chr Serial_LCD_Cmd البرنامج الكامل : كود:
/* 3-wire Serial LCD using 74HC595 Jayanth Devarayanadurga 08/05/2013 */ #define _LCD_FIRST_ROW 0x80 //Move cursor to the 1st row #define _LCD_SECOND_ROW 0xC0 //Move cursor to the 2nd row #define _LCD_THIRD_ROW 0x94 //Move cursor to the 3rd row #define _LCD_FOURTH_ROW 0xD4 //Move cursor to the 4th row #define _LCD_CLEAR 0x01 //Clear display #define _LCD_RETURN_HOME 0x02 //Return cursor to home position, returns a shifted display to //its original position. Display data RAM is unaffected. #define _LCD_CURSOR_OFF 0x0C //Turn off cursor #define _LCD_UNDERLINE_ON 0x0E //Underline cursor on #define _LCD_BLINK_CURSOR_ON 0x0F //Blink cursor on #define _LCD_MOVE_CURSOR_LEFT 0x10 //Move cursor left without changing display data RAM #define _LCD_MOVE_CURSOR_RIGHT 0x14 //Move cursor right without changing display data RAM #define _LCD_TURN_ON 0x0C //Turn Lcd display on #define _LCD_TURN_OFF 0x08 //Turn Lcd display off #define _LCD_SHIFT_LEFT 0x18 //Shift display left without changing display data RAM #define _LCD_SHIFT_RIGHT 0x1E //Shift display right without changing display data RAM sbit Serial_Data_Pin at GP5_bit; sbit Serial_Clk_Pin at GP1_bit; sbit Enable_Pin at GP2_bit; //Function Prototypes void Serial_LCD_Cmd(unsigned char Command); void Serial_LCD_Chr(unsigned int row, unsigned int col, char LCDChar); void Serial_LCD_Init(); void Serial_LCD_Out(unsigned int row, unsigned int col, unsigned char str[20]); void Write_Nibble(unsigned short N); // Always mention this definition statement unsigned short Low_Nibble, High_Nibble, p, q, Mask, N, t, RS, Flag, temp; void Delay_50ms(){ Delay_ms(50); } void Write_Nibble(unsigned short N){ Enable_Pin = 0; // ****** Write RS ********* Serial_Clk_Pin = 0; Serial_Data_Pin = RS; Serial_Clk_Pin = 1; Serial_Clk_Pin = 0; // ****** End RS Write // Shift in 4 bits Mask = 8; for (t=0; t<4; t++){ Flag = N & Mask; if(Flag==0) Serial_Data_Pin = 0; else Serial_Data_Pin = 1; Serial_Clk_Pin = 1; Serial_Clk_Pin = 0; Mask = Mask >> 1; } // One more clock because SC and ST clks are tied Serial_Clk_Pin = 1; Serial_Clk_Pin = 0; Serial_Data_Pin = 0; Enable_Pin = 1; Delay_us(500); Enable_Pin = 0; } void Serial_LCD_Cmd(unsigned char Command) { RS = 0; // It is command, not data Low_Nibble = Command & 15; // AS : Low_Nibble = Command & 0x0F; High_Nibble = Command/16; // AS : High_Nibble = Command>>4; Write_Nibble(High_Nibble); Write_Nibble(Low_Nibble); if((Command == 0x0C) || (Command == 0x01) || (Command == 0x0E) || (Command == 0x0F) || (Command == 0x10) || (Command == 0x1E) || (Command == 0x18) || (Command == 0x08) || (Command == 0x14) || (Command == 0x02)) Delay_50ms(); } void Serial_LCD_Chr(unsigned int row, unsigned int col, char LCDChar) { switch(row){ case 1: Serial_LCD_Cmd(0x80 + col-1); break; case 2: Serial_LCD_Cmd(0xC0 + col-1); break; case 3: Serial_LCD_Cmd(0x94 + col-1); break; case 4: Serial_LCD_Cmd(0xD4 + col-1); break; } RS = 1; // It is Data, not command Low_Nibble = LCDChar & 15;//Low_Nibble = LCDChar & 0x0F; // High_Nibble = LCDChar/16;//High_Nibble = LCDChar>>4; Write_Nibble(High_Nibble); Write_Nibble(Low_Nibble); } void Serial_LCD_Init(){ Delay_50ms(); Serial_LCD_Cmd(0x03); // Wake-Up Sequence Delay_50ms(); Serial_LCD_Cmd(0x03); Delay_50ms(); Serial_LCD_Cmd(0x03); Delay_50ms(); Serial_LCD_Cmd(0x02); Delay_50ms(); Serial_LCD_Cmd(0x28); // 4-bits, 2 lines, 5x7 font Delay_50ms(); Serial_LCD_Cmd(0x06); // Entry mode- Auto-increment, No Display shifting Delay_50ms(); } void Serial_LCD_Out(unsigned int row, unsigned int col, unsigned char str[20]) { q = strlen(str); for (p = 0; p<q; p++){ Serial_LCD_Chr(row,col++,str[p]); // print first character on LCD } row = 1; col = 1; } void main() { CMCON0 = 7; // Disable Comparators TRISIO = 0b00001000; // All Outputs except GP3 ANSEL = 0x00; // No analog i/p Serial_LCD_Init(); Serial_LCD_Cmd(_LCD_CLEAR); Serial_LCD_Cmd(_LCD_CURSOR_OFF); while(1){ Serial_LCD_Out(1,1,"3-Wire"); Serial_LCD_Out(2,1,"Serial LCD"); Serial_LCD_Out(3,1,"20X4"); Serial_LCD_Out(4,1,"Using 74HC595"); Serial_LCD_Chr(1,10, '?'); } } النتيجة ![]()
__________________
مقالات المهندس فتح الله عبدالعزيز |
![]() |
![]() |
![]() |
#6 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]()
__________________
مقالات المهندس فتح الله عبدالعزيز |
![]() |
![]() |
![]() |
#7 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]() شرح الدوال المعرفة بمعرفة المستخدم :
الدالة الأولى : دالة التأخير : كود:
void Delay_50ms(){ Delay_ms(50); } هذه الدالة اختيارية ويمكن استخدام دالة التأخير المدمجة فى الميكروسى Delay_ms(50); ، لكن هذه الدالة يتكرر استدعاؤها العديد من المرات (السطور) ، ولذلك يفضل أن يتم استخدام دالة معرفة بمعرفة المستخدم بحيث ، عند اللزوم، عند الرغبة فى تغيير زمن التأخير ، يتم التغيير فى سطر واحد فقط فى نموذج الدالة وينعكس ذلك بالطبع عند كل استدعاء لهذه الدالة .
__________________
مقالات المهندس فتح الله عبدالعزيز |
![]() |
![]() |
![]() |
#8 |
استاذ و مشرف قسم الالكترونيات
المشاركات: 6,894
معدل تقييم المستوى: 332
|
![]() الدالة الثانية : دالة نبل 4-bit وسوف تستخدم فى الدوال التى تليها (لهذا السبب يجب أن نبدأ بها ، حتى لا يعطيك المترجم أخطاء ) : دالة إرسال بايت أمر 8-bit ودالة إرسال حرف 8-bit على شكل 2 نبل ، بالإضافة إلى دالة تهيئة موديول LCD . راجع التعليفات بجوار كل سطر .
كود:
void Write_Nibble(unsigned short N){ Enable_Pin = 0; // Disable // ****** Write RS ********* Serial_Clk_Pin = 0; Serial_Data_Pin = RS; // For command RS =0 , for character RS=1 , as you see later Serial_Clk_Pin = 1; // Shift RS Serial_Clk_Pin = 0; // ****** End RS Write // Shift in 4 bits Mask = 8; // 0b00001000 for (t=0; t<4; t++){ // Get and shift lower 4-bit , one bit each loop Flag = N & Mask; //get if(Flag==0) Serial_Data_Pin = 0; else Serial_Data_Pin = 1; Serial_Clk_Pin = 1;//shift Serial_Clk_Pin = 0; Mask = Mask >> 1;//0b000000100 } // One more clock because SC and ST clks are tied Serial_Clk_Pin = 1; Serial_Clk_Pin = 0;//Now , data at shift register outputs Q0 to Q4 Serial_Data_Pin = 0; // Enable_Pin = 1; // Enable to send data to LCD module Delay_us(500); //Some delay for enable pulse Enable_Pin = 0; }
__________________
مقالات المهندس فتح الله عبدالعزيز |
![]() |
![]() |
![]() |
العلامات المرجعية |
أدوات الموضوع | |
|
|