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

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,894
نشاط [ F.Abdelaziz ]
قوة السمعة:333
قديم 03-02-2020, 05:16 PM المشاركة 1   
افتراضي الليد ماتريكس LED Matrix 8X8 ومشغل الليدات MAX7219 Driver والاردوينو وArduino وتحريك Twitter FaceBook Google+



الليد ماتريكس LED Matrix 8X8 ومشغل الليدات MAX7219 Driver والاردوينو وArduino وتحريك النصوص

الجزء الأول : الأجهزة (الهاردوير) :
في هذا التدريب ، ستتعلم كيفية استخدام وحدة (موديول) مصفوفة ليدات (ليد ماتريكس) 8 × 8 مع الدائرة المتكاملة MAX7219 . في النهاية ، ستتمكن من عرض أي شكل shape أو نص text على مصفوفة ليدات واحدة أو أكثر بسهولة بشكل ثابت fixed أو متحرك scrolled ، باستخدام 3 أطراف رقمية فقط من الاردوينو.
ما هى مصفوفة الليدات (الليد ماتريكس) Dot LED Matrix ؟
هى عبارة عن مصفوفة من الليدات التي يمكنك عرض أرقام وحروف وأشكال معينة عليها. تعرف مصفوفات الليدات بعدد الصفوف rows والأعمدة Columns النوع الأكثر شيوعًا من مصفوفة اللليدات هو النوع 8 × 8 ، والذي يوفر 64 ليد في 8 صفوف و 8 أعمدة.



للتحكم في مصفوفة ليدات 8 × 8 ببساطة ، يجب عليك توصيل كل صف وكل عمود بطرف رقمي ، مما يعني أنك تحتاج إلى 16 طرفا رقميًا! وهى ليست طريقة مناسبة.
للتحكم في مصفوفة الليدات بطريقة مناسبة ، توجد وحدات (موديولات) قائمة على الدوائر المتكاملة MAX72xx والتي تحتاج إلى توصيل 3 أطراف رقمية (علاوة على طرفى مصدر القدرة +5V , GND ) بدلاً من 16 طرف. يمكنك أيضًا توصيل عدة مصفوفات ليدات (حتى 8) مع بعضها البعض دون الحاجة إلى أي طرف إضافي بعمل تتابع (تتالى) cascading لها .

الدائرة المتكاملة MAX7219 :
دعونا نلقي نظرة فاحصة على المشغل MAX7219 driver . يمكن لهذه الدائرة المتكاملة تشغيل 64 ليد فرديًا باستخدام 3 أسلاك فقط للتوصيل مع Arduino ، والأكثر من ذلك أننا نستطيع عمل سلسلة من المشغلات ومصفوفات الليدات المتعددة باستخدام نفس الأسلاك الثلاثة فقط .

كيفية توصيل (ربط) موديول الليد ماتريكس مع الأردوينو :

لتوصيل موديول الليد ماتريكس مع Arduino ، ما عليك سوى توصيل طرفى القدرة Vcc و GND بالطرفين 5V و GND فى Arduino ، ويمكن توصيل الأطراف DIN (دخل البيانات) و CS (أختيار الشريحة) و CLK (الساعة) الخاصة بموديول مصفوفة الليدات بأي أطراف رقمية من arduino كما هو موضح بالشكل أدناه .



يتم تشغيل 64 ليد بواسطة 16 طرف خرج من MAX7219 . السؤال الآن هو كيف يكون ذلك ممكنا، حسنًا ، يصل الحد الأقصى لعدد الليدات التى تضىء فعليا في نفس الوقت إلى ثمانية. يتم ترتيب الليدات في مجموعة 8 × 8 من الصفوف rows والأعمدة columns . لذلك ينشط (يفعل) MAX7219 كل عمود لفترة قصيرة جدًا من الوقت وفي نفس الوقت يقوم أيضًا بتشغيل كل صف. لذلك من خلال التبديل السريع بين الأعمدة والصفوف ، لن تلاحظ العين البشرية سوى ضوء مستمر.



لاحظ كيف يتم ترتيب أطراف مصفوفة الليد ماتريكس الشائعة 8 × 8 داخليًا ، لذلك إذا كنت تقوم ببناء مصفوفة ليدات ، فيجب أن تضع ذلك فى اعتبارك . لاحظ أيضًا أن اللوحة الشائعة للدائرة المتكاملة MAX7219 تأتي بمقاومة بين طرف 5V والطرف 18 للدائرة المتكاملة Iset . يتم استخدام المقاومة لتحديد السطوع أو مرور التيار إلى الليدات .



