الليد ماتريكس LED MATRIX علميا وعمليا والبرمجة بلغة السى والمترجم MIKROC والمترجم CCS C :

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

الليد ماتريكس LED MATRIX علميا وعمليا والبرمجة بلغة السى والمترجم MIKROC والمترجم CCS C :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:06 am

الليد ماتريكس LED MATRIX علميا وعمليا والبرمجة بلغة السى والمترجم MIKROC والمترجم CCS C :
الجزء الأول :
فى هذا الجزء سوف نحتاج إلى :
1- برمجيات المترجم ميكروسى برو ، و/ أو المترجم CCS C .
2- برمجيات بروتيس Proteus لمحاكاة النتائج .

أولا : مقدمة
ما هو الليد ؟ What is an LED ? :



دعونا نبدأ من الأساسيات ، فنحن سوف نعمل مع الليدات LEDs ، لذلك من الأفضل أن يكون لدينا معرفة حول هذه الأجهزة (المكونات) الصغيرة . هذه المعرفة ضرورية ، بمعنى أنك قد تحتاج إليها وخاصة إذا كانت الليدات الخاصة بك ذات خواص مختلفة .
الشىء الأول ، أن الليد LED ، فى الأساس ، هو دايود ، كما نعلم جميعا ، يكون له وصلة PN مثل أى وصلة PN ، هذه الوصلة تقوم بالتوصيل conduct فى اتجاه واحد فقط ( خواصه أقرب إلى دايود الزينر) .
الشىء الثانى ، هو أن هناك مستوى معين من الجهد ( عتبة الجهد) ، والذى يلزم تطبيقه على طرفى الليد لجعله يوصل . قبل هذا الجهد يكون لليد مقاومة مرتفعة جدا ، لذلك لا يمكنك تقييم (تقدير) مقاومته عندما يكون موصلا وبالتالى التيار المسحوب .
الأهم من ذلك ، هو حقيقة أن التيار الزائد over-current سوف يؤدى إلى تلف الوصلة PN ، خاصة إذا كان المصدر الخاص بك قادرا على توفير تيار أعلى من 100mA ، فعندما يتم تطبيق جهد الانهيار بين طرفى الليد فإن مقاومتة سوف تهبط لقيمة صغيرة جدا تكاد لا تذكر ، ويقوم بتوصيل كل التيار الذى يمكن أن يوفره المصدر ، هذا التيار المرتفع بالتأكيد سوف يؤدى إلى تلف الليد . لذلك فمن المهم أن نعرف (نحدد) التيار المطلوب لليد ، وتبعا لمصدر الجهد الخاص بك يتم حساب قيمة مقاومة يتم توصيلها على التوالى معه للحد من التيار .
معظم الليدات الشائعة الاستخدام تستهلك تيار 25mA ، لكن الليدات الأكبر والأكثر سطوعا قد تستهلك تيار أكثر . لذلك عليك التحقق أما من الشركة المصنعة أو باستخدام القياسات .
ضع فى اعتبارك أن الليدات هى أجهزة يتم تشغيلها بالتيار ، ولا يتم تشغيلها بالجهد . للحفاظ على إضاءة ثابتة تحتاج الليدات لمصدر تيار ثابت ، وهو خارج عن هذا الموضوع .
فى معظم المشاريع نستخدم الميكروكونترولر ، وبالتالى فإن جهد المصدر المتاح هو 5V DC . باستخدام قانون أوم
I = V/R نحسب قيمة المقاومة R من أجل تيار قيمته 25mA .



ما هى الليد ماتريكس (مصفوفة الليدات) LED Matrix ؟


Admin
Admin

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

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

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

ما هى الليد ماتريكس (مصفوفة الليدات) LED Matrix  ؟

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:17 am

ما هى الليد ماتريكس (مصفوفة الليدات) LED Matrix  ؟
تشغيل الليدات بشكل منفرد يحتاج خط تحكم لكل ليد ، وهذا يعنى استخدام الكثير من الأسلاك وبالتالى يكون الهاردوير ضخم . الليد ماتريكس هى ترتيب خاص لليدات فى شكل مصفوفة ، حيث يكون لكل ليد صف row وعامود column ، لذلك إذا كان لدينا 8 صفوف و 8 أعمدة ، أى مصفوفة “8x8” ، فإنه يكون لدينا 64 ليد ، و128 طرف تحكم . يمكننا توصيل جميع الكاثودات معا ، لكن لايزال لدينا 64 أنود يحتاج معالجة .

فى الليد ماتريكس ، نطبق حيلة ذكية أخرى عند توصيلها ، حيث يتم توصيل جميع أنودات الليدات الموجودة فى الصف الواحد مع بعضها لتشكيل طرف أنود مشترك واحد ، وتوصيل جميع كاثودات الليدات الموجودة فى العامود الواحد مع بعضها لتشكيل طرف كاثود مشترك واحد . الآن ، إذا كان لدينا ليد ماتريكس “8x8” فسوف يكون لدينا ثمانية أسلاك من أجل الثمانى صفوف و ثمانية أسلاك من أجل الثمانية أعمدة .
يمكنك اختبار التوصيل الداخلى لليد ماتريكس ، الموجودة ضمن برنامج بروتيس ، عن طريق توصيل الجهد السالب إلى الصف الأول ، على سبيل المثال ، وتوصيل الجهد الموجب إلى العامود الأول ، فيضىء الليد الموجود عند الركن الأيسر العلوى ، كما هو موضح بالشكل التالى أدناه :



بهذه الطريقة يمكننا التحكم فى أى ليد بشكل منفرد ، ولكن هناك بعض القيود ، التى يمكنك إدراكها بسرعة ، وهى أن بعض مجموعات الليدات لا يمكن تشغيلها فى نفس الوقت دون التأثير على الليدات الأخرى . لحسن الحظ يوجد حل لهذه المشكلة ، حيث تأتى الطبيعة لمساعدتنا ، فسوف نقوم بإضاءة صف (أو عامود) واحد فى كل مرة ، صف تلو الصف ، ونفعل ذلك بسرعة بحيث أن أعيننا لا يمكنها تتبع التغيير ، ونرى المصفوفة بكاملها متوهجة . هذه الظاهرة تسمى "استمرارية أو تواصل الرؤية"  “persistence of vision”  أو اختصارا POV .

بناء ليد ماتريكس :

Admin
Admin

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

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

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

بناء ليد ماتريكس :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:20 am

[SIZE="4"]بناء ليد ماتريكس :
أول شىء ، هو توصيل الليدات . يجب أن نقرر استخدام أحد طريقتين ، إما أننا نريد أن يكون لدينا الصفوف متصلة بأنودات الليدات ، أو بالكاثودات . هذا لا يهم كثيرا حيث يمكننا تعويض ذلك فى البرنامج . لكن تصميمات الهاردوير والدوائر المتكاملة الخاصة بالتشغيل قد تتطلب مطلب معين أو آخر .
الشىء الثانى ، هل تريد بناء ليد ماتريكس بنفسك أو ترغب فى شراء وحدات جاهزة ، الخيار لك .

وحدات (موديولات) الليد ماتريكس الجاهزة :
فى الوقت الراهن يتوفر تجاريا العديد من وحدات الليد ماتريكس بلون واحد أو بلونين أو حتى بثلاثة . هذه الوحدات بها جميع التوصيلات اللازمة داخليا ، فقط يظهر خارجها أطراف الصفوف والأعمدة للربط مع باقى الهاردوير . كما تتوفر هذه الوحدات بأحجام وتكوينات مختلفة مثل 5x7, 8x8, 16x16 وغيرها . بمجرد فهم تقنية الربط الأساسى يمكنك إنشاء شاشات عرض أكبر من خلال تجميع وحدات متعددة جنبا إلى جنب وتوصيلها معا لتشكيل ليد ماريكس واحدة .



تدريب عملى : التعرف على أطراف موديول ليد ماتريكس 8X8 طراز HS-2088BS :
[/SIZE]

Admin
Admin

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

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

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

تدريب عملى : التعرف على أطراف موديول ليد ماتريكس 8X8 طراز HS-2088BS :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:23 am

