2013-03-13 4 views
-1

привет, я работаю над контроллером плеча lm3s8962 im не могу понять приведенный ниже код в соответствии с моим пониманием, он проверяет, является ли символ из массива или нет, который он создал с помощью символов ascii { цикл в то время как: в то время как (! * pcStr = 0)}, я не могу получить то, что он делает в коде после строки «Build и отображения буфера символов» плз может кто-нибудь объяснить этоarm cortex m3 display

void 
    RIT128x96x4StringDraw(const char *pcStr, unsigned long ulX, 
          unsigned long ulY, unsigned char ucLevel) 
    { 
     unsigned long ulIdx1, ulIdx2; 
     unsigned char ucTemp; 

     // 
     // Check the arguments. 
     // 
     ASSERT(ulX < 128); 
     ASSERT((ulX & 1) == 0); 
     ASSERT(ulY < 96); 
     ASSERT(ucLevel < 16); 

     // 
     // Setup a window starting at the specified column and row, ending 
     // at the right edge of the display and 8 rows down (single character row). 
     // 
     g_pucBuffer[0] = 0x15; 
     g_pucBuffer[1] = ulX/2; 
     g_pucBuffer[2] = 63; 
     RITWriteCommand(g_pucBuffer, 3); 
     g_pucBuffer[0] = 0x75; 
     g_pucBuffer[1] = ulY; 
     g_pucBuffer[2] = ulY + 7; 
     RITWriteCommand(g_pucBuffer, 3); 
     RITWriteCommand(g_pucRIT128x96x4VerticalInc, 
         sizeof(g_pucRIT128x96x4VerticalInc)); 

     // 
     // Loop while there are more characters in the string. 
     // 
     while(*pcStr != 0) 
     { 
      // 
      // Get a working copy of the current character and convert to an 
      // index into the character bit-map array. 
      // 
      ucTemp = *pcStr++ & 0x7f; 
      if(ucTemp < ' ') 
      { 
       ucTemp = 0; 
      } 
      else 
      { 
       ucTemp -= ' '; 
      } 

      // 
      // Build and display the character buffer. 
      // 
      for(ulIdx1 = 0; ulIdx1 < 6; ulIdx1 += 2) 
      { 
       // 
       // Convert two columns of 1-bit font data into a single data 
       // byte column of 4-bit font data. 
       // 
       for(ulIdx2 = 0; ulIdx2 < 8; ulIdx2++) 
       { 
        g_pucBuffer[ulIdx2] = 0; 
        if(g_pucFont[ucTemp][ulIdx1] & (1 << ulIdx2)) 
        { 
         g_pucBuffer[ulIdx2] = (ucLevel << 4) & 0xf0; 
        } 
        if((ulIdx1 < 4) && 
         (g_pucFont[ucTemp][ulIdx1 + 1] & (1 << ulIdx2))) 
        { 
         g_pucBuffer[ulIdx2] |= (ucLevel << 0) & 0x0f; 
        } 
       } 

       // 
       // Send this byte column to the display. 
       // 
       RITWriteData(g_pucBuffer, 8); 
       ulX += 2; 

       // 
       // Return if the right side of the display has been reached. 
       // 
       if(ulX == 128) 
       { 
        return; 
       } 
      } 
     } 
    } 
+0

Если вы хотите получить ответы, пожалуйста, реорганизуйте свой вопрос, пожалуйста, прочитайте FAQ – stdcall

+0

hi Mellowcandle Я отредактировал мое сообщение, если у вас есть возможность понять мою проблему, на самом деле я не могу найти, как он строит буферизацию u plz clear это мне спасибо за ур ответить – user2159417

ответ

1

Он делает несколько манипуляций для создания байт.

x |= y - это то же самое, что и x = x | y, которое сохраняет все 1s в x, а также изменяет некоторые из 0s на 1, если y имеет 1 в том же положении.

1 << i - это байт с одним 1 битом в i-й позиции справа.

x = y & 0xf0 копирует только левые 4 бита y в x.

Поэтому он ищет значения в массиве, проверяя определенные биты этих значений, а затем заполняя другой массив числом, созданным из этих битов. Вам нужно будет разобраться в деталях для себя.

+0

I ПОНИМАТЬ КОД, НО Я НЕ ИМЕЮЩИЙ НЕКОТОРУЮ ПРОБЛЕМУ (ucLevel << 0) AS UCLEVEL ТАКЖЕ НЕТ. ТОГДА ЧТО (ucLevel << 0) ДЕЛАЕТ ЭТО ПЕРЕРЫВАНИЕ «<<» ОПЕРАТОР – user2159417

+0

C не перегружает операторов. 'ucLevel << 0' вообще не изменяет ucLevel. Он просто должен быть симметричным с первой частью и показать, что автор имел в виду, что он не сдвигается. Операция будет оптимизирована компилятором, поэтому для нее нет затрат. – UncleO

Смежные вопросы