يحتوي MAX7219 على واجهة تسلسلية SPI بأربعة أسلاك - الساعة clock ، البيانات data ، اختيار الرقاقة chip select والأرض ground - مما يجعل التوصيل مع المتحكم بسيطًا للغاية.

التحكم فى سطوع (شدة إضاءة) ليدات الشاشة مع MAX7219 :
هناك طريقتان للتحكم في سطوع الشاشة.
• عبر مقاومة تحديد التيار (Rset) .
• برمجيا باستخدام سجل التحكم الداخلى .
ملاحظة: لا يوجد أي متطلبات لإضافة مقاومات تحديد التيار لكل عمود حيث يتم التحكم في شدة خرج الليد بواسطة إشارة PWM ، بمعنى أنه يتم تشغيل الليد لفترة زمنية أقصر لتعتيمها - ويتم التحكم في هذا الزمن بواسطة سجل داخلى .

مقاومة التحكم فى السطوع :
لا يمكنك استخدام أحدهما دون الأخرى ، حيث يتعين عليك استخدام مقاومة لضبط الحد الأقصى للشدة. يجب أن يكون الحد الأدنى لقيمة المقاومة هو 9.53k لسطوع 40mA لعمر 7219 الأقصى باستخدام ليدات حمراء - انظر الجدول أدناه ).
يعتمد ضبط التيار أيضًا على هبوط (انخفاض) الجهد الأمامي في الليدات التي تستخدمها ؛ كل لون ليد مختلف له انخفاض مختلف للجهد الأمامي - انظر الجدول:



فيما يلي هبوط الجهد الأمامى (عند تيار ثابت ~15mA ) لبعض الليدات :



التحكم فى سجل السطوع :
الطريقة الثانية للتحكم في السطوع هي أكثر فائدة لأنها تحت سيطرة البرنامج. يعين السجل 0xXA المستوى باستخدام 4 بتات البيانات الأدنى ، أي أن هناك 15 مستوى من مستويات السطوع مع كون 15 هي الأكثر سطوعًا.

توصيل اثنين أو أكثر من المشغلات MAX7219 :



يسمح الشكل أدناه بتمرير scrolling النص من اليسار إلى اليمين (لا يبدو أنه من المناسب ربطهم بهذه الطريقة - لكن هذه هي الطريقة التي يسمح بها الكود للتمرير الصحيح). الوصلات الموجودة أعلى اللوحة مماثلة لتلك الموجودة في الجزء السفلي ، باستثناء أن الطرف الأوسط هو Dout (أسود). الأربعة خطوط الأخرى متصلة مباشرة بنظيرها .
ملاحظة: لإضافة المزيد من شاشات التمرير ، أضفها إلى اليسار وقم بتغيير المتغير maxDisplays ليطابق عدد الوحدات .







يتم توصيل VCC و GND من الوحدة إلى الأطراف 5V و GND من Arduino وتوصيل الأطراف الثلاثة الأخرى ، DIN و CLK و CS إلى أي طرف رقمي من لوحة Arduino. إذا كنا نريد توصيل أكثر من وحدة ، فقط يتم توصيل أطراف الخرج بأطراف الدخل للوحدة الجديدة. في الواقع هذه الأطراف متشابهة فيما عدا أن الطرف DOUT في اللوحة السابقة يتصل بطرف DIN الخاص باللوحة الجديدة.




الدائرة الكهربية ببرنامج بروتيس :
الآن دعنا نوصل وحدة ليد ماتريكس 8 × 8 والمشغل 7219 بلوحة Arduino. إليك مخطط الدائرة الكهربية :





اعلانات

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


ثانيا البرمجيات Software :

هناك العديد من المكتبات للتعامل مصفوفة الليدات والمشغل MAX7219 و Arduino. تعد المكتبات Ledcontrol و MaxMatrix من أكثر المكتبات شيوعًا ، ولكل منهما نفس البنية ، سوف نستخدم المكتبة MaxMatrix .

دوال المكتبة MaxMatrix :
بعد تثبيت المكتبة MaxMatrix فى بيئة تطوير الاردوينو ، فى البداية ، يجب تضمينها فى البرنامج بالصيغة :

كود:
#include <MaxMatrix.h>

1- إنشاء كائن الفئة Create MaxMatrix Object
ويتم قبل الدالة setup :

كود:
int DIN = 7;
int CLK = 6;
int CS = 5;
int maxInUse = 1;