[SIZE="4"]تدريب عملى : التعرف على أطراف موديول ليد ماتريكس 8X8 طراز HS-2088BS :






ثانيا : مسح الشاشة Scanning The Display :
[/SIZE]

Admin
Admin

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

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

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

ثانيا : مسح الشاشة Scanning The Display :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:37 am

[SIZE="4"]ثانيا : مسح الشاشة Scanning The Display :
كما ذكر سابقا ، تقنية هذا النوع من الشاشات (وحتى التلفزيون) تستخدم ظاهرة دوام الرؤية POV كأداة لإعطاء عرض لصورة وهمية (خداع بصرى) .
الآن ، عندما يكون لدينا ليد ماتريكس يكون لدينا خياران :
• الخيار الأول : تقنية مسح الصفوف ، بمعنى تشغيل صف row واحد فى كل مرة ، مع عرض (تواجد) نموذج الليدات الموصلة on وغير الموصلة off على الأعمدة ، وإعطائها بعض الوقت لترك أثر للصورة على أعيننا ، ثم بعد ذلك يتم إيقاف تشغيل الصف الأول والانتقال إلى تشغيل الصف الثانى ، ويتم تكرار نفس العملية مرة أخرى ومرة أخرى .
• الخيار الثانى : تقنية مسح الأعمدة ، يمكننا استخدام مسح الأعمدة ، بنفس الكيفية ، بدلا من مسح الصفوف .
كلا التقنيتين جيد على حد سواء .
بالنسبة لوحدات العرض الصغيرة ، يكون مسح الأعمدة سهل ، لأنك لن تكون مجبرا على معالجة بتات بيانات كثيرة ، ولكن كلما زاد طول الليد ماتريكس ، كان لزاما عليك مسح المزيد والمزيد من الأعمدة ويصبح العرض مرتعش . لذلك سوف نختار طريقة مسح الصفوف ، بحيث أن المفاهيم المكتسبة بالتطبيق على الشاشات ذات الحجم الصغير يمكن بسهولة تطبيقها على الشاشات ات الحجم الكبير .
كما ترى ، عند عرض صف واحد ، وبفرض أن جميع الليدات الموجودة بهذا الصف تكون فى حالة تشغيل on ، فإنه يمكن أن يكون هناك سحب كبير للتيار . على سبيل المثال ، إذا كان لدينا 16 ليد فى الصف الواحد وكل ليد يحتاج إلى حوالى 25 ملى أمبير للسطوع الكامل ، عندئذ نحن بحاجة إلى ما لا يقل عن “16X25=400mA" من التيار . لذلك يجب أن تكون دائرة مصدر التيار قادرة على توفير هذا التيار ، التقصير فى ذلك يتسبب فى إعتام إضاءة الليدات .
عادة تستخدم ترانزستورات لتوفير التيار اللازم لتشغيل الشاشة ، لأن تشغيلها من خلال أطراف الميكروكونترولر مباشرة يمكن أن يؤدى إلى تلف الميكروكونترولر .

خيارات تصميم الهاردوير :
الآن وبعد أن قررنا أننا سوف نقوم بمسح الصفوف ، فإننا نحتاج لمعرفة أفضل حل من أجل اختيار الصفوف وتمرير البيانات إلى الأعمدة . تذكر أنه ، على سبيل المثال ، فى شاشة 16x8 ، يكون لدينا 8 صفوف و16 عامود ( ممكن أن يكون 8 أعمدة ليدات حمراء و 8 أعمدة ليدات خضراء فى مصفوفة ليدات ذات لونين) . إذا استخدمنا ميكروكونترولر به عدد كبير نسبيا من خطوط الدخل/الخرج (مثل PIC16F877A) يمكننا استخدام منفذين من أجل الأعمدة بكل منفذ 8 بت ، ومنفذ 8 بت لمعالجة مسح الصفوف ، وهذا سوف يحتاج ما مجموعة 24 خط دخل/خرج . البرمجة سوف تكون بسيطة ، لأن تحديد بيانات الأعمدة سوف تأخذ 2 بايت لتمريرها على المنفذين ، ويمكن اختيار الصف بواسطة تحديد البت المناسب من المنفذ بواحد “1” فى حالة الأنود المشترك ، أو بصفر فى حالة الكاثود المشترك ، وبعد ذلك يتم زحزحة بيانات الأعمدة لموقع واحد عند كل تغيير للبيانات . هذا التصميم يتطلب ميكروكونترولر بعدد كبير من خطوط الدخل/الخرج ولا يمكن استخدام الشاشة مع ميكروكونترولر به عدد قليل من خطوط الدخل/الخرج . علاوة على ذلك ، إذا كنا بحاجة إلى توسيع الشاشة ، مثل وجود 4 أو 5 وحدات معا فى صف واحد طويل ، فمن الصعب توفر ميكروكونترولر به مثل هذا العدد الكبير من خطوط الدخل/الخرج . وبالتالى فإن هذه الطريقة خارج نطاق موضوعنا ، ولابد من حل هذه المشكلة ، وكان الحل فى استخدام مسجلات الأزاحة .

ثالثا :مسجلات الإزاحة والليد ماتريكس Shift Registers and LED Matrix (معالجة البيانات)
[/SIZE]

Admin
Admin

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

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

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

تدريب رقم 1 : توضيح فكرة المسح ، بعرض حرف ثابت على ليد ماتريكس 8X8 بتوصيل الصفوف والأعمدة مباشرة إلى أطراف منافذ الميكروكونتر

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 3:09 am

[SIZE="4"]تدريب رقم 1 : توضيح فكرة المسح ، بعرض حرف ثابت على ليد ماتريكس 8X8 بتوصيل الصفوف والأعمدة مباشرة إلى أطراف منافذ الميكروكونترولر (16 طرف) أى بدون استخدام دوائر متكاملة مساعدة :
البرنامج مع المترجم ميكروسى :


الكود:


/******************************************************
LED Matrix Display  , MIKROC , Basic Program
Display one fixed character : A
Rows scanning = PORTB connected to anodes ,
Data connected to PORTC , cathodes
*******************************************************/

//Character Bits Information as 8 byte array
//{0x3E,0x7E,0xC8,0xC8,0x7E,0x3E,0x00,0x00}, // A
 void main ()
{
TRISB=0;
TRISC=0;
PORTB=0;
PORTC=0;

  while(1)
  {
  PORTB=1;          //select row 1 , 0b00000001
  PORTC=~0x3E;       //Send inverse character data byte
  delay_ms(5);
  //============
  PORTB=2;          //select row 2 , 0b00000010
  PORTC=~0x7E;       //Send inverse character data byte
  delay_ms(5);
  //==================
  PORTB=4;          //select row 3 , 0b00000100
  PORTC=~0xC8;       //Send inverse character data byte
  delay_ms(5);
  //=====================
  PORTB=8;          //select row 4 , ......
  PORTC=~0xC8;       //Send character data byte
  delay_ms(5);
  //=====
  PORTB=16;          //select row 5 , .......
  PORTC=~0x7E;       //Send inverse character data byte
  delay_ms(5);
  //============
  PORTB=32;          //select row 6 , ......
  PORTC=~0x3E;       //Send inverse character data byte
  delay_ms(5);
  //==================
  PORTB=64;          //select row 7 , ......
  PORTC=(~0x00);       //Send inverse character data byte
  delay_ms(5);
  //=====================
  PORTB=128;          //select row 8 , 0b10000000
  PORTC=~0x00;       //Send inverse character data byte
  delay_ms(5);

  }
}

نتيجة المحاكاة :




[BLUE-MARK][/BLUE-MARK]
[/SIZE]

Admin
Admin

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

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

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

تدريب رقم 2 : استخدام المصفوفات arrays فى تبسيط و تحسين شكل البرنامج السابق :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 3:20 am

[SIZE="4"]تدريب رقم 2 : استخدام المصفوفات arrays فى تبسيط و تحسين شكل البرنامج السابق :
البرنامج :



الكود:

ED Matrix Display , MIKROC ,Using arrays
Display one fixed character : A
Rows scanning = PORTB connected to anodes ,
Data connected to PORTC , cathodes

*******************************************************/
//Define Matrix Character Information as 8 byte array
unsigned char font[8]={0x3E,0x7e,0xC8,0xC8,0x7E,0x3E,0x00,0x00}; // A
unsigned char row_select[8]={1,2,4,8,16,32,64,128};
unsigned char i ;
 void main ()
{
TRISB=0;
TRISC=0;
PORTB=0;
PORTC=0;

  while(1)
  {
   for(i=0 ; i<8 ; I++)
   {
   PORTB=row_select[i]; //select row as array element
   PORTC=~font[i];//send data to port C as array element
   delay_ms(5); // short delay
  }
      }
}




نتائج المحاكاة :




[/SIZE]

Admin
Admin

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

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

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

عرض النصوص Displaying Text :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 3:34 am

[SIZE="4"]عرض النصوص Displaying Text :
النص Text له وجهين (شكلين) :
• الوجه الأول هو النص نفسه ، والذى يتكون من أحرف كود أسكى ، ويمكن تخزينه فى شكل سلسلة نصية string
• الوجه الثانى هو التمثيل الرسومى graphic أو خريطة النقط bitmap .
التمثيل النقطى (خريطة النقط) لمجموعة معينة من الأحرف يسمى الخط أو الفونت font . يمكنك تحديد الفونت الخاص بك لتمثيل مجموعة من الأحرف .
تتكون مجموعة أحرف النص القياسية text من الأحرف الأبجدية والرقمية : 0-9, A-Z , a-z جنبا إلى جنب مع بعض الأحرف الخاصة مثل الفاصلة ، والفاصلة المنقوطة , والمسافة الفارغة ، إلخ .
فى البداية يمكننا تحديد عدد محدود وقليل من الأحرف ، مثل الحروف الكابيتال A-Z وتجاهل الأحرف الخاصة ، أو اختيار مجموعة أحرف أسكى الكاملة . لكن ، تذكر أنه كلما كانت مجموعة الأحرف أكبر كلما زاد التمثيل النقطى وبالطبع زادت مساحة التخزين المطلوبة لها .

التمثيل النقطى للحرف Bitmap of a character :
معظم أنظمة الشاشات ، مثل شاشات LCD أو الوحدات الطرفية تستخدم ماتريكس بتات نوع 5X7 لتمثيل وعرض الحرف . وهذا الحجم من المصفوفات يعتبر جيد إلى حد ما لعرض وتمثيل معظم الأحرف المستخدمة بشكل شائع . لكن يوجد الماتريكس 8X8 ، وهى بالتأكيد يمكن أن تستوعب التمثيل النقطى للماتريكس 5X7 بسهولة ، كما أنها تتيح لنا الحرية فى استخدام الماتريكس 8X8 بكاملها لعمل تمثيل نقطى أكثر تفصيلا (تجسيدا).
البداية تكون برسم ماتريكس من المربعات الفارغة على ورقة وملء المربعات المناسبة بنقط الرسم " تسمى بكسلات" pixels التى تريد تشغيلها (عرضها) ، كما فى الشكل التالى :




الآن لديك 8 بايت من البيانات ، كل بايت يمثل بتات بيانات الأعمدة لصف واحد . لذلك فإن " كل حرف من خط نوع 8X8 سوف يتطلب 8 بايت من البيانات" . مجموعة الحروف النقطية سوف تحتاج أن يتم تخزينها فى مكان ما ، يمكنك تخزينها كجزء من ذاكرة البرنامج كثوابت ، أو تخزينها فى الذاكرة EEPROM للميكروكونترولر . إذا سمح الهاروير الخاص بك ، فإن أفضل مكان يستخدم للتخزين هو ذاكرة خارجية EEPROM والتى تعتمد على الناقل I2C ، أو استخدام كارت تخزين بيانات SD . وهنا ، سنحاول تقليل الاعتماد على أجهزة الهاردوير الخارجية وسيتم تخزين الأحرف النقطية فى ذاكرة البرنامج كثوابت .
[/SIZE]

Admin
Admin

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

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

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

توليد التمثيل النقطى (الصورة النقطية) Bitmaps :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 3:53 am

[SIZE="4"]توليد التمثيل النقطى (الصورة النقطية) Bitmaps :

الآن يأتى السؤال الصعب عن كيفية توليد الصور النقطية لكل الأحرف النصية التى نريد أن تكون معتمدة بواسطة الشاشة الخاصة بنا .
الإسلوب المباشر والواضح هو أن تأخذ ورقة رسم بيانى وقلم رصاص ، وترسم الأحرف وتستنتج البتات الثمانية لكل حرف.
الإسلوب الثانى والأسهل نوعا ما ، هو العثور على البرنامج الذى يمكنه القيام بذلك نيابة عنك . هذا بالتأكيد خيار جيد . يوجد العديد من التطبيقات المتاحة على شبكة الإنترنت والتى بها شبكة من المربعات ، يمكنك فقط نقر المربعات التى تريد تشغيلها ، وسوف يقوم البرنامج بتوليد الصور النقطية نيابة عنك .
الإسلوب الثالث ، والأكثر انتشارا ، هو أن تقترض عمل شخص آخر ، ربما يوصف هذا النهج بالكسل ، ولكنك بحاجة إلى التركيز أكثر على جانب البرمجة بدلا من الجلوس لعدة أيام لتوليد الصور النقطية .
سوف نستخدم الخط 8x8 لأنه يمكن أن يعطى تفاصيل أكثر لنقط الحرف فيصبح واضحا bold ، بحيث يمكن قراءته جيدا من مسافة بعيدة .
فيما يلى الصور النقطية الكاملة لعدد 96 حرف ، كل حرف مكون من 8 بايت فى شكل مصفوفة ثنائية الأبعاد تحتوى على 96 صف و 8 أعمدة font[96][8] .
الحرف الأول هو "الفراغ" space ويقابله العدد العشرى 32 فى جدول حروف أسكى . وبالتالى فإن هذا الجدول يكون مزاحا بقيمة 32 عن أكواد أسكى للحروف . وبالتالى ، فإن الحرف الذى نريد عرضه يكون موجودا فى هذا الجدول عند " قيمة أسكى للحرف مطروحا منها 32 " . على سبيل المثال ، الحرف “A” قيمة أسكى له هى “65” ، لذلك فإن الصورة النقطية له فى الجدول سوف نجدها عند العنصر الذى ترتيبه “65-32=33” الثالث والثلاثين من مصفوفة الخطوط فى البعد الذى يمثل الصف . وبالتالى فإن عرض الثمانى بايتات من المصفوفة font[33][] سوف يعطينا الحرف “A” .

الكود:

{0x3e,0x7e,0xc8,0xc8,0x7e,0x3e,0x00,0x00}, // A

الآن ، علينا عمل ملف باسم font.h ونسخ الكود بكامله فيه . سوف نقوم بتضمين include هذا الملف فى البرنامج .

الكود:

// defines 8x8 ASCII characters 0x20-0x7F (32-127)
unsigned const char font[96][8] = {
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, //
{0x00,0x60,0xfa,0xfa,0x60,0x00,0x00,0x00}, // !
{0x00,0xe0,0xe0,0x00,0xe0,0xe0,0x00,0x00}, // "
{0x28,0xfe,0xfe,0x28,0xfe,0xfe,0x28,0x00}, // #
{0x24,0x74,0xd6,0xd6,0x5c,0x48,0x00,0x00}, // $
{0x62,0x66,0x0c,0x18,0x30,0x66,0x46,0x00}, // %
{0x0c,0x5e,0xf2,0xba,0xec,0x5e,0x12,0x00}, // &
{0x20,0xe0,0xc0,0x00,0x00,0x00,0x00,0x00}, // '
{0x00,0x38,0x7c,0xc6,0x82,0x00,0x00,0x00}, // (
{0x00,0x82,0xc6,0x7c,0x38,0x00,0x00,0x00}, // )
{0x10,0x54,0x7c,0x38,0x38,0x7c,0x54,0x10}, // *
{0x10,0x10,0x7c,0x7c,0x10,0x10,0x00,0x00}, // +
{0x00,0x05,0x07,0x06,0x00,0x00,0x00,0x00}, // ,
{0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00}, // -
{0x00,0x00,0x06,0x06,0x00,0x00,0x00,0x00}, // .
{0x06,0x0c,0x18,0x30,0x60,0xc0,0x80,0x00}, // /
{0x7c,0xfe,0x9a,0xb2,0xfe,0x7c,0x00,0x00}, // 0
{0x42,0x42,0xfe,0xfe,0x02,0x02,0x00,0x00}, // 1
{0x46,0xce,0x9a,0x92,0xf6,0x66,0x00,0x00}, // 2
{0x44,0xc6,0x92,0x92,0xfe,0x6c,0x00,0x00}, // 3
{0x18,0x38,0x68,0xc8,0xfe,0xfe,0x08,0x00}, // 4
{0xe4,0xe6,0xa2,0xa2,0xbe,0x9c,0x00,0x00}, // 5
{0x3c,0x7e,0xd2,0x92,0x9e,0x0c,0x00,0x00}, // 6
{0xc0,0xc6,0x8e,0x98,0xf0,0xe0,0x00,0x00}, // 7
{0x6c,0xfe,0x92,0x92,0xfe,0x6c,0x00,0x00}, // 8
{0x60,0xf2,0x92,0x96,0xfc,0x78,0x00,0x00}, // 9
{0x00,0x00,0x36,0x36,0x00,0x00,0x00,0x00}, // :
{0x00,0x05,0x37,0x36,0x00,0x00,0x00,0x00}, // ;
{0x10,0x38,0x6c,0xc6,0x82,0x00,0x00,0x00}, // <
{0x28,0x28,0x28,0x28,0x28,0x28,0x00,0x00}, // =
{0x00,0x82,0xc6,0x6c,0x38,0x10,0x00,0x00}, // >
{0x40,0xc0,0x8a,0x9a,0xf0,0x60,0x00,0x00}, // ?
{0x7c,0xfe,0x82,0xba,0xba,0xf8,0x78,0x00}, // @
{0x3e,0x7e,0xc8,0xc8,0x7e,0x3e,0x00,0x00}, // A
{0x82,0xfe,0xfe,0x92,0x92,0xfe,0x6c,0x00}, // B
{0x38,0x7c,0xc6,0x82,0x82,0xc6,0x44,0x00}, // C
{0x82,0xfe,0xfe,0x82,0xc6,0xfe,0x38,0x00}, // D
{0x82,0xfe,0xfe,0x92,0xba,0x82,0xc6,0x00}, // E
{0x82,0xfe,0xfe,0x92,0xb8,0x80,0xc0,0x00}, // F
{0x38,0x7c,0xc6,0x82,0x8a,0xce,0x4e,0x00}, // G
{0xfe,0xfe,0x10,0x10,0xfe,0xfe,0x00,0x00}, // H
{0x00,0x82,0xfe,0xfe,0x82,0x00,0x00,0x00}, // I
{0x0c,0x0e,0x02,0x82,0xfe,0xfc,0x80,0x00}, // J
{0x82,0xfe,0xfe,0x10,0x38,0xee,0xc6,0x00}, // K
{0x82,0xfe,0xfe,0x82,0x02,0x06,0x0e,0x00}, // L
{0xfe,0xfe,0x60,0x30,0x60,0xfe,0xfe,0x00}, // M
{0xfe,0xfe,0x60,0x30,0x18,0xfe,0xfe,0x00}, // N
{0x38,0x7c,0xc6,0x82,0xc6,0x7c,0x38,0x00}, // O
{0x82,0xfe,0xfe,0x92,0x90,0xf0,0x60,0x00}, // P
{0x78,0xfc,0x84,0x8e,0xfe,0x7a,0x00,0x00}, // Q
{0x82,0xfe,0xfe,0x98,0x9c,0xf6,0x62,0x00}, // R
{0x64,0xe6,0xb2,0x9a,0xde,0x4c,0x00,0x00}, // S
{0xc0,0x82,0xfe,0xfe,0x82,0xc0,0x00,0x00}, // T
{0xfe,0xfe,0x02,0x02,0xfe,0xfe,0x00,0x00}, // U
{0xf8,0xfc,0x06,0x06,0xfc,0xf8,0x00,0x00}, // V
{0xfe,0xfe,0x0c,0x18,0x0c,0xfe,0xfe,0x00}, // W
{0xc6,0xee,0x38,0x10,0x38,0xee,0xc6,0x00}, // X
{0xe0,0xf2,0x1e,0x1e,0xf2,0xe0,0x00,0x00}, // Y
{0xe6,0xce,0x9a,0xb2,0xe2,0xc6,0x8e,0x00}, // Z
{0x00,0xfe,0xfe,0x82,0x82,0x00,0x00,0x00}, // [
{0x80,0xc0,0x60,0x30,0x18,0x0c,0x06,0x00}, // "\"
{0x00,0x82,0x82,0xfe,0xfe,0x00,0x00,0x00}, // ]
{0x10,0x30,0x60,0xc0,0x60,0x30,0x10,0x00}, // ^
{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01}, // _
{0x00,0x00,0xc0,0xe0,0x20,0x00,0x00,0x00}, // `
{0x04,0x2e,0x2a,0x2a,0x3c,0x1e,0x02,0x00}, // a
{0x82,0xfc,0xfe,0x22,0x22,0x3e,0x1c,0x00}, // b
{0x1c,0x3e,0x22,0x22,0x36,0x14,0x00,0x00}, // c
{0x0c,0x1e,0x12,0x92,0xfc,0xfe,0x02,0x00}, // d
{0x1c,0x3e,0x2a,0x2a,0x3a,0x18,0x00,0x00}, // e
{0x12,0x7e,0xfe,0x92,0xc0,0x40,0x00,0x00}, // f
{0x19,0x3d,0x25,0x25,0x1f,0x3e,0x20,0x00}, // g
{0x82,0xfe,0xfe,0x10,0x20,0x3e,0x1e,0x00}, // h
{0x00,0x22,0xbe,0xbe,0x02,0x00,0x00,0x00}, // i
{0x02,0x23,0x21,0xbf,0xbe,0x00,0x00,0x00}, // j
{0x82,0xfe,0xfe,0x08,0x1c,0x36,0x22,0x00}, // k
{0x00,0x82,0xfe,0xfe,0x02,0x00,0x00,0x00}, // l
{0x3e,0x3e,0x30,0x18,0x30,0x3e,0x1e,0x00}, // m
{0x3e,0x3e,0x20,0x20,0x3e,0x1e,0x00,0x00}, // n
{0x1c,0x3e,0x22,0x22,0x3e,0x1c,0x00,0x00}, // o
{0x21,0x3f,0x1f,0x25,0x24,0x3c,0x18,0x00}, // p
{0x18,0x3c,0x24,0x25,0x1f,0x3f,0x21,0x00}, // q
{0x22,0x3e,0x1e,0x22,0x38,0x18,0x00,0x00}, // r
{0x12,0x3a,0x2a,0x2a,0x2e,0x24,0x00,0x00}, // s
{0x00,0x20,0x7c,0xfe,0x22,0x24,0x00,0x00}, // t
{0x3c,0x3e,0x02,0x02,0x3c,0x3e,0x02,0x00}, // u
{0x38,0x3c,0x06,0x06,0x3c,0x38,0x00,0x00}, // v
{0x3c,0x3e,0x06,0x0c,0x06,0x3e,0x3c,0x00}, // w
{0x22,0x36,0x1c,0x08,0x1c,0x36,0x22,0x00}, // x
{0x39,0x3d,0x05,0x05,0x3f,0x3e,0x00,0x00}, // y
{0x32,0x26,0x2e,0x3a,0x32,0x26,0x00,0x00}, // z
{0x10,0x10,0x7c,0xee,0x82,0x82,0x00,0x00}, // {
{0x00,0x00,0x00,0xee,0xee,0x00,0x00,0x00}, // |
{0x82,0x82,0xee,0x7c,0x10,0x10,0x00,0x00}, // }
{0x40,0xc0,0x80,0xc0,0x40,0xc0,0x80,0x00}, // ~
{0x1e,0x3e,0x62,0xc2,0x62,0x3e,0x1e,0x00}, //
};

[/SIZE]

Admin
Admin

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

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

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

