Прокрутка семисегментного дисплея

Я кодирую дисплей SSD, используя 2 каскадных сдвиговых регистра. Я использую компилятор mikroC для PIC. Я могу отображать статическую последовательность чисел до 4 цифр с помощью моего кода Статическое отображение 4 чисел

    #define SHIFT_CLOCK PORTB.F1    //Clock Connection of 74HC595 SSD Driver
    #define SHIFT_LATCH PORTB.F3    //Latch Connection of 74HC595 SSD Driver
    #define SHIFT_DATA PORTB.F2    //Data Connection of 74HC595 SSD Driver

    char array4[4] = {6, 91, 79, 102};           //Display 1234 on SSD
    char digit[4] = {0xFE, 0xFD, 0xFB, 0xF7};   //Switch on the SSD digits one by one

    char i,j,temp,flag1,flag2;

    void InitTimer0()
    {
     OPTION_REG     = 0x86;
     TMR0           = 6;
     INTCON         = 0xA0;
    }

    void latch595()
    {
     SHIFT_LATCH = 1;
     Delay_us(1);
     SHIFT_LATCH = 0;
    }

    void shiftdata595(unsigned char _shiftdata)
    {
     int i;
     unsigned char temp;
     temp = _shiftdata;
     i=8;
     while (i>0)
     {
      if (temp.F7==0)
       {
        SHIFT_DATA = 0;
       }
       else
       {
        SHIFT_DATA = 1;
       }
       temp = temp<<1;
       SHIFT_CLOCK = 1;
       SHIFT_CLOCK = 0;
       i--;
     }
    }

    void Interrupt()
    {
     if (TMR0IF_bit)
     {
      TMR0IF_bit  = 0;
      TMR0        = 6;
      flag1 = 1;
      flag2 = 1;
     }
    }

    void main()
    {
     TRISB = 0;
     TRISC.F1 = 1;
     InitTimer0();
     while (1)
     {
      if (PORTC.F1==0)
      {
       if (flag2==1)
       {
        shiftdata595(digit[i]);
        i++;
        if(i==4)
        {
         i=0;
        }
        if (flag1==1)
        {
         shiftdata595(array4[j]);
         latch595();
         j++;
         if (j==4)
         {
          j=0;
         }
        }
       }
      }
      else if(PORTC.F1==1)
      {
       shiftdata595(0);
       shiftdata595(0);
       latch595();
      }
     }
    }

Если я добавлю больше цифр в массив4[], скажем, до 9, мне нужно будет последовательно прокручивать цифры влево. Я попытался сдвинуть массив на

temp = array4[0];
for (n=1; n<8; n++)
{
 array4[j-1] = array[j];
}
array[9] = temp;

Я надеялся, что этот код сдвинет массив влево, а дисплей будет прокручиваться, но все, что я получаю, — это беспорядочное отображение. Если я добавлю задержку, я увижу, что числа отображаются, но без прокрутки.

Является ли базовый алгоритм неверным или его можно использовать, изменив код?


person Ace    schedule 25.07.2017    source источник
comment
Почему вы используете n в качестве переменной цикла, а j для индексации array4[]? Кроме того, вы индексируете массив из 9 элементов за пределами диапазона с помощью array[9] = temp; Наконец, array4 - это опечатка? - вы используете как array, так и array4.   -  person Weather Vane    schedule 25.07.2017
comment
Извините, array[9]=temp — это опечатка. Я хотел ввести array4[9] = temp. Также я пытался использовать j в качестве переменной цикла, но тот же результат   -  person Ace    schedule 25.07.2017
comment
Итак, где вы устанавливаете array4[8]?   -  person Weather Vane    schedule 25.07.2017
comment
Допустим, массив равен array4[10] = {6, 91, 79, 102, 109, 125, 7, 127, 111, 63}; Теперь массив нужно сдвинуть влево, чтобы дать и первый элемент в массиве4[] переходит во временную переменную. Массив сдвигается влево от массива4[1] и далее к платному массиву4[9]. После этого временная переменная помещается на место массива4[10].   -  person Ace    schedule 25.07.2017
comment
Вы изменили его с 9 на 10 элементов, но снова нет array4[10] места. Это вне пределов.   -  person Weather Vane    schedule 25.07.2017
comment
Нужно ли мне держать его на месте array4 [9]? Но все же я не решаю проблему   -  person Ace    schedule 25.07.2017
comment
Опубликуйте фактический код, который вы используете для смещения символов, если вы исправили ошибки, указанные @WeatherVane. Вы уже используете поле j для чего-то еще в этой функции, вы должны были просто использовать n во всем цикле. И не используйте глобальные поля в качестве переменных цикла, это очень плохая идея.   -  person Groo    schedule 27.07.2017
comment
Да, я исправил ошибки, на которые указал @WeatherVane, но проблема осталась. Я все еще работаю над этим и скоро опубликую рабочий код.   -  person Ace    schedule 27.07.2017


Ответы (1)


Я понял проблему с моим кодом. Петля была неправильной. Я использую два 74HC595 в каскадном режиме. Один управляет цифрами (общий катод), а другой управляет сегментами. Поскольку существует только одна линия данных, которая передает информацию как к цифрам, так и к сегментам, необходимо координировать синхронизацию продвижения цифр и сегментов. Вся проблема заключалась в том, что я излишне концентрировался на временной части, которая была скоординирована, но вместо этого я должен был сосредоточиться на условии цикла, которое продвигает сегменты, а затем сдвигает массив влево.

Друг указал, что мне нужно записать значения данных на листе бумаги для каждого цикла, и это решило проблему. Вместо того, чтобы передавать в цикл длину массива вручную, например, array4[8] или array4[10], я использовал функцию sizeof(), а затем, после первых четырех итераций цикла, сместил массив влево на одну позицию. Теперь прокрутка работает идеально.

Вот обновленный и рабочий код,

shiftdata595(array4[tmp7]);
 latch595();
  Delay_ms(32);
  tmp7++;
 if (tmp7>=4)
 {
  tmp7=0;
  tmp1 = sizeof(array4)/sizeof(array4[0]);
  tmp2 = array4[0];
  for (n=1;n<tmp1;n++)
  {
   array4[n-1] = array4[n];
  }
  array4[tmp1-1] = tmp2;
  }
person Ace    schedule 28.07.2017