Как повернуть матрицу на 90 градусов в avr? - PullRequest
0 голосов
/ 24 июня 2018

Я пытаюсь повернуть отображаемую букву на 90 градусов по часовой стрелке и против часовой стрелки. Но когда я выполняю вложенный цикл for, выдается ошибка, подобная этой.

ALPHA - это двумерный массив, в котором хранятся жестко закодированные шаблоны букв A-Z. Эта программа пока показывает статическую букву, если я закомментирую вложенный цикл for.

led.c: In function ‘main’:
led.c:70:21: warning: iteration 1u invokes undefined behavior [- 
Waggressive-loop-optimizations]
 ALPHA_NEW[k][j] = ALPHA[i][k];
                 ^
led.c:68:4: note: containing loop
for(int k = 0; k<8; k++) 
^

не возможно ли присвоить значения в avr следующим образом?

#include <avr/io.h>

//header to enable data flow control over pins

            #define F_CPU 1000000      

//telling controller crystal frequency attached

            #include <util/delay.h>

//header to enable delay function in program

int main(void)
{

      DDRD = 0xFF;//PORTD is set as output
      DDRA = 0xFF;
     //starts from msb..lsb

//int ALPHA[1][8] = {0b00010000,0b00010000,0b00010000,0b00010000,0b00010000,0b00010000,0b00010000,0b00010000};
int ALPHA[1][8] = {0b00111100,0b01000010,0b11000011,0b11111111,0b11000011,0b11000011, 0b11000011, 0b11000011};
    char NAME[] = {0};
    uint8_t l =0;
    char PORT[8] = {1,2,4,8,16,32,64,128};//pin values of PORTD

     int fl = 1; 

int ALPHA_NEW[1][8] = {0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000};                      
while(1)
{
    //fl = 1 means rotate by 90 degree clockwise
    if(fl == 1) {
    for(int i = 0; i< 8; i++)
    {
        for(int j = 8; j>0; j--)
        {
            for(int k = 0; k<8; k++) 
            {
                ALPHA_NEW[k][j] = ALPHA[i][k];
            }
        }
        //ALPHA[0][i] = 0b00000000; 

    }
//ALPHA[0][4] = 0b11111111;

        }
    for (int m=0;m<sizeof NAME;m++)
    {
        l = NAME[m];

    for (int n=0;n<800;n++)//execute 200 times for the eye to catch

     {
            for (int j=0;j<4;j++)

                            {
                                 PORTD = PORT[j];// ROW
                                 PORTA = ~ALPHA[l][j];
                    _delay_ms(1);
                }

                  // PORTD=0x00;//clear screen after show

                   for (int k=0;k<4;k++)

                         {
                PORTD = PORT[k+4];// ROW
                PORTA = ~ALPHA[l][k+4];
                 _delay_ms(1);

                         }



        }
        PORTD=0x00;//clear screen after show.
           // _delay_ms(500);


    }
        //_delay_ms(500);

      }

}

1 Ответ

0 голосов
/ 24 июня 2018

Прежде всего , ваши массивы внешнее измерение ваших массивов составляет [1]:

int ALPHA[1][8] = ...
int ALPHA_NEW[1][8] = ...

т.е. только допустимые индексы [0]. Но вы перебираете от 0 до 7

for(int i = 0; i< 8; i++)
...
        for(int k = 0; k<8; k++) 
            ALPHA_NEW[k][j] = ALPHA[i][k];

При доступе к массивам за их пределами содержимое памяти может быть повреждено и может вызвать непреднамеренное поведение.

Второй . Если вам нужен одномерный массив 8-разрядных целых чисел без знака, то почему бы не определить его таким образом?

uint8_t ALPHA[8] = { .... }

Третий . Это не ясно из вашего вопроса, но, как я предполагаю из содержимого массива, у вас есть изображение размером 8 x 8 пикселей, которое содержится в виде битовой карты в 8 последовательных элементах массива. Вам нужен еще один массив из 8 элементов, в котором одно и то же изображение будет вращаться по часовой стрелке или против часовой стрелки.

Для этого вам необходимо скопировать в первый элемент новых значений массива все первые (или последние) биты исходного массива. Во втором пункте - все вторые (или 7-е) биты и т. Д. 8 раз. Порядок следования битов зависит от того, в каком направлении вы поворачиваете изображение и как оно сохраняется. Давайте предположим, что элементы массива хранят горизонтальные строки пикселей, сверху вниз, самый старший бит представляет самый левый пиксель.

// Array containing the source 8x8 bit-mapped monochrome image
uint8_t source_img[8] = {0b00111100,0b01000010,0b11000011,0b11111111,0b11000011,0b11000011, 0b11000011, 0b11000011}; 
// Array to store rotated imaged
uint8_t dest_img[8];

if (counterclockwise) {
  for (uint8_t y = 0 ; y < 8 ; y++) { 
    uint8_t mask = (1 << y); // mask of a bit to pick from source array;
    uint8_t buf = 0; // buffer of one row bits in the destination array
    for (uint8_t x = 0 ; x < 8 ; x++) {
      buf <<= 1; // shift bits one position left 
      if (source_img[x] & mask) { // if masked bit in source array is set, 
        buf |= 1;  // set the rightmost bit in the buffer
      }
    } 
    dest_img[y] = buf;
  }
} else if (clockwise) {
  for (uint8_t y = 0 ; y < 8 ; y++) { 
    uint8_t mask = (0x80 >> y); // mask of a bit to pick from source array;
    uint8_t buf = 0; // buffer of one row bits in the destination array
    for (uint8_t x = 0 ; x < 8 ; x++) {
      buf >>= 1; // shift bits one position right
      if (source_img[x] & mask) { // if masked bit in source array is set, 
        buf |= 0x80;  // set the leftmost bit in the buffer
      }
    } 
    dest_img[y] = buf;
  }
}

после этого dest_img будет содержать повернутое растровое изображение буквы 8x8

...