MaxMatrix m(DIN, CS, clock, maxInUse); // maxInUse is the numbers of MAX7219 used.

الوسيط الأول DIN هو طرف دخل البيانات ، والوسيط الثانى هو طرف اختيار الشريحة CS ، والوسيط الثالث هو طرف الساعة CLK ، والوسيط الرابع هو عدد الموديولات المستخدمة maxInUse. يجب تعريف هذه الوسائط قبل إنشاء الكائن .

2- بدء تهيئة كائن الليد ماتريكس ويتم داخل الدالة setup :

m.Init();

3- ضبط (تحديد) شدة إضاءة (سطوع) intensity الليدات ( من 0 إلى 15 ) ، ويتم داخل الدالة setup :

كود:
m.setIntensity(value) ;// value is the new intensity value, ranges from 0 to 15.

الوسيط valueهو قيمة السطوع الجديد ، ويكون فى المدى من 0 إلى 15 .

مثال :

كود:
void setup() {
  m.init();
  m.setIntensity(8);
}

4- تشغيل on أو تحديث updated ليد محدد فى الإحداثى (x,y) ، أو (col,row)

كود:
m.setDot(col, row, value) ;

حيث col هو ترتيب index عامود column الليد المراد تحديثه ، ويكون فى المدى من 0 إلى 79 .
و row هو ترتيب صف الليد المراد تحديثه ، ويكون فى المدى من 0 إلى 7 .
و value هى القيمة الجديدة لليد ، مشفرة كقيمة منطقية (HIGH / LOW) .

5- تشغيل أو تحديث عامود محدد (مجموعة ليدات فى العامود) :

كود:
m.setColumn(col, value);

حيث col هو ترتيب العامود المراد تحديثه ، فى المدى من 0 إلى 79 .
و value هى القيم الجديدة لليدات ، مشفرة كبايت unsigned byte .

6- تحديث "نفس العامود" لجميع الليد ماتريكس :

كود:
m.setColumnAll(col, value);

حيث col هى ترتيب العامود المراد تحديثه ، فى المدى من 0 إلى 7 .
و value هى القيم الجديدة لليدات ، مشفرة كبايت unsigned byte .

7- كتابة كائن Write a sprite : لعرض حرف معين بداية من نقطة البداية (x,y) :

كود:
  m.writeSprite(x, y, sprite) ;

حيث “x” هى ترتيب index عامود الكائن sprite المراد عرضه ، فى المدى من 0 إلى 79 .
و “y” هو ترتيب صف الكائن المراد عرضه ، فى المدى من 0 إلى 7 .
و sprite هو إشارة إلى مصفوفة بايت byte array ، مشفرة بمحتويات الكائن .

تنسيق formate الكائن sprite يكون كالتالي :
• sprite0: هو عدد أعمدة الكائن ، يجب أن يكون أكبر من أو يساوى 1 .
• sprite1 : هو عدد صفوف الكائن ، يجب أن يكون أكبر من أو يساوى 1 .
• sprite- n : هو محتويات الكائن ، مشفرة على أساس العامود بالبايتات unsigned bytes . كل عنصر مصفوفة يمثل عامود واحد من الكائن .
الكود المبين أدناه يعرض كائن الحرف “A” على الليد ماتريكس

كود:
// CH_A stores the sprite 'A' 
byte CH_A[] = {4, 8, B1111110, B0010001, B0010001, B1111110 }; 
m.writeSprite(0, 0, sprite);
ملاحظة : 
byte CH_A[] = {4, 8, 
B1111110,
B0010001, 
B0010001, 
B1111110 };

8- دالة مسح الشاشة :

كود:
clear()

عملها واضح من اسمها .

9- دوال إزاحة (تحريك) Shift الليد ماتريكس :

كود:
m.shiftLeft(rotate = false, fill_zero = true); 
m.shiftRight(rotate = false, fill_zero = true); 
m.shiftUp(rotate = false, fill_zero = true); 
m.shiftDown(rotate = false, fill_zero = true);

تعمل هذه الدوال الأربع على زحزحة shift قيم المصفوفة matrix في أحد الاتجاهات ، افتراضيًا ، يتم ملء صف / عمود دخل الإزاحة shift-in بصفر (إطفاء LED). لتدوير rotate قيم LED (على سبيل المثال ، يتم تعبئة صف / عمود دخل الإزاحة shift-in بقيم خرج الإزاحة) ، يمكنك ضبط علم الاستدارة rotate flag على صواب true m.shiftLeft(true); يمكنك أيضًا دخل الإزاحة بقيمة خارج المصفوفة matrix ، وذلك عن طريق أولاً تحميل القيم في المخزن المؤقت buffer (خارج مساحة المصفوفة التي استخدمتها) واستدعاء الدالة shiftLeft. هذا يكون مفيد لإنشاء رسالة التمرير والرسوم المتحركة.

