7-сегментный светодиод + 4094

Я хотел бы отобразить 2 числа, используя два регистра сдвига 4094, 7-сегментный светодиод и ATmega 328p. Мой текущий код:

uint8_t LED[10]={0b11111100,0b01100000,0b011011010,0b011110010,0b01100110,0b10110110,0b10111110,0b111000000,0b11111110,0b11110110};


int j =Led; //input from the main
uint8_t num_1=Led/10;
uint8_t num_2=Led%10;       
Strobe=0;
uint8_t mask=0x80;
 for(uint8_t i=0; i<8; i++)
  {
      mask=mask>>1;     

    if( (LED[num_1]  & mask) ==1)
    {
        DATA= 1;
    }
    else
    {

        DATA= 0;
    }
    pulse();
}
mask=0x80;
for(uint8_t i=0; i<8; i++)
{
    mask=mask>>1;
     ;

    if( (LED[num_2]  & mask)==1)
    {
        DATA= 1;
    }
    else
    {

        DATA= 0;
    }
    pulse();
}

Но, конечно, это не работает должным образом. Он генерирует только 0. Можете ли вы указать мне правильное направление? РЕДАКТИРОВАТЬ: я использую Atmel studio 6. Цель кода - сгенерировать число от 00 до 16.


person user3713940    schedule 16.01.2015    source источник
comment
Пожалуйста, предоставьте более подробную информацию. Является ли целью создание некоторого битового шаблона или последовательности битовых шаблонов? Код выглядит как C, это на самом деле C?   -  person Codor    schedule 16.01.2015
comment
4094 требуется дополнительный сигнал для сохранения сдвинутых значений во внутренний регистр, в котором хранятся выходные данные. Я не вижу, чтобы вы заботились об этом (между сдвигом двух цифр).   -  person Cactus    schedule 16.01.2015
comment
Если вы показываете код, вы должны пометить язык. Помимо помощи людям в поиске вопроса, это также влияет на подсветку синтаксиса.   -  person crashmstr    schedule 16.01.2015


Ответы (1)


Во-первых, вы должны поставить mask = mask>>1 в конце цикла.

Во-вторых, вам нужно заменить
if( (LED[num_2] & mask) == 1 ) на
if( (LED[num_2] & mask) == mask) или просто
if( LED[num_2] & mask )

Маска может быть 0b10000000, 0b01000000,...,0b00000001.
Результат операции & может быть только таким же, как маска или ноль.
А правая часть оператора == это 1, что всегда равно 0b00000001.

person iama    schedule 16.01.2015
comment
Могу ли я избавиться от оператора if и написать напрямую Data= LED[num_2] & mask?? - person user3713940; 17.01.2015
comment
Как я уже упоминал ранее, результат операции И может быть таким же, как маска или ноль. Вы можете сделать это, когда результат равен нулю. Когда результатом является маска, результат будет ненулевым, что не совпадает с 1. Согласно принципу 4094, данные могут быть только 1 или 0. - person iama; 17.01.2015
comment
Я думаю, что самый быстрый способ - это Data = !!(LED[num_2] & mask). Второй ! преобразует маску (ненулевую) в 0 или 0 в 1< /б>. Первый ! исправляет логику. Я не думал об этом раньше, пока вы не упомянули об этом, спасибо вам то же. - person iama; 17.01.2015