البرمجة :
مثال المكتبة :
البرنامج :
كود:
//We always have to include the library
#include "LedControl.h"
/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);
/* we always wait a bit between updates of the display */
unsigned long delaytime=250;
void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
/*
This method will display the characters for the
word "Arduino" one after the other on digit 0.
*/
void writeArduinoOn7Segment() {
lc.setChar(0,0,'a',false);
delay(delaytime);
lc.setRow(0,0,0x05);// r
delay(delaytime);
lc.setChar(0,0,'d',false);
delay(delaytime);
lc.setRow(0,0,0x1c);//u
delay(delaytime);
lc.setRow(0,0,B00010000);//i
delay(delaytime);
lc.setRow(0,0,0x15);//n
delay(delaytime);
lc.setRow(0,0,0x1D);//o
delay(delaytime);
lc.clearDisplay(0);
delay(delaytime);
}
/*
This method will scroll all the hexa-decimal
numbers and letters on the display. You will need at least
four 7-Segment digits. otherwise it won't really look that good.
*/
void scrollDigits() {
for(int i=0;i<13;i++) {
lc.setDigit(0,3,i,false);
lc.setDigit(0,2,i+1,false);
lc.setDigit(0,1,i+2,false);
lc.setDigit(0,0,i+3,false);
delay(delaytime);
}
lc.clearDisplay(0);
delay(delaytime);
}
void loop() {
writeArduinoOn7Segment();
scrollDigits();
}
الوصف :
1- فى بداية البرنامج (الاسكيتش) يجب تضمين ملف رأس المكتبة :
كود:
//We always have to include the library
#include "LedControl.h"
ثم يتم تحديد أطراف الاتصال بين الوحدة والاردوينو ، ومن ثم يتم إنشاء كائن من فئة المكتبة :
كود:
/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
pin 12 is connected to the DataIn
pin 11 is connected to the CLK
pin 10 is connected to LOAD
We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);
الدوال المستخدمة :
الدالة :
كود:
LedControl new_disp = LedControl(dataPin, clkPin, csPin, Devices)
• تؤدي هذه الدالة (تسمى دالة المنشىء) إلى إنشاء كائن من فئة LEDControl (اسم الكائن هنا ، new_disp ؛ يمكن استخدام أي اسم صالح آخر ) وهى تتخاطب مع MAX7219 الموجودة على وحدة (موديول) العرض المكون من السفن سيجمنت .
• dataPine هو طرف Arduino الذي يتصل بطرف دخل البيانات DIN بالوحدة (الموديول) . وهو طرف الاردوينو حيث يتم نقل (إزاحة) البيانات للخارج .
• clkPin هو طرف Arduino الذي يتصل بالطرف CLK على الوحدة . وهو طرف الساعة clock .
• csPin هو طرف Arduino المتصل بالطرف CS / Load على الوحدة. هذا الطرف لتحديد (اختيار) الجهاز عندما يتم إرسال البيانات.
• Devices تحدد الحد الأقصى لعدد الأجهزة التي يمكن التحكم فيها. يمكن أن يتراوح ما بين 1 إلى 8. وهو عدد الأجهزة المتصلة في تتالي cascade .
• الجهاز المتصل مباشرةً بالأطراف المحددة يكون له العنوان address 0 . الجهاز الموجود بجواره المتتالي مباشرةً يكون له العنوان 1. الجهاز الثامن (الجهاز الأخير في اتصال التسلسل) يكون له العنوان 7.
الدالة :
كود:
new_disp.shutdown(addr, status)
• تستخدم هذه الدالة لتوفير الطاقة.
• إذا كانت الحالة status صواب true ، ينتقل الجهاز المقابل للعنوان addr إلى وضع إيقاف التشغيل. إذا كانت الحالة status خطأ false ، فإن الجهاز يعمل بشكل طبيعي.
الدالة :
كود:
new_disp.setIntensity(addr, intensity)
• تستخدم هذه الدالة لضبط سطوع الشاشة التي عنوانها addr.
• يمكن أن تتراوح الشدة بين 1 و 15. 1 كحد أدنى و 15 كحد أقصى.
الدالة :
كود:
new_disp.setDigit(addr, digit, value, dp)
• تستخدم هذه الدالة لعرض رقم number ، المشار إليه بالبارامتر (value) ، على الشاشة بالعنوان addr . يتم عرض الرقم في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7) . البارامتر dp يحدد الفاصلة العشرية. إذا كان dp خطأ false ، فستكون النقطة العشرية معطلة.
الدالة :
كود:
new_disp.setChar(addr, digit, value, dp)
• تستخدم هذه الدالة لعرض حرف character ، المشار إليه بالبارامتر (value) على الشاشة بالعنوان addr . يتم عرض الحرف في الموضع (الأحاد units ، العشرات tens ، وما إلى ذلك) المذكورة بواسطة البارامتر digit (يمكن أن تكون من 0 إلى 7). يحدد البارامتر dp الفاصلة العشرية. إذا كان dp خطأ ً false ، فستكون النقطة العشرية معطلة.
• يمكن فقط عرض بعض الحروف .
2- دائما ما ننتظر قليلا ما بين تحديث الشاشة :
كود:
/* we always wait a bit between updates of the display */
unsigned long delaytime=250;
3- نأتى إلى دالة الإعداد setup . فى البداية ، ونظرا لأن MAX72XX يبدأ العمل فى وضع "توفير القدرة" ، فعلينا إيقاظه ، وضبط شدة إضاءة الشاشة ، ومسح الشاشة للتهيئة للعمل :
كود:
void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);
}
طباعة الأرقام Printing numbers
الاستخدام الأكثر شيوعًا لشاشات العرض السفن سيجمنت هو إظهار الأرقام numbers . الدالة الأولى التي ننظر إليها setDigit تأخذ وسيط نوع البايت وتطبع الرقم المقابل في العمود المحدد. يعمل نطاق القيم الصالحة من 0..15 . تتم طباعة جميع القيم بين 0..9 كأرقام digits ، ويتم طباعة القيم بين 10..15 كمكافئها السداسي عشر.
سيتم ببساطة تجاهل أي قيمة أخرى ، مما يعني أنه لن تتم طباعة أي شيء. لن يتم إفراغ blanked العمود الموجود على الشاشة ، بل سيحتفظ ببساطة بقيمته الصالحة الأخيرة. يمكن تشغيل الفاصلة العشرية في العمود أو إيقاف تشغيله باستخدام وسيط إضافى .
فيما يلي مثال صغير يطبع قيمة نوع int هى (-999..999) على شاشة مكونة من 4 أرقام digits .
كود:
void printNumber(int v) {
int ones;
int tens;
int hundreds;
boolean negative;
if(v < -999 || v > 999)
return;
if(v<0) {
negative=true;
v=v*-1;
}
ones=v%10;
v=v/10;
tens=v%10;
v=v/10;
hundreds=v;
if(negative) {
//print character '-' in the leftmost column
lc.setChar(0,3,'-',false);
}
else {
//print a blank in the sign column
lc.setChar(0,3,' ',false);
}
//Now print the number digit by digit
lc.setDigit(0,2,(byte)hundreds,false);
lc.setDigit(0,1,(byte)tens,false);
lc.setDigit(0,0,(byte)ones,false);
}
فيما يلى النموذج الأولي prototype للدالة :
كود:
/*
* Display a (hexadecimal) digit on a 7-Segment Display
* Params:
* addr address of the display
* digit the position of the digit on the display (0..7)
* value the value to be displayed. (0x00..0x0F)
* dp sets the decimal point.
*/
void setDigit(int addr, int digit, byte value, boolean dp);
يجب أن يكون الوسيط digit فى النطاق 0..7 لأن MAX72XX يمكنه أن يقود ما يصل إلى ثمانية شاشات عرض سفن سيجمنت . الفهرس index يبدأ من 0 كالمعتاد.
طباعة الأحرف Printing characters
هناك مجموعة محدودة من الأحرف التى يمكن عرضها على شاشة السفن سيجمنت . الاستخدام الشائع سيكون الحرف '-' للقيم السالبة والحروف الستة 'A'..'F' للقيم السداسية.
الدالة setChar(addr,digit,value,dp) - تقبل قيمة value من نوع char للنطاق الكامل لتكويد أسكى ASCII ذات 7 بت. نظرًا لأن الأنماط التي يمكن التعرف عليها محدودة ، أشهر الأحرف المحددة (المعرفة) هي حرف الفراغ <space> . ولكن هناك عدد قليل من الأحرف التي لها معنى على شاشة السفن سيجمنت . فيما يلي مجموعة الأحرف القابلة للطباعة:
• 0 1 2 3 4 5 6 7 8 9
• A a (prints upper case)
• B b (prints lower case)
• C c (prints lower case)
• D d (prints lower case)
• E e (prints upper case)
• F f (prints upper case)
• H h (prints upper case)
• L l (prints upper case)
• P p (prints upper case)
• - (the minus sign)
• ., (lights up the decimal-point)
• _ (the underscore)
• <SPACE> (the blank or space char)
من أجل راحتك ، تم أيضًا إعادة تعريف الأحرف السداسية عشرية بقيم الأحرف 0x00...0x0F . إذا كنت ترغب في مزج الأرقام digits والحروف characters على الشاشة ، يمكنك ببساطة أن تأخذ نفس وسيط البايت التي كنت ستستخدمها للدالة setDigit() وستطبع القيمة السداسية العشرية.
النموذج الأولي للدالة هو نفسه تقريبا لعرض الأرقام digits .
كود:
/*
* Display a character on a 7-Segment display.
* There are only a few characters that make sense here :
* '0','1','2','3','4','5','6','7','8','9','0',
* 'A','b','c','d','E','F','H','L','P',
* '.','-','_',' '
* Params:
* addr address of the display
* digit the position of the character on the display (0..7)
* value the character to be displayed.
* dp sets the decimal point.
*/
void setChar(int addr, int digit, char value, boolean dp);
يمكن رسم أي حرف آخر باستخدام الدالة setRow() . على سبيل المثال ، إذا كنت تريد عرض شيء يشبه الحرف الصغير 't' :

