2013-03-13 81 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