Задать вопрос
@formasters777

Побитовая отправка данных arduino и операторы &? :?

Есть динамич. 7-сегм. индикатор и LED контроллер типа tm (int tm_dio = D1; int tm_clk = D2; int tm_stb = D3;)
Есть метод отправки данных с типом байт на пин dio:

void t_send(byte data)
{
  for (int i = 0; i < 8; i++) {
    digitalWrite(clockPin, LOW);
    digitalWrite(dataPin, data & 1 ? HIGH : LOW);
    data >>= 1;
    digitalWrite(clockPin, HIGH);
  }
}

void t_sendData(byte address, byte data)
{
  t_sendCommand(0x44);
  digitalWrite(strobePin, LOW);
  t_send(0xC0 | address);
  t_send(data);
  digitalWrite(strobePin, HIGH);
}


отправка
адрес число
t_sendData(0b11000000, 0b00000110); // 1-й сегмент (число один)

Как правильно прочитать запись строки digitalWrite(tm_dio, data & 1 ? HIGH : LOW);
что она означает.
Каждый цикл for(0-8) передаётся 1 бит? или серия из 8 битов?
digitalWrite на пине tm_dio записывает HIGH или LOW и собирает запись типа 0b01011001?
или эта строка просто интерпретирует данные data = 0b00000110 (число один на сегменте) и загоняет их на пин в нужном порядке и режиме (rising edge), но почему тогда на диаграмме поле DIO имеет две чёрных линии которые пересекаются перед падением CLK.

Например, метод digitalWrite имеет два параметра,
первый это указание пина, второй параметр data, но у него есть указатель на число 1 и тернарный оператор ? и варианты LOW или HIGH,
после идёт сдвиг data на 1 бит вправо.

62928afe19b00117584998.jpeg
62928b0e42d37932552045.jpeg
спасибо.
  • Вопрос задан
  • 477 просмотров
Подписаться 2 Средний Комментировать
Решения вопроса 1
a_volkov1987
@a_volkov1987
Инженер-схемотехник
digitalWrite(tm_dio, data & 1 ? HIGH : LOW) означает что мы берём пин tm_dio, берём младший бит переменной data (формально мы проводим операцию and между битовым представлением data и числом 1, которая оставит исходное значение только в младшем бите, ведь x&1=x, и обнулит остальные биты, поскольку x&0=0) и если в младшем бите 1, то в функцию digitalWrite отправится HIGH, а если 0 - LOW.
А потом мы в data сделаем сдвиг данных вправо на 1 бит
Таким образом за 8 итераций из младшего бита переменной data считается вся переменная и каждый ее бит будет отправлен в виде LOW или HIGH в функцию digitalWrite.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Это тернарный оператор. По простому - если истинно выражение до "?", то выполнится то, что до ":", иначе - после.
if(data)
digitalWrite(tm_dio, HIGH);
else
digitalWrite(tm_dio, LOW);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы