 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:
|
|
12-12-2019, 03:27 PM
المشاركة 47
|
|
إضاءة متتابعة فى الاتجاهين 8 ليد :
يوضح هذا المثال كيفية تشغيل 74HC595 واحد باستخدام مخارج لتشغيل ليدات ، إضاءة ليد تلو الآخر . يتم التحكم في اتجاه التشغيل من خلال المتغير dir بينما يتم تعيين القيمة الفعلية إلى المتغير d. إذا تم اكتشاف بت مرتفعة high في أي من طرفي البايت عندئذ يتم تغيير الاتجاه. وبهذه الطريقة ، يتم السير يسارًا ويمينًا عبر البايت. بعد كل إزاحة يتم إخراج القيمة إلى 74HC595 باستخدام الدالة shiftOut ، و MSB أولاً.
ملاحظة: تعمل الدالة shiftOut على بايت واحد فقط.

كود:
// Demonstration code for 74HC595 8 bit output
int RCLKPin = 3; // pin 12 on the 74hc595 latch ST_CP
int SRCLKPin = 6; // pin 11 on the 74hc595 shift register clock – SH_CP
int SERPin = 4; // pin 14 on the 74hc595 data - DS
unsigned int d; // Data to be sent to the shift reg.
int dir =0; // Direction of walking.
void setup() {
pinMode(RCLKPin, OUTPUT); // Set 595 control PIN sto output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
d=1;
}
void loop() {
delay(100);
digitalWrite(RCLKPin, LOW);//Latch Low
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d);//Shift Out
digitalWrite(RCLKPin, HIGH);//Latch High
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x80) dir=1; // Set direction.
if (d&0x01) dir=0;
}
إضاءة متتابعة فى الاتجاهين 16 ليد :
هذا المثال لبرنامج يوسع المثال السابق لتشغيل اثنين 74HC595 لإنشاء مسجل إزاحة 16 بت واستخدام المخارج لتشغيل ليدات . مرة أخرى ، يتم إنشاء مسير خطوة ، لكن في هذه المرة يستخدم الكود عددًا صحيحًا بدون إشارة unsigned integer لتخزين القيمة التي تتيح 16 بت من المخارج . لاحظ كيف يجب استخدام الدالة shiftOut مرتين لإخراج قيمة 16 بت (والتي يجب أيضًا تقسيمها إلى قطعتين باستخدام إزاحة البت bit shifting لأن shiftOut لا يمكنه التعامل إلا مع 8 بتات من البيانات في كل مرة).

كود:
// Demonstration code for 74HC595 16 bit output
int RCLKPin = 3; // pin 12 on the 74hc595 latch - nSS
int SRCLKPin = 6; // pin 11 on the 74hc595 shift register clock - SCK
int SERPin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned int d; // Data to be sent to the shift reg.
int dir =0; // Direction of walking 1.
void setup() {
pinMode(RCLKPin, OUTPUT); // Set 595 control PIN sto output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
d=1;
}
void loop() {
delay(100);
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & d)>>8); // shift out high byte
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d); // shift out low byte
digitalWrite(RCLKPin, HIGH);
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x8000) dir=1; // Set direction.
if (d&0x0001) dir=0;
}
مسجل إزاحة 32 بت لتشغيل 16 ليد إضاءة متتابعة وتشغيل 2 سفن سيجمنت لعرض الأرقام من 0 إلى 99 :

هذا المثال لبرنامج يوسعالمثال السابق مع الحفاظ على التشغيل الأصلي ولكنه أيضا يقود وحدتى عرض سفن سيجمنت . وحدات العرض السفن سيجمنت هي مجرد ترتيبات (تنسيق) لليدات يتم استخدامها لعرض الأرقام. في الداتا شيت ، يتم تعيين حرف لكل ؛ هذه الأحرف هى "a" إلى "g" و "dp" (للفاصلة العشرية). لتسهيل عملية الترميز ، من الأفضل تعيين 'a'-'g' إلى b0-b6 من المخارج وتعيين dp إلى الخرج b7.
في هذا المثال ، يتم الاحتفاظ السير خطوة كما كان من قبل ولكن الآن يتم مزيد من إستدعاء دالة إزاحة 8 بت shiftOut . لاحظ كيف يتم إزاحة كل شيء بشكل صحيح للوصول إلى أدنى 8 بت من أجل الدالة shiftOut.
ملحوظة :
حتى بالنسبة إلى 32 خرج (أو أكثر) ، لا تزال بحاجة إلى 3 أطراف تحكم فقط!
كود:
// Demonstration code for 74HC595 16 bit output and 2x7 segment displays
int RCLKPin = 3; // pin 12 on the 74hc595 latch - nSS
int SRCLKPin = 6; // pin 11 on the 74hc595 shift register clock - SCK
int SERPin = 4; // pin 14 on the 74hc595 data - MOSI
unsigned long d; // Data to be sent to the shift reg.
int dir,num; // Direction of walking 1, output number.
// Define an array to translate number to 7segment
char segment[10] = { // segment bit pos: dp g f e d c b a
0x3f, // zero
0x06, // one
0x5b, // two
0x4f, // three
0x66, // four
0x6d, // five
0x7c, // six
0x07, // seven
0x7f, // eight
0x67 // nine
};
void setup() {
pinMode(RCLKPin, OUTPUT); // Set 595 control PINs to output.
pinMode(SRCLKPin, OUTPUT);
pinMode(SERPin, OUTPUT);
d=1;
num = 0;
}
void loop() {
unsigned char lnum,rnum;
if(num++>99) num=0;
lnum = num / 10;
rnum = num % 10;
digitalWrite(RCLKPin, LOW);
shiftOut(SERPin, SRCLKPin, MSBFIRST, segment[lnum]);
shiftOut(SERPin, SRCLKPin, MSBFIRST, segment[rnum]);
shiftOut(SERPin, SRCLKPin, MSBFIRST, (0xff00 & d)>>8);
shiftOut(SERPin, SRCLKPin, MSBFIRST, 0x00ff & d);
digitalWrite(RCLKPin, HIGH);
if (!dir) d<<=1; else d>>=1; // Shift
if (d&0x8000) dir=1; // Set direction.
if (d&0x1) dir=0;
delay(200);
}
التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 12-12-2019 الساعة 08:45 PM
|