Избитая тема с регистром сдвига 74hc165 и подключением кнопок! (мозг задеревенел)

Oleg_balt
Offline
Зарегистрирован: 07.06.2015

Добрый день, прошу помощи. 

http://robocraft.ru/blog/arduino/520.html 

собрал все как в статье, пример  работает. 

Но мне надо подкорректировать программу (или другие варианты кода) а я не догоняю так как не силен в программировании.

Смысл прост при нажатии любой кнопки совершается какое то закрепленное за этой кнопкой действие.

Не смог реализовать это программно не получается определить какая кнопка нажата была, подскажите.

 

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Oleg_balt Я не смогу вам помочь , так как вы в программировании не сильны. А я в даун-Си не пишу. Извените.

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Oleg_balt, Вы неправильно выбрали раздел. Обратитесь в "Ищу исполнителя". там помогут.

Oleg_balt
Offline
Зарегистрирован: 07.06.2015

хорошо попробую так описать вот мой детский  вариант,   в программе считывается байт и показывается число которое меняется взависимости какие входы на регистре сдвига, но меня не интересует число мне надо знать какой вход подал сигнал по умолчанию на входе 1 при нажатии кнопки на входе 0. Но не хватает кусочка кода как вычислить именно какой вход сработал на регистре сдвига. Мне кажется это не сложно но я не догоняю, допустим три кнопки сидят на входе регистра a,b,c если ничего не нажато получаем h =1, g=1,f=1,d=1, c=1, b=1, a=1 , если срабатывают три кнопки получаю 11111000 (или 00011111 как правильно принимает?)  Мне надо определить как раз, что a,b,c  сработали , как реализовать ?

 

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);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015
Oleg_balt
Offline
Зарегистрирован: 07.06.2015
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);
}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

главная ваша ошибка, это то что вы подключаете кнопки , как это обычно делают в Даун-Си. Я же давно отказался от этой идиотии заключил кнопку в класс. Дальше. Вспомните команду digitalRead(pin). Где там считывание всего байта. Там идет считывание одного бита. А ведь нет в процессоре команды считывания бита.  Вспомните фразу Морфея в Матрице , когда он побил Нео. Я в комнате даже не дышу.  Ложки нет.  .... Регистра 74HC165 нет.

  Почему вам не нарисовать функцию 

bool bitRead (byte /*номер ввода регистра на кнопке*/) pin);

   И все дальше как вы всегда делаете.

/*
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

Oleg_balt
Offline
Зарегистрирован: 07.06.2015

  Спасибо всем кто откликнулся.

вот вариант 

 

#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); 
}