|
| قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots |
|
|
| F.Abdelaziz |
| مشاهدة ملفه الشخصي |
| زيارة موقع F.Abdelaziz المفضل |
| البحث عن كافة المشاركات المكتوبة بواسطة F.Abdelaziz |
| اعلانات |
|
||||||
|
ثانيا البرمجيات 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 الساعة 09:38 PM |
| F.Abdelaziz |
| مشاهدة ملفه الشخصي |
| زيارة موقع F.Abdelaziz المفضل |
| البحث عن كافة المشاركات المكتوبة بواسطة F.Abdelaziz |
| اعلانات اضافية ( قم بتسجيل الدخول لاخفائها ) | |
|
|
|
||||||
|
كود 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();
![]() ![]() |
|
||||||
|
برنامج تحريك (تمرير) النصوص 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 . |
|
||||||
|
مثال : كود:
#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++;
}
}
|
|
||||||
|
مثال مع إدخال سلسلة النص من خلال الاتصال التسلسلى : كود:
/*
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);
}
}
النتائج : ![]() ![]() ![]() ![]() |
|
جميع الحقوق محفوظة 2026
|


