2013-03-13 108 views
-1

嗨,我正在使用arm控制器lm3s8962 im無法理解下面的代碼,因爲我的理解是它檢查字符是否來自數組,或者不是,使用ascii字符創建的字符{即in while循環:而(!* pcStr = 0)}, 我不能夠得到什麼,他是線「建設,並顯示字符緩衝區」後做的代碼PLZ誰能解釋這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

如果你想要的答案,請重新組織你的問題,也請閱讀常見問題 – stdcall 2013-03-13 05:48:47

+0

嗨Mellowcandle我編輯了我的帖子,看看你是否能夠理解我的問題實際上我無法找到他如何建設buffercan u plz明確這對我來說謝謝你的回覆 – user2159417 2013-03-13 06:27:10

回答

1

他正在做一些操作來建立字節。

x |= yx = x | y相同,它將x中的所有1保留,並且如果y在同一位置具有1,則也將0中的一些更改爲1。

1 << i是一個字節,在右邊的第i個位置有一個1位。

x = y & 0xf0只將y的左4位拷貝到x中。

因此,他正在查找數組中的值,檢查這些值的特定位,然後用從這些位創建的數字填充另一個數組。你將不得不爲自己制定詳情。

+0

我理解這個代碼但是我有一些問題(ucLevel << 0),因爲UCLEVEL也是一個NO。那麼什麼是(ucLevel << 0)就是這個「<<」運算符的重疊 – user2159417 2013-03-14 05:14:11

+0

C不會超載運算符。 'ucLevel << 0'完全不會改變ucLevel。這只是與第一部分對稱,並表明作者意味着它不會被轉移。該操作將由編譯器進行優化,因此不需要任何成本。 – UncleO 2013-03-14 07:07:59