يوضح الكود أدناه كيفية تمرير scroll الحرف 'A' في الليد ماتريكس (يفترض استخدام MAX7219 واحدة ):

كود:
byte CH_A[] = {4, 8, B1111110, B0010001, B0010001, B1111110 }; 
m.writeSprite(8, 0, sprite); // write sprite OUTSIDE the LED matrix  ,x = col. =8  
for (int i=0; i<CH_A[0]; i++) { m.shiftLeft(false, false); delay(100); } // CH_A[0] = 4

مثال توضيحى :

كود:
/*
  8x8 Dot Matrix w/ MAX7219
  */
#include <MaxMatrix.h>
 
 int DIN = 7;
int CLK = 6;
int CS = 5;
int maxInUse = 1;
 

MaxMatrix m(DIN, CS, CLK, maxInUse);
 
void setup() {
  m.init();
  m.setIntensity(8);
}
void loop() {
  m.setDot(0, 7, true);//col 1 , row 8 , on
  delay(1000);

  m.setDot(7, 0, true);// col 8 , row 1 , on 
  delay(1000);

  m.setColumn(3, B11110000); //  3 means col 4 , rows 1 to 4 off and rows 5 to 8 on 
  delay(1000);

  m.setColumn(4, B00001111); // 4 means col 5 , rows 1 to 4 on and rows 5 to 8 off
  delay(1000);

  m.clear();
  delay(1000);
}




التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 03-02-2020 الساعة 05:38 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

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


كود MAX7219 Arduino الأساسى :

بمجرد توصيل الوحدات ، نكون على استعداد لإلقاء نظرة على كود Arduino . في المثال الأول ، سوف نستخدم مكتبة MaxMatrix التي يمكن تنزيلها من الموقع GitHub .

الدائرة الكهربية :




البرنامج :

كود:
 /*
8x8 LED Matrix MAX7219 Example 01
	
by Dejan Nedelkovski, www.HowToMechatronics.com
	
Based on the following library:
GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219
*/
	
#include <MaxMatrix.h>
	
int DIN = 7;		 // DIN pin of MAX7219 module
int CLK = 6;		 // CLK pin of MAX7219 module
int CS = 5; 		// CS pin of MAX7219 module
int maxInUse = 1;
	
MaxMatrix m(DIN, CS, CLK, maxInUse); 
	
char A[] = {4, 8,
	B01111110,
	B00010001,
	B00010001,
	B01111110,
	};
	
char B[] = {4, 8,
	B01111111,
	B01001001,
	B01001001,
	B00110110,
	};
	
char smile01[] = {8, 8,
	B00111100,
	B01000010,
	B10010101,
	B10100001,
	B10100001,
	B10010101,
	B01000010,
	B00111100
	};
char smile02[] = {8, 8,
	B00111100,
	B01000010,
	B10010101,
	B10010001,
	B10010001,
	B10010101,
	B01000010,
	B00111100
	};
char smile03[] = {8, 8,
	B00111100,
	B01000010,
	B10100101,
	B10010001,
	B10010001,
	B10100101,
	B01000010,
	B00111100
	};
	
void setup() {
	m.init(); 		// MAX7219 initialization
	m.setIntensity(8); 	// initial led matrix intensity, 0-15
	}
	
void loop() {
// Seting the LEDs On or Off at x,y or column , row position
	m.setDot(6,2,true); //LED (C7, R3) ON 
	delay(1000);
	m.setDot(6,3,true);//LED (C7, R4) ON 
	delay(1000);
	m.clear(); // Clears the display
	for (int i=0; i<8; i++){
	m.setDot(i,i,true); // Light LEDs (C1,R1),(C2,R2) ….(C8,R8) “Diagonal”
	delay(300);
	}
	m.clear();
// Displaying the character at x,y (upper left corner of the character) 
	m.writeSprite(2, 0, A);
	delay(1000);
	
	m.writeSprite(2, 0, B);
	delay(1000);
	
	m.writeSprite(0, 0, smile01);
	delay(1000);
	
	m.writeSprite(0, 0, smile02);
	delay(1000);
	
	m.writeSprite(0, 0, smile03);
	delay(1000);
	
	for (int i=0; i<8; i++){
	m.shiftLeft(false,false);
	delay(300);
	}
	m.clear();
	
	}

