Избитая тема с регистром сдвига 74hc165 и подключением кнопок! (мозг задеревенел)
- Войдите на сайт для отправки комментариев
Ср, 31/05/2017 - 21:51
Добрый день, прошу помощи.
http://robocraft.ru/blog/arduino/520.html
собрал все как в статье, пример работает.
Но мне надо подкорректировать программу (или другие варианты кода) а я не догоняю так как не силен в программировании.
Смысл прост при нажатии любой кнопки совершается какое то закрепленное за этой кнопкой действие.
Не смог реализовать это программно не получается определить какая кнопка нажата была, подскажите.
Oleg_balt Я не смогу вам помочь , так как вы в программировании не сильны. А я в даун-Си не пишу. Извените.
Oleg_balt, Вы неправильно выбрали раздел. Обратитесь в "Ищу исполнителя". там помогут.
хорошо попробую так описать вот мой детский вариант, в программе считывается байт и показывается число которое меняется взависимости какие входы на регистре сдвига, но меня не интересует число мне надо знать какой вход подал сигнал по умолчанию на входе 1 при нажатии кнопки на входе 0. Но не хватает кусочка кода как вычислить именно какой вход сработал на регистре сдвига. Мне кажется это не сложно но я не догоняю, допустим три кнопки сидят на входе регистра a,b,c если ничего не нажато получаем h =1, g=1,f=1,d=1, c=1, b=1, a=1 , если срабатывают три кнопки получаю 11111000 (или 00011111 как правильно принимает?) Мне надо определить как раз, что a,b,c сработали , как реализовать ?
http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...
int sh = 8; // защелка int data = 11; // данные int clk = 12; // тактовый вход void setup() { pinMode(sh, OUTPUT); pinMode(data, INPUT); pinMode(clk, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(sh, HIGH); // запоминаю входы для считывания byte val = 0; for (int i=0; i<8; i++) { digitalWrite(clk, HIGH); delay(10); val |= digitalRead(data) << (7 - i); digitalWrite(clk, LOW); } Serial.println (val); digitalWrite(sh, LOW); delay (2000); }главная ваша ошибка, это то что вы подключаете кнопки , как это обычно делают в Даун-Си. Я же давно отказался от этой идиотии заключил кнопку в класс. Дальше. Вспомните команду digitalRead(pin). Где там считывание всего байта. Там идет считывание одного бита. А ведь нет в процессоре команды считывания бита. Вспомните фразу Морфея в Матрице , когда он побил Нео. Я в комнате даже не дышу. Ложки нет. .... Регистра 74HC165 нет.
Почему вам не нарисовать функцию
И все дальше как вы всегда делаете.
/* clk->13 data->12 Latch->8 */ #include <SPI.h> byte Latch_pin = 8; // защелка bool bit_Read(byte _bit) { digitalWrite(Latch_pin, LOW); digitalWrite(Latch_pin, HIGH); bool stat = (SPI.transfer(0) >> _bit)&0x01; return stat; } void setup() { Serial.begin(9600); SPI.begin(); pinMode(Latch_pin, OUTPUT); digitalWrite(Latch_pin, HIGH); } void loop(){ delay(200); Serial.println(bit_Read(0));// 0,1,.7 }пс:http://robocraft.ru/blog/arduino/520.html
Спасибо всем кто откликнулся.
вот вариант
#define latch_SH_in 8 // SH #define data_SH_in 11 // QH #define clock_SH_in_out 12// CLK void setup() { Serial.begin(9600); pinMode(latch_SH_in, OUTPUT); pinMode(data_SH_in, INPUT); pinMode(clock_SH_in_out, OUTPUT); } void loop() { uint8_t a = 0; digitalWrite(latch_SH_in, HIGH); for (int i=7; i>=0; i--) { digitalWrite(clock_SH_in_out,LOW); delayMicroseconds(1); a |= (digitalRead(data_SH_in) ? (1<<i) : 0); digitalWrite(clock_SH_in_out,HIGH); delayMicroseconds(1); } digitalWrite(latch_SH_in, LOW); Serial.print("<"); Serial.print(a, BIN); Serial.print(">"); if (!((a>>0)&1)) Serial.print(0); if (!((a>>0)&2)) Serial.print(1); if (!((a>>0)&4)) Serial.print(2); if (!((a>>0)&8)) Serial.print(3); if (!((a>>0)&16)) Serial.print(4); if (!((a>>0)&32)) Serial.print(5); if (!((a>>0)&64)) Serial.print(6); if (!((a>>0)&128)) Serial.print(7); // выдаст номера портов,которые подключены на GND. Serial.println("--"); delay(1000); }