با سلام خدمت دوستان عزیز...
حقیقتش یه دوستی توی سایت stackoverflow این سوال رو پرسیده بود. منم تصمیم گرفتم کمکش کنم و تا من اومدم این آموزش رو بنویسم یه نفر دیگه قشنگ توضیح داده بود و طرف تشکر کرده بود و گفتگو رو بسته بود.
منم گفتم این آموزش رو واسه بچه های خودمون بفرستم شاید که کمکی بکنه.
فقط دوستان اینکه من این کار رو بصورت تجربی یاد گرفتم و اینکه رشتمم الکترونیک نیست پس اگه جاهایی اشتباه لپی بود ببخشید دیگه.
خب اول از همه آی سی 74HC595 که بهش میکن آی سی شیفت ریجستر کارش چیه؟؟ این آی سی هشت تا پایه ی خروجی داره و یه پایه ورودی. شما پایه ورودی رو صفر یه یک میکنین و بهش میگین از با همیت ترین پایه شروع کن یا از کم اهمیت ترین پایه. آی سی هم میاد اون صفر یا یکی که تو پایه ی ورودی هستش رو به ترتیب تو پایه های خودش جایگذاری میکنه. یعنی اینکه سه تا پایه از آردوینو میگیره و تبدیل به هشت پایه میکنه.
حالا ترتیب پایه هاش:
کد:
1. QB
2. QC
3. QD
4. QE
5. QF
6. QG
7. QH
8. GND
9. QH~
10. SRCLR
11. SRCLK
12. RCLK
13. OE
14. SER
15. QA
16. VCC
حالا قشنگ هر کدوم رو توضیح میدم.
پایه های QA تا QH پایه های خروجی هستن.
پایه ی SER پایه ی ورودی هستش.
پایه ی SRCLK میاد اون چیزی که تو پایه ی SER هستش رو به پایه ی خروجیش انتفال میده. با هر بار دادن پالس به این پایه صفر یا یک موجود در پایه ی SER بترتیب یکی یکی به پایه ی خروجی انتقال داده میشه.
پایه RCLK صفر ور یک های پایه های خروجی رو فقط نشون میده.
پایه OE میاد صفر و یک های پایه های خروجی رو انتقال میده. که خودشم صفر فعال هستش. یعنی شما اگه بخواین خروجی های این آی سی رو بگیرین اول باید پایه ی RCLK رو HIGH کنین تا خروجی ها بتونن خونده بشن و بعدش پایه ی OE رو LOW کنین تا خروجی ها انتقال پیدا کنن.
پایه ی SRCLR کل خروجی ها رو پاک میکنه یعنی صفر میکنه که خودشم صفر فعال هستش.
حالا دستوری که ما تو آردوینو باهاش کار میکنیم و مخصوص آی سی های شیفت درست شده shiftOut هستش:
کد:
shiftOut(SER, SRCLK, [MSBFIRST, LSBFIRST], Value)
MSBFIRST و LSBFIRST
MSBFIRST یعنی اول پر اهمینت ترین پایه رو بنویس
LSBFIRST یعنی اول کم اهمیت ترین پایه رو بنویس
فقط یادتون باشه که از نظر این آی سی پایه ی QA پر اهمیت ترین پایه اس و پایه ی QH کم اهمیت ترین پایه.
VALUE
Value اینجا یه متغییر هستش که باید از نوع byte یاشه که شامل 8 bit هستش.
حالا مهمترین قسمت آموزش: کاری که این تابع انجام میده اینه که میاد اول متغییر Value رو به باینری تبدیل میکنه مثلا متغییر شممل عدد 140 هستش که میشه: حالا نگا میکنه که شما بهش گفتین اول کدوم پایه رو پر کنه. حالا فرض میکنیم نوشتین MSBFIRST. میاد عدد یک رو میذاره تو پایه ی QA و صفر رو تو QB و صفر رو QC و صفر رو تو QD و یک رو تو QE و یک رو QF و صفر رو تو QG و صفر رو تو QH.
یعنی خود تابع میاد اتومات هشت تا پالس به پایه ی SRCLK میده و با هر پالس مقدار متناظر داخل متغییر رو به پایه ی مربوطه میده.
فقط توجه کنید که اگه شما نوشته بودین LSBFIST اول میومد یک رو میداد به QH و ....... و صفر رو به QA
حالا ما پایه های آی سی رو مقدار دهی کردیم حالا باید ازش بخونیم. برای خوندن اول میایم RCLK رو برابر یک قرار میدیم و OE رو برابر صفر همین. فقط یادتون باشه که قبل از استفاده از تابع shiftOut پایه ی RCLK رو برابر صفر قرار بدین و بعدش بیاین برار یک کنینش.
خب امیدوارم گیج نشده باشین چون من گیج شدم
کد پایین یه مثال هستش که میاد ال ای دی ها رو به شکل زیبایی روشن خاموش میکنه مثل :
من کد پایین رو واسه یه سایت انگلیسی نوشته بودم و الانم راستش حوصله ندارم کامنت هاش رو فارسی کنم. راحته حقیقتش:
کد:
#define SER_pin 4 // #14 on 74HC595 ; Input
#define RCLK_pin 5 // #12 on 74HC595 ; Show Registers in Output
#define SRCLK_pin 6 // #11 on 74HC595 ; Shift Registers from Input to Output
#define OE_pin 7 // #13 on 74HC595 ; Enable Output ; LOW Enable
#define SRCLR_pin 8 // #10 on 74HC595 ; Clear Output ; LOW Enable
// #08 on 74HC595 is GND
// #16 on 74HC595 is VCC
// Output Should Be:
// &b00000001 = 1
// &b00000010 = 2
// &b00000100 = 4
// &b00001000 = 8
// &b00010000 = 16
// &b00100000 = 32
// &b01000000 = 64
// &b10000000 = 128
// shiftOut(DataPin, ClockPin, MSBFIRST, VALUE);
// Value = Value to put in Data Pin.
// Clock = Clock Pin that Shift from Input to Output
// MSBFIRST = Start From QA ; LSBFIRST Start From QH
byte Registers = 0;
void writeOnRegisters() {
Registers = 0;
for( int i = 0; i < 8; i++ ) {
if( i > 0 ) {
bitClear(Registers, i - 1);
}
bitSet(Registers, i);
Serial.println(Registers);
digitalWrite(RCLK_pin, LOW);
shiftOut(SER_pin, SRCLK_pin, MSBFIRST, Registers);
digitalWrite(RCLK_pin, HIGH);
delay(50); // Below this number it will be too fast...
}
for( int i = 7; i >= 0; i-- ) {
if ( i < 7 ) {
bitClear(Registers, i + 1);
}
bitSet(Registers, i);
Serial.println(Registers);
digitalWrite(RCLK_pin, LOW);
shiftOut(SER_pin, SRCLK_pin, MSBFIRST, Registers);
digitalWrite(RCLK_pin, HIGH);
delay(50); //// Below this number it will be too fast...
}
}
void setup() {
Serial.begin(9600);
delay(5000); //Time to Open Terminal Window
pinMode(SER_pin, OUTPUT);
pinMode(RCLK_pin, OUTPUT);
pinMode(SRCLK_pin, OUTPUT);
}
void loop() {
writeOnRegisters();
}
دوستان چند روز دیگه یه آموزش واستون میذارم در مورد آی سی مبدل هشت پایه به سریال SDA و SCL هستش که باهاش میشه با استفاده از کتابخونه ی LiquidCrystal_I2C.h یه درایور واسه LCD کاراکتری درست کنین که فقط با دوپایه کار میکنه و نیازی نیست خدا تا پایه بهش وصل کنین.
راستش رو بگم از وقتی که این آی سی رو یاد گرفتم خیلی دارم با خودم حال میکنم ...
امیدوترم از این آموزش استفاده ببرین.