الوصف:
فى البداية ، نحن بحاجة إلى تضمين المكتبة MaxMatrix.h ، وتحديد (تعريف) الأطراف التي تتصل بها الوحدة (الموديول) ، وتعيين عدد الوحدات التي نستخدمها وتعريف كائن object للفئة MaxMatrix.

كود:
#include <MaxMatrix.h>
	
int DIN = 7;		 // DIN pin of MAX7219 module
int CLK = 6;		 // CLK pin of MAX7219 module
int CS = 5; 		// CS pin of MAX7219 module

int maxInUse = 1;
MaxMatrix m(DIN, CS, CLK, maxInUse);

لعرض الأحرف ، نحتاج إلى تعريفها في مصفوفة أحرف char أو البايتات ، وهنا لدينا العديد من الأمثلة. يمكننا أن نلاحظ كيف تشكل البتات bits الأحرف التي هي في الواقع أصفار وأحاد . في هذه الحالة ، يتم تدويرها بزاوية 90 درجة ، لكن مثال المكتبة يقترح استخدامها بهذه الطريقة بحيث يكون من الأسهل لاحقًا تنفيذ وظيفة shiftLeft المخصصة لتمرير نص .



في قسم الإعداد setup ، نحتاج فقط إلى تهيئة initialize الوحدة وتعيين سطوع الليدات .

كود:
void setup() {
	m.init(); 		// MAX7219 initialization
	m.setIntensity(8); 	// initial led matrix intensity, 0-15
	}

في قسم الحلقة loop باستخدام الدالة setDot() يمكننا تحديد أي ليد يضىء بشكل فردى عند موضع (x,y) أو ( col,row) وباستخدام الدالة clear() يمكننا مسح (نظافة) الشاشة.

كود:
 // Seting the LEDs On or Off at x,y or column , row position
	m.setDot(6,2,true); 
	delay(1000);

	m.setDot(6,3,true);
	delay(1000);

	m.clear(); // Clears the display

	for (int i=0; i<8; i++){
	m.setDot(i,i,true);
	delay(300);
	}

	m.clear();




لعرض الأحرف المعرّفة مسبقًا ، نستخدم الدالة writeSprite() ، والوسيطان الأولين هما الموضع x و y للزاوية اليسرى العليا للحرف. في النهاية باستخدام الدالة shiftLeft() يتم تحريك أو زحزحة أو تمرير الحرف إلى اليسار.

كود:
// Displaying the character at x,y (upper left corner of the character) 
	m.writeSprite(2, 0, A);
	delay(1000);
	
	m.writeSprite(2, 0, B);
	delay(1000);
	
	m.writeSprite(0, 0, smile01);
	delay(1000);
	
	m.writeSprite(0, 0, smile02);
	delay(1000);
	
	m.writeSprite(0, 0, smile03);
	delay(1000);
	
	for (int i=0; i<8; i++){
	m.shiftLeft(false,false);
	delay(300);
	}
	m.clear();












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


برنامج تحريك (تمرير) النصوص scrolling text باستخدام 8×8 LED Matrix و Arduino :

الدائرة الكهربية :





بعد ذلك دعونا نلقي نظرة على مثال لتمرير نص ولنرى ما هو مختلف. فيما يلى الكود ووصفه.

كود:
/*
8x8 LED Matrix MAX7219 Scrolling Text Example
	
Based on the following library:
GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219
*/
	
	
#include <MaxMatrix.h>
#include <avr/pgmspace.h>
	
PROGMEM const unsigned char CH[] = {
	3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
	1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
	3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
	5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
	4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
	5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
	5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
	1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
	3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
	3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
	5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
	5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
	2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
	4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
	2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
	4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
	4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
	3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
	4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
	4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
	4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
	4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
	4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
	4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
	4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
	4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
	2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
	2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
	3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
	3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
	3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
	4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
	5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // *
	4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
	4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
	4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
	4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
	4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
	4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
	4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
	4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
	3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
	4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
	4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
	4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
	5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
	5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
	4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
	4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
	4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
	4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
	4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
	5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
	4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
	5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
	5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
	5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
	5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
	4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
	2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
	4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
	2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
	3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
	4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
	2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
	4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
	4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
	4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
	4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
	4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
	3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
	4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
	4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
	3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
	4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
	4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
	3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
	5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
	4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
	4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
	4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
	4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
	4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
	4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
	3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
	4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
	5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
	5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
	5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
	4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
	3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
	3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
	1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
	3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
	4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
	};
	
