bitWrite().
int dataPin = 9; // к выводу 14 регистра
int clockPin = 11; // к выводу 11 регистра (SH_CP)
int latchPin = 12; // к выводу 12 регистра (ST_CP)
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
}
void loop() {
byte byteToSend = 0; //Создаем пустой байт B00000000
for (int bitPos = 0; bitPos < 8; bitPos++) { // В переменной хранится позиция изменяемого бита
byteToSend = 0; // Обнуляем байт при каждом проходе
bitWrite(byteToSend, bitPos, HIGH); // При bitPos=0 получим B00000001, при bitPos=1 - B00000010, при bitPos=2 - B00000100 и т.д.
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, byteToSend); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
digitalWrite(latchPin, HIGH);
delay(50);
}
}
Nima bo'layotganini yaxshiroq tushunish uchun kod oddiyroq.
int dataPin = 9; // к выводу 14 регистра
int clockPin = 11; // к выводу 11 регистра (SH_CP)
int latchPin = 12; // к выводу 12 регистра (ST_CP)
byte leds = 0;
int currendLed = 0;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
leds = 0;
}
void loop() {
leds = 0;
if (currendLed == 7) {
currendLed = 0;
}
else {
currendLed++;
}
bitSet(leds, currendLed);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, LSBFIRST, leds);
digitalWrite(latchPin, HIGH);
delay(250);
}
Setup() usulida biz oddiygina pin rejimlarini va LED o'zgaruvchisini ishga tushiramiz.
Loop() usulida biz har bir iteratsiya boshida led o'zgaruvchisidagi bitlarni tozalaymiz, shunda barcha bitlar 0 ga o'rnatiladi, chunki biz bir vaqtning o'zida faqat bitta LEDni yoqishni xohlaymiz. Shundan so'ng biz to'g'ri LEDni qayta yoqishimiz uchun joriyLed o'zgaruvchisini oshiramiz yoki qayta o'rnatamiz.
Ushbu ikkita operatsiyadan so'ng biz bitni almashtirishga o'tamiz. Biz bitlarni saqlaydigan baytni va currentLed o'zgaruvchisini o'tkazadigan bitSet () usulini chaqirishdan boshlaymiz.
Bu usul baytning alohida bitlarini ularning joylashuvini belgilash orqali o'rnatishga imkon beradi. Misol uchun, agar biz baytni 10010 ga qo'lda o'rnatmoqchi bo'lsak, biz quyidagi qo'ng'iroqlardan foydalanishimiz mumkin, chunki biz 1 ga o'rnatishimiz kerak bo'lgan bitlar o'ngdan ikkinchisi (biz 0 pozitsiyasidan boshlaganimizda 1 pozitsiyasi) va 4-pozitsiyada joylashgan o'ngdan beshinchi:
bitSet(leds, 1);
bitSet(leds, 4);
Shunday qilib, biz har safar currentLed o'zgaruvchisini oshirganimizda va uni bitSet() usuliga o'tkazganimizda, biz har safar oldingisining chap tomonidagi bitni 1 ga o'rnatamiz va shu tariqa siljish registriga oldingisining chap tomonidagi chiqishni faollashtirishini aytamiz. bitta.
Bit o'rnatilgandan so'ng, biz mandal piniga siljish registriga ma'lumot jo'natishimiz haqida ko'rsatma yozamiz. Buni bajarganimizdan so'ng, biz shiftOut() usulini chaqiramiz. Usul bitta qo'ng'iroqda bitlarni almashtirish imkonini beradi. Buni amalga oshirish uchun biz dastlabki ikkita parametr sifatida ma'lumotlar va vaqtni o'tkazamiz, so'ngra birinchi bit eng kam ahamiyatli bit bo'lishi kerakligini ko'rsatadigan LSBFIRST konstantasini o'tkazamiz, so'ngra biz haqiqatda kerakli bitlarni o'z ichiga olgan baytni aylantiramiz. smenali registrga o'tkazish.
Bitlarni almashtirishni tugatganimizdan so'ng, biz barcha ma'lumotlarni jo'natganimizni ko'rsatish uchun yana mandal piniga kiramiz (bu safar HIGH tugmasidan foydalanib). Yozish jarayoni tugagandan so'ng, tegishli LED indikatori yonadi va keyin hamma narsa takrorlanishidan oldin 250 millisekundga kechiktiriladi.
Shift registrlarini ketma-ket ulash
Ko'p sonli siljish registrlarini ketma-ket ulash uchun Q7 registridan foydalaniladi - ma'lumotlar kelishi bilan u orqali suriladi. 11 (SH_CP, soat) va 10 (ST_CP, "latch") chiqishlari parallel ravishda ulanadi va sinxron tarzda boshqariladi.
Codius veb-saytida o'qing
PWM
PWM-dan qanday foydalanish kerak, chunki biz ko'pincha LEDlarni registr yordamida boshqaramiz va registr chiqishi faqat 3 ta holatga ega bo'lishi mumkin - LOW mantiqiy nol, YUQORI mantiqiy birlik va yuqori empedans holati (pinning elektr pallasida jismoniy aloqasi yo'q). Va haqiqatan ham, PWM o'zgartirish registri qo'llab-quvvatlanmaydi, lekin bitta kichik hiyla bor - biz OE (Output Enable input) registrining chiqishidan foydalanishimiz mumkin - u yuqori holatdan nolga o'tish uchun javobgardir. Chiqish OE - barcha chiqishlar uchun mantiqiy nol deb atash mumkin. Shunday qilib, agar biz ushbu pinni Arduino-ning PWM chiqishiga ulasak, biz mantiqiy nolga o'tishimiz mumkin va shu bilan LEDlarda PWM ni simulyatsiya qilamiz.
Codius veb-saytida o'qing
int dataPin = 9; //Пин подключен к DS входу 74HC595
int latchPin = 10; //Пин подключен к ST_CP входу 74HC595
int clockPin = 11; //Пин подключен к SH_CP входу 74HC595
int pwmPin = 6; //Пин подключен к OE входу 74HC595 для управления ШИМ
void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
digitalWrite(latchPin, LOW); // устанавливаем синхронизацию "защелки" на LOW
shiftOut(dataPin, clockPin, LSBFIRST, B11110001);
digitalWrite(latchPin, HIGH); //"защелкиваем" регистр, тем самым устанавливая значения на выходах
}
void loop() {
for (int i=0; i<256; i++) {
analogWrite(pwmPin,i); // Назначаем выходу ШИМ разные значения
delay(2); // Делаем паузу, чтобы не мигало слишком быстро
}
}
Ushbu yondashuvning nochorligi shundaki, bu holda bir smenali registrga ulangan barcha LEDlarning yorqinligi tartibga solinadi. Ammo bir xil siljish registriga ulangan LEDlarning turli yorqinligini ko'rsatishimiz kerak bo'lsa-chi. Bu erda siz yana hiyla-nayrangga o'tishingiz kerak bo'ladi - LEDlarning yorqinligi xaritasini yarating va har bir guruhni o'z yorqinligi bilan o'z navbatida yoqing, shunda doimiy porlash hissi paydo bo'ladi:
int dataPin = 9; //Пин подключен к DS входу 74HC595
int latchPin = 10; //Пин подключен к ST_CP входу 74HC595
int clockPin = 11; //Пин подключен к SH_CP входу 74HC595
int pwmPin = 6; //Пин подключен к OE входу 74HC595 для управления ШИМ
byte _map[2]= {
B01010101,
B10101010
};
void setup() {
//устанавливаем режим OUTPUT
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(pwmPin, OUTPUT);
digitalWrite(pwmPin, LOW);
}
void loop() {
for (int i=0; i<=255; i++) {
showLed(_map[0],i);
showLed(_map[1],255-i);
}
for (int i=255; i>=0; i--) {
showLed(_map[0],i);
showLed(_map[1],255-i);
}
}
void showLed(byte mapLed, int brightness) {
digitalWrite(pwmPin, LOW);
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, mapLed); // Инвертируем сигнал при помощи MSBFIRST, грузим с первого бита
digitalWrite(latchPin, HIGH);
analogWrite(pwmPin, brightness);
delay(5);
}
Ammo, agar siz kechikishlar va ko'p sonli yorqinlik xaritalari bilan tajriba qilishni boshlasangiz, siz juda yoqimsiz miltillovchi effektga duch kelasiz - bu Arduino tilini o'rashning standart funktsiyalari, masalan, digitalWrite, digitalRead, analogWrite, analogRead va boshqalarning uzoq bajarilishi bilan bog'liq.
STP16C596 kabi boshqa registrlar qo'shimcha rezistorlarsiz bir vaqtning o'zida 16 tagacha LEDni boshqarishi mumkin.
Qo'shimcha materiallar
Biz 74HC595 smenali registr (rasmiy hujjatlar tarjimasi) yordamida natijalarni ko'paytiramiz.
74hc595 arduino: shift registri, foydalanish asoslaris
Do'stlaringiz bilan baham: |