تدريب رقم 3 : استخدام ملف الخط font.h لعرض أى حرف من اختيارنا :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 4:08 am

[SIZE="4"]تدريب رقم 3 : استخدام ملف الخط font.h لعرض أى حرف من اختيارنا :

الكود:

/******************************************************
LED Matrix Display , MIKROC ,Using arrays and ASCII FONT
Display one fixed character : A
Rows scanning = PORTB connected to anodes ,
Data connected to PORTC , cathodes

*******************************************************/
//Define Matrix Character Information as 8 byte array
#include "font.h"
char row_select[8]={1,2,4,8,16,32,64,128};
char i ;
 void main ()
{
TRISB=0;
TRISC=0;
PORTB=0;
PORTC=0;

  while(1)
  {
   for(i=0 ; i<8 ; I++)
   {
   PORTB=row_select[i]; //select row as array element
   PORTC=~font['A'-32][i];//send data to port C as array element
   delay_ms(5); // short delay
  }
      }
}



نتائج المحاكاة :


[/SIZE]

Admin
Admin

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

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

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

ثالثا : معالجة البيانات بمسجلات الإزاحة والليد ماتريكس Shift Registers and LED Matrix

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 12:33 pm

ثالثا : معالجة البيانات بمسجلات الإزاحة والليد ماتريكس Shift Registers and LED Matrix
مسجلات الإزاحة يمكن أن تأخذ بيانات تسلسلية (متتالية) بت تلو البت (بت واحد فى كل مرة) ، وتقوم بإزاحة هذه البتات مثل السير الناقل ، وتعطى النتيجة فى شكل خرج متوازى على أطرافها ، ولذلك فهى تسمى مسجلات إزاحة دخل تسلسلى خرج متوازى .



أهم ميزة لهذه المسجلات أنه يمكن توصيلها معا على التتابع cascaded لعمل سلسلة طويلة طويلة تسمى "سلسلة ديزى" daisy chain (عنقودية ، ملضومة مثل العنقود) .
كل ما تحتاجه هذه السلسلة هو ثلاثة أسلاك من أجل المدخلات ، سلك (خط) من أجل تطبيق بت البيانات data bit ، والثانى من أجل بت الساعة clock bit لزحزحة بت البيانات بالتزامن مع الساعة (الشكل التسلسلى) ، والثالث من أجل بت المزلاج latch bit ، وهى نبضة تعطى عندما يتم إرسال كافة البيانات ، وهذه النبضة تجعل البيانات تظهر على أطراف الخرج فى الشكل المتوازى .
يوجد العديد من مسجلات الإزاحة المتاحة ، لكن الأكثر استخداما هى الدائرة المتكاملة 74HC595 . على سبيل المثال ، إذا تم توصيل اثنين من مسجلات الإزاحة هذه على التتابع ، فسوف نكون قادرين على أن نرسل 16 بت من البيانات باستخدام ثلاثة خطوط فقط من خطوط الدخل / الخرج الرقمى ، والتى لا تشكل مشكلة كبيرة على الميكروكونترولر حتى الصغير منها .

عملية مسح الصفوف Scanning Rows :

Admin
Admin

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

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

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

عملية مسح الصفوف Scanning Rows :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 12:39 pm

[SIZE="4"]عملية مسح الصفوف Scanning Rows :
الآن القضية هى اختيار الصفوف ، لأن لدينا 8 صفوف وعلينا اختيار صف واحد فى كل مرة ، فلدينا العديد من الخيارات ، وسوف نستعرض بعضها :
1- استخدام الدائرة المتكاملة CD4017 :
وهى عداد عشرى ، فهى تأخذ خط دخل/خرج واحد لنبضات الساعة الخاصة بها CLK ، وتقوم بتحديد مخارجها بالحالة المرتفعة مخرج تلو الآخر بعد كل نبضة ساعة ، بعد 10 نبضات ساعة سوف تبدأ الدورة من جديد بالخرج الأول .
لكن ، هناك مشكلتين ، المشكلة الأولى أن لها 10 مخارج ونريد إعادة توقيتها مرة أخرى إلى خط المخرج الأول بعد 8 مخارج فقط ، حسنا ، يمكننا إعطاء نبضتين إضافيتين بعد الثمانى نبضات ، وهذا لا يشكل مشكلة كبيرة .
المشكلة الثانية ، عند بداية إمدادها بالقدرة الكهربية ، تكون المخارج فى حالة غير معروفة ، فلا يمكننا أبدا معرفة كيفية جعل المخرج الأول مرتفعا . لحسن الحظ يوجد طرف إعادة التعيين Reset(MR) ، والذى عندما يتم توقيته (تفعيله) سوف يعيد الدائرة المتكاملة إلى حالة الصفر ، وهو ما يكون مناسب بالنسبة لنا ، وبالتالى فسوف نستخدم خطى دخل/خرج واحد للساعة والآخر للإعادة ، ويمكن استخدام الثمانى مخارج Q0-Q7 لاختيار الصفوف بشكل فردى .



لكن ، ماذا لو قررنا فى وقت لاحق استخدم صفين من ليد ماتريكس 8x8 لعمل شاشة عريضة 16x32 ؟ يمكن لأحدنا أن يفكر فى توصيل دائرتين متكاملتين CD4017 على التتابع ، وهذا مقبول ، ولكن عندما يتم توقيت المرة الحادية عشرة فإن الدائرة المتكاملة التالية سوف تحصل على نبضة وتخطو خطوة إلى الأمام ، لكن الشريحة الأولى سوف يتم إعادة تعيينها مرة أخرى لاختيار الصف الأول ، وبالتالى سوف يكون لدينا صفين مختارين ونحصل على سلوك غير مرغوب فيه . لذلك فإن هذا الخيار يكون غير جيد إذا كنا نريد توسيع التصميم .

2- استخدام دائرة متكاملة لحل الشفرة من 3 إلى 8 خط (الدائرة المتكاملة 74HC138 ) :
ثمة خيار آخر وهو استخدام دائرة متكاملة لحل الشفرة 3 إلى 8 خط . هذه الدائرة المتكاملة تأخذ ثلاثة مدخلات رقمية ، والرقم الثنائى الذى يتم وضعه على هذه الخطوط الثلاثة سوف يحدد الخرج المقابل . على سبيل المثال ، إذا وضع الرقم الثنائى “101” ، وحيث أن هذا الرقم الثنائى يناظر الرقم العشرى “5” فسوف يتم اختيار الخرج “Y5” . هذه الشريحة ، على وجه الخصوص ، تقوم بتحديد الطرف المختار بالحالة المنخفضة ، وجميع الأطراف الأخرى بالحالة المرتفعة ، وهو ما يعتبر ترتيب جيد للتشغيل باستخدام 8 ترانزستورات نوع PNP (الجهد المنخفض على قاعدة هذا النوع يؤدى إلى توصيله) ، كما أنه يمكننا إيجاد دائرة متكاملة لحل شفرة 3 إلى 8 خط بمخارج مرتفعة فى الحالة الفعالة والتى يمكن استخدامها مباشرة لتشغيل صفوف الشاشة .
بالمثل الدائرة المتكاملة 74HC154 ، وهى لحل شفرة 4 إلى 16 خط (بت) . فهى يمكن أن تقبل رقم ثنائى مكون من 4 بت على مداخلها الأربعة لاختيار واحد من مخارجها الستة عشر .









3- استخدام مسجلات إزاحة على التتابع Using Cascaded Shift Registers :
[/SIZE]

Admin
Admin

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

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

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

3- استخدام مسجلات إزاحة على التتابع Using Cascaded Shift Registers :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 12:42 pm

[SIZE="4"]
3- استخدام مسجلات إزاحة على التتابع Using Cascaded Shift Registers :
الخيار الأخير هو استخدام مسجل إزاحة آخر لاختيار الصف . نظرا لأنه يتم اختيار صف فى كل مرة يتم فيها إرسال بيانات الأعمدة ، فليس هناك حاجة لتشغيل مسجلات الإزاحة بشكل منفرد ، ويمكننا توصيلها معا على التتابع ، ووضع نبضات الساعة (توقيت البيانات) على مسجل الإزاحة الأول ، وإرسال 3 بايت (24 بت) ، على سبيل المثال ، أول 2 بايت تحتوى على بيانات الأعمدة والبايت الأخير يحتوى على بتات اختيار الصف . بهذه الطريقة فإننا سوف نحتاج فقط إلى 3 خطوط دخل/خرج من الميكروكونترولر لتشغيل الشاشة بالكامل ، حتى إذا قمت بإضافة المزيد من الوحدات لجعل الشاشة أطول، فقط كل ما عليك هو إضافة المزيد من مسجلات الإزاحة ، لكن لا زلت تحتاج فقط إلى 3 خطوط دخل/خرج وهى : البيانات Data والساعة Clock و المزلاج Latch .
إذا تم استخدام هذا التكوين ، فإنه لاختيار صف row فإنه سوف يتم تحديد البت المقابلة بمسجل الإزاحة الخاص بالصفوف بواحد “1” (أنود مشترك)، ولاختيار عامود فسوف يتم تحديد بت مسجل الإزاحة الخاص بالأعمدة بصفر “0” (كاثود مشترك) . عند استخدام مسجل الإزاحة 74HC595 فإن خطوط الدخل/الخرج الخاصة به لديها القدرة على تداول التيار الكافى لصف كامل به 16 ليد فى حالة تشغيل . يمكنك إضافة ترانزستورات تقوية من أجل الصفوف إذا كنت بحاجة إلى إضافة المزيد من الوحدات معا وهو ما يحتاج إلى المزيد من القدرة لإضاءة العديد من الليدات فى نفس الصف . عموما إضافة الترنزستور تحسن درجة السطوع .
فيما يلى مثال لشاشة تحتوى على وحدتين ليد ماتريكس 8x8 . لاحظ أن مخطط الدائرة للشاشة فقط وأنه لا يتضمن أى ميكروكونترولر ، حتى يبقى الخيار متروك لك .



فى المخطط أعلاه ، يظهرالليد ماتريكس كوحدتين منفصلتين ، فى حين أنهما فى الواقع يمكن أيضا أن يكونان وحدة واحدة ذات لونين ، ولكننا سوف نعتبرهما كوحدتين منفصلتين ، والصفوف ذات الأنودات المشتركة متصلة مع بعضها على التوازى ، لتشكل 8 صفوف ، فى حين أن الأعمدة ذات الكاثودات المشتركة تكون منفصلة عن بعضها البعض ، لتشكل 16 عامود .

فهم المزيد عن مسجل الإزاحة 74HC595 :
[/SIZE]

Admin
Admin

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

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

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

فهم المزيد عن مسجل الإزاحة 74HC595 :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 12:46 pm


[SIZE="4"]فهم المزيد عن مسجل الإزاحة 74HC595 :
حيث أن شاشتنا سوف تعتمد بشكل كبير على مسجلات الإزاحة ، فإنه من المناسب مراجعة قليل من المعلومات حول هذا العنصر . يمكن اعتبار مسجلات الإزاحة على أنها محولات بيانات من تسلسلى إلى متوازى ، فهى تأخذ دخل البيانات تسلسليا على خط بيانات واحد ، وتظهر النتائج على خرجها كبايت كامل .








مسجل الإزاحة 74HC595 بداخله سلسلة من 8 مواقع ذاكرة "تسمى مسجلات الإزاحة shift registers والتى يمكن أن تمرر البتات المرسلة من خلال أول موقع ذاكرة إلى الموقع التالى ، تماما مثل عملية "الدفع" push ، فعند وصول بت جديدة إلى الموقع الأول يتم زحزحة جميع البتات بخطوة إلى المستوى التالى نتيجة لتطبيق نبضة على طرف الساعة .
المزلاج (القفل) latch هو ذاكرة خاصة ، والتى عند تفعيلها تأخذ لقطة (نسخة) من ذاكرات مسجلات الإزاحة وتظهرها على ثمانى مخارج . بعد ذلك ، إذا تغيرت قيم ذاكرات مسجلات الإزاحة فإن هذا التغيير لا ينعكس على أطراف الخرج حتى يتم تفعيل المزلاج مرة أخرى . وهذه تعتبر آلية جيدة ، لأنها لن تظهر البتات المزاحة على المخارج إلا عندما ينتهى إرسال البيانات التى نرغب فى أن تنعكس على المخارج .
ذاكرة المزلاج لديها خرج تحكم إضافى يسمى "تمكين الخرج" output enable . عندما يكون هذا الخط منخفضا فإن ذاكرة المزلاج تعكس آحاد 1s أوتعكس أصفار 0s على المخارج ، وعندما يكون هذا الخط مرتفعا فإن أطراف المخارج تكون عمليا مفصولة عن الذاكرة ، ولا تكون واحد ولا صفر . ببساطة يقال أنها فى الحالة الثالثة ، والتى تسمى "محايدة" . سوف نقوم بتوصيل هذا الطرف ، فى جميع مسجلات الإزاجة ، بشكل دائم إلى الأرضى ، بحيث يتم تمكين الخرج بشكل دائم ( إذا أردنا التحكم فى السطوع الكامل للشاشة من خلال البرمجيات يمكنك توصيل هذا الطرف بخرج فى شكل تعديل عرض النبضة PWM للتحكم فى شدة الإضاءة ، وهذا من شأنه يحتاج إلى خط دخل / خرج آخر من الميكروكونترولر ) .
الطرف RST هو طرف إعادة التعيين reset ، عندما يعطى نبضة صغيرة من المنطق “0” سوف يقوم بتحديد جميع مسجلات الأزاحة بأصفار ، سوف نقوم بتوصيل مثل هذا الطرف بالمنطق “1” بشكل دائم لأننا لا نرغب فى إعادة تعيين مسجلات الإزاحة .
الآن جاء دور طرف البيانات التسلسلية DS ، فبغض النظر عن البيانات المقدمة ، سواء واحد أو صفر ، فسوف تأخذ طريقها إلى موقع الذاكرة الأول فى مسجلات الإزاحة . يحدث ذلك عندما يتم إعطاء خط ساعة الإزاحة SHIFT CLOCK نبضة تتحول من الصفر إلى الواحد وتعود مرة أخرى إلى الصفر . هذه النبضة سوف تقوم أيضا بزحزحة محتويات مسجلات الإزاحة الأخرى إلى المستويات التالية بخطوة . كل هذه الإزاحات سوف تجرى داخل مسجلات الإزاحة والنتائج سوف لن تظهر على أطراف المخارج . عندما يكتمل ملو (حشو) البيانات اللازمة ، فإن تطبيق نبضة ، تنتقل من الصفر إلى الواحد وتعود مرة أخرى إلى الصفر ، على طرف ساعة المزلاج LATCH CLOCK سوف تؤدى إلى نسخ بيانات مسجلات الإزاحة إلى أطراف الخرج والحفاظ عليها (مزلاج) هناك بغض النظر عن ما يحدث فى مسجلات الإزاحة .



إزاحة البيانات إلى مسجل الإزاحة التالى :
[/SIZE]

Admin
Admin

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

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

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

إزاحة البيانات إلى مسجل الإزاحة التالى :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 12:49 pm

[SIZE="4"]إزاحة البيانات إلى مسجل الإزاحة التالى :
الآن عرفنا كيف يتم إزاحة البيانات داخل مسجل الإزاحة 74HC595 ، فكيف يتم تشكيل سلسلة منها ، بحيث يمكن إزاحة بتات البيانات إلى مسجل الإزاحة التالى ، وهذا من شأنه سوف يكون فعال فى تحويل مسجل الإزاحة 8 بت إلى مسجل إزاحة 16 أو 24 أو حتى 32 بت .



مسجل الإزاحة يحتوى على 8 مخارج من Q0 إلى Q7 وخرج إضافى Q7’ . هذا الخرج غير موصل إلى المزلاج ولكنه امتداد مباشر لمسجلات الإزاحة الداخلية . لذلك عندما يتم نقل الثمانى بتات فإن الإزاحة فى البت التاسعة سوف تتسبب فى ظهور بت على الطرف Q7’ ، والتى يمكن تغذيتها مباشرة إلى طرف البيانات التسلسلية DS لمسجل الإزاحة التالى . يمكن توصيل أطراف ساعة الإزاحة SHIFT CLOCK و ساعة المزلاج LATCH CLOCK معا وتوقيتها فى وقت واحد . بهذه الطريقة يمكن إنشاء سلسلة غير منتهية بتوصيل مسجلات الإزاحة 74HC595 معا للحصول على مخارج متوازية طويلة .
[/SIZE]