int DIN = 7; // DIN pin of MAX7219 module
int CLK = 6; // CLK pin of MAX7219 module
int CS = 5; // CS pin of MAX7219 module
int maxInUse = 2;
	
MaxMatrix m(DIN, CS, CLK, maxInUse);
	
byte buffer[10];
	
char text[]= "LED Matrix , MAX7219 & Arduino "; // Scrolling text
	
void setup() {
m.init(); // module initialize
m.setIntensity(15); // dot matix intensity 0-15
}
	
void loop() {

printStringWithShift(text, 100); // (text, scrolling speed)
	
}


// Display the extracted characters with scrolling
void printCharWithShift(char c, int shift_speed) {

	if (c < 32) return;

	c -= 32;

	memcpy_P(buffer, CH + 7 * c, 7);
	m.writeSprite(32, 0, buffer);
	m.setColumn(32 + buffer[0], 0);
	
	for (int i = 0; i < buffer[0] + 1; i++)
	{
	delay(shift_speed);
	m.shiftLeft(false, false);
	}

	}

	// Extract the characters from the text string
	void printStringWithShift(char* s, int shift_speed) {
	while (*s != 0) {
	printCharWithShift(*s, shift_speed);
	s++;
	}

	}



الوصف :
• يتعين علينا هنا تضمين مكتبة إضافية وهى avr/pgmspace والتى تحتوى على PROGMEM وهو "معدّل متغير" variable modifier ويستخدم لتخزين البيانات في ذاكرة الفلاش بدلاً من SRAM. عندما يكون لدينا قاعدة بيانات كبيرة من المتغيرات الثابتة ، كما هو الحال في هذه الحالة التي تعرف الأحرف letters , characters ، فمن الأفضل تخزينها في ذاكرة الفلاش لأنها أكبر بكثير ، 32 كيلو بايت ، مقارنة بذاكرة SRAM ، 2 كيلو بايت .

كود:
#include <avr/pgmspace.h>
	