4- عودة إلى برنامج مثال المكتبة : إنشاء دالة لعرض حروف الكلمة "Arduino" حرف تلو الآخر على خانة الرقم digit 0 من الوحدة :
كود:
/*
This method will display the characters for the
word "Arduino" one after the other on digit 0.
*/
void writeArduinoOn7Segment() {
lc.setChar(0,0,'a',false);
delay(delaytime);
lc.setRow(0,0,0x05);// r
delay(delaytime);
lc.setChar(0,0,'d',false);
delay(delaytime);
lc.setRow(0,0,0x1c);//u
delay(delaytime);
lc.setRow(0,0,B00010000);//i
delay(delaytime);
lc.setRow(0,0,0x15);//n
delay(delaytime);
lc.setRow(0,0,0x1D);//o
delay(delaytime);
lc.clearDisplay(0);
delay(delaytime);
}
5- إنشاء دالة لتمرير جميع الأعداد السداسية عشر والأحرف على الشاشة ، سوف تحتاج لأربعة أرقام digits على الأقل وإلا لن يكون العرض بالشكل الجيد .
كود:
/*
This method will scroll all the hexa-decimal
numbers and letters on the display. You will need at least
four 7-Segment digits. otherwise it won't really look that good.
*/
void scrollDigits() {
for(int i=0;i<13;i++) {
lc.setDigit(0,3,i,false);
lc.setDigit(0,2,i+1,false);
lc.setDigit(0,1,i+2,false);
lc.setDigit(0,0,i+3,false);
delay(delaytime);
}
lc.clearDisplay(0);
delay(delaytime);
}
6- أخيرا ، فى الدالة loop يتم استدعاء الدالتين للتنفيذ :
كود:
void loop() {
writeArduinoOn7Segment();
scrollDigits();
}
النتائج :


|