Admin
Admin

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

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

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

رابعا : إعداد الميكروكونترولر : و إنشاء دالة زحزحة البيانات إلى الخارج SH_OUT :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:24 pm

[SIZE="4"]رابعا : إعداد الميكروكونترولر : إنشاء دالة زحزحة البيانات إلى الخارج SH_OUT :

كل ما تحتاجه من الميكروكونترولر هو ثلاثة خطوط دخل / خرج : خط من أجل البيانات data ، وخط من أجل ساعة مسجل الإزاحة ، وخط من أجل ساعة المزلاج (الماسك) . يمكنك استخدام أى ميكروكونترولر ، هنا سوف نستخدم الميكروكونترولر PIC16F877A . وسوف يتم توصيل طرف البيانات التسلسلية DS إلى الطرف RC0 , وطرف ساعة مسجل الإزاحة CLK إلى الطرف RC1 ، وطرف ساعة المزلاج إلى الطرف RC2 .


إنشاء دالة زحزحة البيانات إلى الخارج SH_OUT :

الكود:

void SH_OUT (unsigned char d)
{
short j;
for(j=0;j<8;j++)                // Shift out 8 bits
{
PORTC.B0= d & 1 ;             // test least significant bit if it is 1
PORTC.B1=1;   PORTC.B1=0;    // clock
d=d >> 1;             // shift bits to right by 1 to get next bit
}
}


شرح الدالة SH_OUT () :
كيف تقوم هذه الدالة بإرسال البتات من البايت !!

فى البداية يتم تعريف دالة باسم SH_OUT تقبل (تمرر) بايت واحد ( مثل الصفر و 255 أو أى توليفة أخرى بينهما ) فى شكل متغير محلى يسمى “d” نوع unsigned char لأننا نريد أن نستخدم جميع البتات الثمانية .
بعد ذلك نريد أن نزحزح بتات هذا البايت ، بت تلو البت ، إلى الخارج بدءا من البت ذات القيمة الأدنى bit 0 للمتغير d . يمكن القيام بذلك بعمل اختبار لهذه البت ، إذا ما كانت بواحد أو كانت بصفر ، وذلك عن طريق أجراء عملية AND المنطقية للبايت مع العدد واحد 1(0000001) . وتكون الإجابة (النتيجة) بواحد إذا كانت البت ذات القيمة الأدنى للمتغير d بواحد وبصفر إذا كانت البت بصفر .

الكود:

PORTC.B0= d & 1 ;

نقوم بوضع نتيجة هذا الاختبار فى بت البيانات PORTC.B0 ، ثم بعد ذلك نعطى نبضة ساعة لمسجل الإزاحة فى شكل مستوى مرتفع ثم مستوى منخفض على الطرف PORTC.B1 . وهذا من شأنه نقل (وضع) البت الأولى إلى موقع الذاكرة الأول لسلسة سجلات الإزاحة .

الكود:

PORTC.B1=1;   PORTC.B1=0;

نحن بحاجة إلى تكرار نفس العملية للبت الثانى للمتغير d ، وهو البت bit 1 ، لذلك نقوم بإزاحة المتغير d إلى اليمين ببت واحدة d >> 1 ، وهذا من شأنه تحريك بتات المتغير d بمكان واحد والآن البت الثانية bit 1 أصبحت فى مكان البت الأدنى قيمة ، وتكرار العملية السابقة يؤدى إلى دفع البت الثانية فى سلسلة مسجلات الإزاحة .

الكود:

d=d >> 1;

نقوم بتكرار هذه العملية 8 مرات بغرض زحزحة البايت بكامله للخارج .

الكود:


short j;
for(j=0;j<8;j++)                // Shift out 8 bits
{
PORTC.B0= d & 1 ;             // test least significant bit if it is 1
PORTC.B1=1;   PORTC.B1=0;    // clock
d=d >> 1;             // shift bits to right by 1 to get next bit
}


بعد استدعاء هذه الدالة عدد من المرات يساوى عدد البايتات المراد زحزحتها إلى الخارج ، يتم تطبيق نبضة مزلاج latch على طرف ساعة المزلاج ST_CLOCK وهذا من شأنه نقل بيانات 24 بت إلى أطراف خرج مسجلات الأزاحة الثلاثة وبالتالى إلى وحدات شاشة العرض .



التدريب الرابع : إنشاء واستخدام دالة الزحزحة إلى الخارج :
[/SIZE]

Admin
Admin

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

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

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

التدريب الرابع : إنشاء واستخدام دالة الزحزحة إلى الخارج :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:28 pm

[SIZE="4"][SIZE="4"]التدريب الرابع : إنشاء واستخدام دالة الزحزحة إلى الخارج :
البرنامج :[/SIZE]

الكود:


/******************************************************
LED Matrix Display , MIKROC ,Using Shift register 74595
Display one fixed character : A
Rows scanning = PORTB connected to anodes ,
Data connected to PORTC , cathodes

*******************************************************/
//Define Matrix Character Information as 8 byte array
#include "font.h"
char row_select[8]={1,2,4,8,16,32,64,128};
char i ;
//===============================
void SH_OUT(unsigned char d)
{
short j;
for(j=0;j<8;j++) // Shift out 8 bits
{
PORTC.B0= d & 1 ; // test least significant bit if its 1
PORTC.B1=1;PORTC.B1=0; // clock
d=d >> 1; // shift bits to right by 1 to get next bit
}
}
//=========================================

 void main ()
{
TRISB=0;
TRISC=0;
PORTB=0;
PORTC=0;

  while(1)
  {
   for(i=0 ; i<8 ; i++)
   {
   PORTB=row_select[i]; //select row as array element
   SH_OUT(~font['A'-32][i]); // shift out character as 8 byte ,8-bit each
   PORTC.B2=1;PORTC.B2=0; // Pulse the latch pin
   delay_ms(5); // short delay
  }
  }
}

نتيجة المحاكاة :







[/SIZE]

Admin
Admin

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

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

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

التدريب الخامس : استخدام سلسلة مكونة من مسجل إزاحة للبيانات ومسجل إزاحة لاختيار الصف :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 2:45 pm

[SIZE="4"]التدريب الخامس : استخدام سلسلة مكونة من مسجل إزاحة للبيانات ومسجل إزاحة لاختيار الصف :
البرنامج :

الكود:


//Define Matrix Character Information as 8 byte array
#include "font.h"
char row_select[8]={1,2,4,8,16,32,64,128};
char i ;
//===============================
void SH_OUT(unsigned char d)
{
short j;
for(j=0;j<8;j++) // Shift out 8 bits
{
PORTC.B0= d & 1 ; // test least significant bit if its 1
PORTC.B1=1;PORTC.B1=0; // clock
d=d >> 1; // shift bits to right by 1 to get next bit
}
}
//=========================================

 void main ()
{
TRISC=0;
PORTC=0;

  while(1)
  {
        for(i=0 ; i<8 ; i++)
        {
        SH_OUT(~font['A'-32][i]); // shift out character as 8 byte ,8-bit each
        SH_OUT(row_select[i]); //select row
        PORTC.B2=1;PORTC.B2=0; // Pulse the latch pin
        delay_ms(5); // short delay
  }
  }
}


نتيجة المحاكاة :






[/SIZE]

Admin
Admin

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

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

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

التدريب السادس : عرض العديد من الحروف واحدا تلو الآخر :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 5:20 pm

[SIZE="4"]التدريب السادس : عرض العديد من الحروف واحدا تلو الآخر :
البرنامج :

الكود:


#include "font.h"
char row_select[8]={1,2,4,8,16,32,64,128};
char i,character,repeat ;
//===============================
void SH_OUT(unsigned char d)
{
short j;
for(j=0;j<8;j++) // Shift out 8 bits
{
PORTC.B0= d & 1 ; // test least significant bit if its 1
PORTC.B1=1;PORTC.B1=0; // clock
d=d >> 1; // shift bits to right by 1 to get next bit
}
}
//=========================================

 void main ()
{
TRISC=0;
PORTC=0;

  while(1)
  {
  for(character=0;character<=96;character++)
  {
  for(repeat=0;repeat<100;repeat++)
  {
        for(i=0 ; i<8 ; i++)
        {
        SH_OUT(~font[character][i]); // shift out character as 8 byte ,8-bit each
        SH_OUT(row_select[i]); //select row
        PORTC.B2=1;PORTC.B2=0; // Pulse the latch pin
        delay_ms(1); // short delay
      }
      }

  }
  }
}

نتيجة المحاكاة :





















[/SIZE]

Admin
Admin

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

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

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

التدريب السابع : إنشاء شاشة ليد ماتريكس 8x16 (8 صفوف و 16 عامود ) مع استخدام ثلاثة مسجلات إزاحة 74595 :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 11:32 pm

التدريب السابع : إنشاء شاشة ليد ماتريكس 8x16 (8 صفوف و 16 عامود ) مع استخدام ثلاثة مسجلات إزاحة 74595 :
فى هذا التدريب سوف يكون لدينا ثلاثة مسجلات إزاحة 74595 على التوالى ، وسوف نقوم دائما برحزحة 3 بايت من البيانات ، البايت الأول لكاثودات وحدة الليد ماتريكس الأولى ( يمكن أن تكون الخضراء فى الوحدات ثنائية اللون) ، والبايت الثانى لكاثودات وحدة الليد ماتريكس الثانية ( يمكن أن تكون الحمراء) ، والبايت الثالث لاختيار أنودات الصف المشترك .  
البايت الأول والبايت الثانى سوف يحتوى على المنطق صفر لتفعيل العامود المناظر ، فى حين أن بت اختيار الصف سوف تكون عند المنطق واحد لتشغيل الصف .
سوف يتم إرسال البيانات باستخدام ثلاثة أطراف معرفة بشكل عام ، وهى فى حالتنا RC0, RC1 , RC2 .

تعديل دالة الزحزحة لكى تتعامل مع زحزحة 3 بايت فى نفس الوقت :
فى بداية البرنامج سوف يتم إعادة تسمية أطراف الميكروكونترولر المستخدمة بأسماء تدل على عملها :

الكود:


sbit Mat_DS at PORTC.B0;
sbit Mat_CLK at PORTC.B1;
sbit Mat_LAT at PORTC.B2;
sbit Tris_Mat_DS at TRISC.B0;
sbit Tris_Mat_CLK at TRISC.B1;
sbit Tris_Mat_LAT at TRISC.B2;

ثم إعلان المصفوفات والمتغيرات :

الكود:


unsigned char mat_row[8]={1,2,4, 8,16,32,64,128 };
unsigned char mat_r[8]={0,0,0,0,0,0,0,0};
unsigned char mat_g[8]={0,0,0,0,0,0,0,0};

وتكون دالة الزحزحة بالشكل التالى :

الكود:


// Shift out the data to three shift registers
// the active column is 0 on shift registers whereas it is 1 in our array
// therefore the values are inverted first before shifting out

void SH_OUT(unsigned char row, unsigned char green, unsigned char red)
{
short j;
//1- invert bits because led is on when bit is 0 (sink)
green = ~green;
red=~red;
// 2-Shift out red First
for(j=0;j<8;j++)
{
Mat_DS= red & 1 ; // test least significant bit if it’s 1
Mat_CLK=1;Mat_CLK=0; // clock
red=red >> 1; // shift bits to right by 1 to get next bit
}
// 3- Shift Out Green
for(j=0;j<8;j++) {
Mat_DS= green & 1 ; // test least significant bit if it’s 1
Mat_CLK=1;Mat_CLK=0; // clock
green=green >> 1; // shift bits to right by 1 to get next bit
}

// 4-Shift Out Row select
// The row bits are 1 to select a row, therefore they don’t need to be inverted
for(j=0;j<8;j++)
{
Mat_DS= row & 1 ; // test least significant bit if it’s 1
Mat_CLK=1;Mat_CLK=0; // clock
row=row >> 1; // shift bits to right by 1 to get next bit
}
// 5- Clock Latch to appear data.
Mat_LAT=1;Mat_LAT=0;
}


هذه هى الدالة الأكثر أهمية لأنها تقبل ثلاثة بايتات من البيانات كبارامترات row , red , green ، ونقلها فى شكل بت bit واحد فى كل مرة (بت تلو البت) خلال مسجلات الإزاحة .
لاحظ أن البيانات فى مسجلات الإزاحة لكل من red و green يكون لها المنطق صفر “0” لجعل الليد فى حالة توصيل ON ( الكاثود المشترك لليدات) ، فى حين أنها تكون عند المنطق واحد “1” فى خريطة نقط الصورة ، لذلك قمنا بعكس البيانات قبل إرسالها بالعامل “~” كما يلى :  

الكود:

green = ~green;

وهذا من شأنه تحويل جميع الآحاد 1s إلى أصفار 0s وجميع الأصفار إلى آحاد .
نموذج هذه الدالة يكون بالشكل التالى :

الكود:

void SH_OUT(unsigned char row, unsigned char green, unsigned char red);

البرنامج :


عدل سابقا من قبل Admin في الجمعة يوليو 31, 2015 11:38 pm عدل 1 مرات

Admin
Admin

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

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

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

البرنامج :

مُساهمة من طرف Admin في الجمعة يوليو 31, 2015 11:37 pm

البرنامج :

الكود:

//======= Definitions ============
sbit Mat_DS at PORTC.B0;
sbit Mat_CLK at PORTC.B1;
sbit Mat_LAT at PORTC.B2;
sbit Tris_Mat_DS at TRISC.B0;
sbit Tris_Mat_CLK at TRISC.B1;
sbit Tris_Mat_LAT at TRISC.B2;
//========================
unsigned char mat_row[8]={1,2,4, 8,16,32,64,128 };// row selection array
unsigned char mat_r[8]= {0x3e,0x7e,0xc8,0xc8,0x7e,0x3e,0x00,0x00}; // A , red character array
unsigned char mat_g[8]= {0x82,0xfe,0xfe,0x92,0x92,0xfe,0x6c,0x00}; // B , green character array
/===============================
void SH_OUT(unsigned char row, unsigned char green, unsigned char red); // SH_OUT function
//================= main function ====================
 void main ()
{
TRISC=0;
PORTC=0;

  while(1)
  {
        for(i=0 ; i<8 ; i++)
        {
        SH_OUT(mat_row[i], mat_g[i], mat_r[i]); //
        PORTC.B2=1;PORTC.B2=0; // Pulse the latch pin
        delay_ms(1); // short delay
      }
  }
}
//=================================
// Shift out the data to three shift registers
// the active column is 0 on shift registers whereas it is 1 in our array
// therefore the values are inverted first before shifting out

void SH_OUT(unsigned char row, unsigned char green, unsigned char red)
{
short i,j;
//1- invert bits because led is on when bit is 0 (sink)
green = ~green;
red=~red;
// 2-Shift out red First
for(j=0;j<8;j++)
{
Mat_DS= red & 1 ; // get LSB
Mat_CLK=1;Mat_CLK=0; // clock
red=red >> 1; // shift bits to right by 1 to get next bit
}
// 3- Shift Out Green
for(j=0;j<8;j++) {
Mat_DS= green & 1 ; //
Mat_CLK=1;Mat_CLK=0; // clock
green=green >> 1; // shift bits to right by 1 to get next bit
}

// 4-Shift Out Row select
// The row bits are 1 to select a row, therefore they don't need to be inverted
for(j=0;j<8;j++)
{
Mat_DS= row & 1 ; // test least significant bit if it's 1
Mat_CLK=1;Mat_CLK=0; // clock
row=row >> 1; // shift bits to right by 1 to get next bit
}
// 5- Clock Latch to appear data.
Mat_LAT=1;Mat_LAT=0;
}
//===================


نتيجة المحاكاة :


Admin
Admin

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

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

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

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

- مواضيع مماثلة

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