PROGMEM const unsigned char CH[] = {
	3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
………………..
……………......

الكلمة المفتاحية PROGMEM هى معدل متغير ، ويجب أن تستخدم فقط مع أنواع البيانات المعرفة فى الملف pgmspace.h ، وهى تخبر المترجم " بوضع هذه المعلومات فى ذاكرة البرنامج الفلاش " بدلا من وضعها فى ذاكرة RAM ، حيث مكانها العادى .
استخدام PROGMEM هو أيضًا إجراء من خطوتين . بعد وضع البيانات في ذاكرة الفلاش ، يتطلب الأمر طرقًا خاصة (دوال ) ، محددة أيضًا في المكتبة pgmspace.h ، لقراءة البيانات من ذاكرة البرنامج مرة أخرى إلى الذاكرة RAM ، حتى نتمكن من القيام بشيء مفيد بها.
• بجانب مصفوفة الأحرف ، يتم تحدد (تعريف) نص التمرير :

كود:
char text[]= " LED Matrix , MAX7219 & Arduino "; // Scrolling text

• وفي قسم الحلقة loop ، الدالة المعرفة بمعرفة المستخدم printStringWithShift ، تقوم بطباعة نص التمرير على مصفوفة الليدات مع تعريف سرعة التمرير بالمللي ثانية بالوسيط الثانى .

كود:
void loop() {

printStringWithShift(text, 100); // (text, scrolling speed)
	
}

// Extract the characters from the text string
	void printStringWithShift(char* s, int shift_speed) {
	while (*s != 0) {
	printCharWithShift(*s, shift_speed);
	s++;
	}

	}

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

كود:
// Display the extracted characters with scrolling
void printCharWithShift(char c, int shift_speed) {

	if (c < 32) return;

	c -= 32; // Character index

	memcpy_P(buffer, CH + 7 * c, 7); // Get a copy of character bytes , store in buffer
	m.writeSprite(32, 0, buffer); // Display char in buffer at x=32 , y=0 
	m.setColumn(32 + buffer[0], 0);// Update column 32 + buffer[0] with 0 
	
	for (int i = 0; i < buffer[0] + 1; i++)
	{
	delay(shift_speed);
	m.shiftLeft(false, false);//Shift char
	}

	}

أساسيات الكود بسيطة للغاية. يتم تعريف المعلومات من أجل MAX7219 لعرض حرف.
لكل حرف يتم استخدام 7 بايت. في الوقت الحالي ، لا يهم ما يعنيه. يشير PROGMEM إلى أن البيانات يتم تخزينها في ذاكرة البرنامج بحيث لا تتخلص (تهلك) من ذاكرة الوصول العشوائي RAM.



يمكنك إلقاء نظرة على الموقع http://www.asciitable.com/ ومحاولة إستنتاج علاقة في تسلسل الأحرف.

• الأحرف 32 الأولى (0..31, 0x00..0x1F) من كود أسكى غير قابلة للطباعة. تقوم الدالة printCharWithShift() بالتحقق من ذلك if ولا تفعل أي شيء (تتم العودة return على الفور) في حالة اكتشاف أحد هذه الأحرف. عدا ذلك else ، يتم ُطرح 32 من قيمة الحرف (على سبيل المثال ، يمثل الحرف L بالقيمة 76 ويتم طرح 32 منه (النتيجة 44). الآن عد إلى المصفوفة CH وابدأ في العد ؛ "الصف الأول" هو 0 ، عد إلى 44. ماذا تجد؟

كود:
if (c < 32) return;
c -= 32;

• تقوم الدالة الآن بإنشاء نسخة (باستخدام memcpy_P) من البايتات السبعة التي تعثر عليها في مصفوفة البايت الصغيرة المسماة المخزن المؤقت buffer ؛ الدالة memcpy_P هى إصدار خاص من الدالة memcpy تقوم بالنسخ من ذاكرة البرنامج PROGMEM بدلاً من ذاكرة (RAM) العادية .

كود:
memcpy_P(buffer, CH + 7 * c, 7); // Get a copy of character bytes , store in buffer

الوسيط الأول هو "الهدف" dest وهو المكان الذى يتم النسخ إليه فى ذاكرة RAM ، وهو هنا المصفوفة buffer ، والوسيط الثانى هو "المصدر" src وهو المكان الذى يتم النسخ منه فى ذاكرة البرنامج ، وهو هنا CH + 7 * c ، والوسيط الثالث هو "حجم" size النسخ ، وهو هنا 7 بايت .

• باستخدام الدالة writeSprite() ، تتم كتابة البيانات إلى MAX7219.
تقوم الدالة printStringWithShift() بالمرور ، بعمل تكرار loop ، عبر النص الذي مررته كوسيط (مؤشر إلى مصفوفة الأحرف ، *s ) ولكل حرف في النص تستدعي الدالة printCharWithShift() . عن طريق زيادة المؤشر pointer ، فإنه سيتم تمرير الحرف التالي.
كما تعلم ، فإن السلاسل النصية (C-strings) تنتهى بالحرف nul '\ 0' ( قيمة كود أسكى بصفر “0” ). ستتوقف الدالة عن استدعاء الدالة printCharWithShift() بمجرد اكتشاف أن المؤشر s يشير إلى الحرف nul .


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


مثال :

كود:
#include "MaxMatrix.h"
#include "avr/pgmspace.h"


PROGMEM const unsigned char CH[] = {
3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // *
4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};

int data = 7;    // DIN pin of MAX7219 module
int load = 5;    // CS pin of MAX7219 module
int clock = 6;  // CLK pin of MAX7219 module

int maxInUse = 2;  //how many MAX7219 are connected

MaxMatrix m(data, load, clock, maxInUse); // define Library

byte buffer[10];

char string1[] = " Arduino LED Matrix Tutorial     ";  // Scrolling Text


void setup(){
  m.init(); // module MAX7219
  m.setIntensity(5); // LED Intensity 0-15
}

void loop(){
  
  byte c;
  delay(100);
  m.shiftLeft(false, true);
  printStringWithShift(string1, 100);  // Send scrolling Text

}

// Put extracted character on Display
void printCharWithShift(char c, int shift_speed){
  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7*c, 7);
  m.writeSprite(maxInUse*8, 0, buffer);
  m.setColumn(maxInUse*8 + buffer[0], 0);
  
  for (int i = 0; i < buffer[0]+1; i++) 
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

// Extract characters from Scrolling text
void printStringWithShift(char* s, int shift_speed){
  while (*s != 0){
    printCharWithShift(*s, shift_speed);
    s++;
  }
}


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


مثال مع إدخال سلسلة النص من خلال الاتصال التسلسلى :


كود:
/*
 Interactive scrolling led sign for Arduino and MAX7219 8x8 LED Display
 
 This is the code I use to control the MAX7219 8x8 LED modules from my
 Chinese "Geekcreit"-brand Arduino clone.
 
 The first module is connected to the Uno like this:
 
 Module: VCC -> Uno: 5V
 Module: GND -> Uno: GND
 Module: DIN -> Uno: D8
 Module: CS  -> Uno: D9
 Module: CLK -> Uno: D10
 
 Additional modules are connected like this:
 
 Module 2: VCC -> Module 1: VCC
 Module 2: GND -> Module 1: GND
 Module 2: DIN -> Module 1: DIN
 Module 2: CS  -> Module 1: CS
 Module 2: CLK -> Module 1: CLK
 
 See the blog post at https://oneguyoneblog.com/2016/10/20/max7219-arduino-ticker-8x8-led-modules/
 */

#include <MaxMatrix.h>
#include <avr/pgmspace.h>

PROGMEM const unsigned char CH[] = {
  3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space
  1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !
  3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "
  5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #
  4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $
  5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %
  5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &
  1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '
  3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (
  3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )
  5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *
  5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +
  2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,
  4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -
  2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .
  4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0
  3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1
  4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2
  4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3
  4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4
  4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5
  4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6
  4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7
  4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8
  4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9
  2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :
  2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;
  3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <
  3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =
  3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >
  4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?
  5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // *
  4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A
  4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B
  4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C
  4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D
  4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E
  4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F
  4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G
  4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H
  3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I
  4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J
  4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K
  4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L
  5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M
  5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N
  4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O
  4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P
  4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q
  4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R
  4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S
  5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T
  4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U
  5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V
  5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W
  5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X
  5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y
  4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z
  2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [
  4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash
  2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]
  3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat
  4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _
  2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `
  4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a
  4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b
  4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c
  4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d
  4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e
  3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f
  4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g
  4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h
  3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i
  4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j
  4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k
  3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l
  5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m
  4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n
  4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o
  4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p
  4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q
  4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r
  4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s
  3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t
  4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u
  5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v
  5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w
  5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x
  4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y
  3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z
  3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {
  1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |
  3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }
  4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~
};

int data = 8;    // DIN pin of MAX7219 displays
int load = 9;    // CS pin of MAX7219 displays
int clock = 10;  // CLK pin of MAX7219 displays
int scrollSpeed = 35; // speed of scrolling text, lower is faster
int maxInUse = 3;  //Number of MAX7219 displays

MaxMatrix m(data, load, clock, maxInUse); // define Library

byte buffer[10];
char inData[64] = "MAX7219 8x8 LED Matrix  "; // The string (max 64 bytes)
char inChar; // Where to store the character read
byte index = 0; // Index into array; where to store the character

void setup(){
  m.init(); // init display
  m.setIntensity(7); // LED light intensity from 0 (dimmest) to 15
  Serial.begin(9600); // init serial connection
}

void loop(){

// Get input from serial connection
  index=0;
  while(Serial.available() > 0) // Don't read unless there is data
  {

    if(index < 63) // One less than the size of the array
    {
      inChar = Serial.read(); // Read a character
      Serial.write(inChar);
      inData[index] = inChar; // Store it
      index++; // Increment where to write next
      inData[index] = '\0'; // Null terminate the string
    }       
  }

  byte c;
  delay(100);
  m.shiftLeft(false, true);
  printStringWithShift(inData, scrollSpeed);  // Send scrolling Text
  clearLCD(maxInUse, scrollSpeed);
}

// Put extracted character on Display
void printCharWithShift(char c, int shift_speed){

  if (c < 32) return;
  c -= 32;
  memcpy_P(buffer, CH + 7*c, 7);
  m.writeSprite(maxInUse*8, 0, buffer);
  m.setColumn(maxInUse*8 + buffer[0], 0);

  for (int i=0; i<buffer[0]+1; i++) 
  {
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

// Extract characters from Scrolling text
void printStringWithShift(char* s, int shift_speed){

  while (*s != 0){
    printCharWithShift(*s, shift_speed);
    s++;
  }
}

// Add trailing space to clear the display
void clearLCD(int maxInUse, int shift_speed){

  for (int i=0; i<maxInUse*8; i++) 
  {
    m.setColumn((maxInUse*8), 0);
    delay(shift_speed);
    m.shiftLeft(false, false);
  }
}

النتائج :













إضافة رد

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

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

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


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

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