⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcdconf_7529.c

📁 ST7529液晶驱动 The ST7529 is a driver & controller LSI for 32 gray scale graphic dot-matrix liquid cryst
💻 C
📖 第 1 页 / 共 3 页
字号:
          }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y, x1, y+1);
          for(i = x0; i < x1; i+=3)
          LCD_WRITE_A0(ScanBuff[y][i/3]);
     }
        
  } 
  else                                                                  //正常模式
  {
      
      uint16 colour;
      uint8 c = LCD_COLORINDEX, i;
      
      if(c == 0)colour = 0;                                             //索引值转换
      else if((c > 0) && (c <= 5))colour = 0x4208;
      else if((c > 5) && (c <= 10))colour = 0x8410;
      else if((c > 10) && (c < 15))colour = 0xc618;
      else colour = 0xffff;
      
      if((remainder_x0 == 0) && (remainder_x1 == 2))                    //开始和结束的像素都是3的倍数
      {
          for(i = x0; i < x1; i+=3)
          ScanBuff[y][i/3] = colour;
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y, x1, y+1);
          for(i = x0; i < x1; i+=3)
          LCD_WRITE_A0(colour);
      }
      else if((remainder_x0 != 0) && (remainder_x1 == 2))               //开始的像素不是3的倍数
      {    
          switch(remainder_x0)
          {
              case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
              case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
              default:break;
          }
          for(i = x0 + 3; i <= x1; i+=3)
          ScanBuff[y][i/3] = colour;
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y, x1, y+1);
          LCD_WRITE_A0(ScanBuff[y][x0/3]);
          for(i = x0 + 3; i <= x1; i+=3)
          LCD_WRITE_A0(colour);
      }
      else if((remainder_x0 == 0) && (remainder_x1 != 2))               //结束的像素不是3的倍数
      {    
          switch(remainder_x1)
          {
              case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
              case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
              default:break;
          }
          for(i = x0; i <= (x1 - 3); i+=3)
          ScanBuff[y][i/3] = colour;
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y, x1, y+1);
          for(i = x0; i <= (x1 - 3); i+=3)
          LCD_WRITE_A0(colour);
          LCD_WRITE_A0(ScanBuff[y][x1/3]);
      }
      else                                                             //开始和结束的像素不都是3的倍数
      {
          switch(remainder_x0)
          {
              case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
              case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
              default:break;
          }
          switch(remainder_x1)
          {
              case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
              case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
              default:break;
          }
          for(i = x0 + 3; i < x1; i+=3)
          ScanBuff[y][i/3] = colour;
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y, x1, y+1);
          LCD_WRITE_A0(ScanBuff[y][x0/3]);
          for(i = x0 + 3; i < x1; i+=3)
          LCD_WRITE_A0(colour);
          LCD_WRITE_A0(ScanBuff[y][x1/3]);
      }
    }
}


/***************************************************************************************/

void LCD_L0_DrawVLine  (int x, int y0,  int y1)                   //上层调用的画竖线函数
{
    uint8 remainder_x = x%3;
    uint8 temp, i;
    uint16 y = y0;
    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) 
    {
        switch(remainder_x)
        {
             case 0:while (y <= y1)
                    {
                         temp = 0x1f - ((ScanBuff[y][x/3] & 0xf800) >> 11);
                         ScanBuff[x/3][y] = (ScanBuff[y][x/3] & 0x07ff) | (uint16)(temp << 11);
                         y++;
                    }break;
         
             case 1:while (y <= y1)
                    {
                         temp = 0x1f - ((ScanBuff[y][x/3] & 0x07c0) >> 6);
                         ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xf83f) | (uint16)(temp << 6);
                         y++;
                    }break;
             
             case 2:while (y <= y1)
                    {
                         temp = 0x1f - (ScanBuff[y][x/3] & 0x001f);
                         ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xffe0) | temp;
                         y++;
                    }break;
             default:break;
        }
        LCDCOM = ExtIn;
        LcdSetWrite( x, y0, x+3, y1);
        for(i = y0 ; i < y1; i++)
        {
            LCD_WRITE_A0(ScanBuff[i][x/3]); 
            LCD_WRITE_A0(ScanBuff[i][x/3 + 1]);    
        } 
    }        
           
    else 
    {
        
        uint8 c = LCD_COLORINDEX, colour;
        
        if(c == 0)colour = 0;                                 //索引值转换
        else if((c > 0) && (c <= 5))colour = 0x08;
        else if((c > 5) && (c <= 10))colour = 0x10;
        else if((c > 10) && (c < 15))colour = 0x18;
        else colour = 0x1f;
        
        switch(remainder_x)
        {
             case 0:while (y <= y1)
                    {
                         ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0x07ff) | (uint16)(colour << 11);
                         y++;
                    }break;
         
             case 1:while (y <= y1)
                    {
                         ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xf83f) | (uint16)(colour << 6);
                         y++;
                    }break;
             
             case 2:while (y <= y1)
                    {
                         ScanBuff[y][x/3] = (ScanBuff[y][x/3] & 0xffe0) | colour;
                         y++;
                    }break;
             default:break;
        }
        LCDCOM = ExtIn;
        LcdSetWrite( x, y0, x+3, y1);
        for(i = y0 ; i < y1; i++)
        {
            LCD_WRITE_A0(ScanBuff[i][x/3]); 
            LCD_WRITE_A0(ScanBuff[i][x/3 + 1]);    
        } 
        
    }
}

/***************************************************************************************/

void LCD_L0_FillRect(int x0, int y0, int x1, int y1)                    //上层调用的画矩型函数
{
  int y;
  uint8 remainder_x0 = x0%3;
  uint8 remainder_x1 = x1%3;
  
  if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR)                          //反转模式
  {
      uint16 temp;
      uint8 i, P1, P2;
      if((remainder_x0 == 0) && (remainder_x1 == 2))                    //开始和结束的像素都是3的倍数
      {
           for(y=y0; y<= y1;y++)
           while (x0 <= x1) 
           {
               ScanBuff[y][x0/3] = Xor_Pixel(ScanBuff[y][x0/3]);
               x0+=3;
           }
           
           LCDCOM = ExtIn;
           LcdSetWrite( x0, y0, x1, y1);
           for(; y0<= y1; y0++)
           for(i = x0; i < x1; i+=3)
           LCD_WRITE_A0(ScanBuff[y0][i/3]);
           
      }
      else if((remainder_x0 != 0) && (remainder_x1 == 2))               //开始的像素不是3的倍数
      {    
        for(y=y0; y<= y1;y++)
        {
          temp = ScanBuff[y][x0/3];
          switch(remainder_x0)
          {
               case 1:P1 = 0x1f - ((temp & 0x07c0) >> 6);
                      P2 = 0x1f - (temp & 0x001f);
                      ScanBuff[y][x0/3] = (temp & 0xf800) | (P1 << 6) | P2;
                      break;
               case 2:P2 = 0x1f - (temp & 0x001f);
                      ScanBuff[y][x0/3] = (temp & 0xffc0) | P2;
                      break;
               default:break;
          }
          while ((x0 + 3) <= x1) 
          {
               ScanBuff[y][x0/3 + 1] = Xor_Pixel(ScanBuff[y][x0/3]);
               x0+=3;
          }
        }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(; y0<= y1;y0++)
          for(i = x0; i < x1; i+=3)
          LCD_WRITE_A0(ScanBuff[y0][i/3]);
     }
     else if((remainder_x0 == 0) && (remainder_x1 != 2))               //结束的像素不是3的倍数
     {    
        for(y = y0; y <= y1;y++)
        {
          temp = ScanBuff[y][x1/3];
          switch(remainder_x1)
          {     
               case 0:P1 = 0x1f - ((temp & 0xf800) >> 11);
                      ScanBuff[y][x1/3] = (temp &0x07ff) | (P1 << 11);
                      break;
               case 1:P1 = 0x1f - ((temp & 0xf800) >> 11);
                      P2 = 0x1f - (temp & 0x07c0 >> 6);
                      ScanBuff[y][x1/3] = (temp & 0x001f) | (P1 << 11) | (P2 << 6);
                      break;
               default:break;
          }
          while (x0 <= (x1 - 3)) 
          {
               ScanBuff[y][x0/3] = Xor_Pixel(ScanBuff[y][x0/3 - 1]);
               x0+=3;
          }
        }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(; y0<= y1;y0++)
          for(i = x0; i < x1; i+=3)
          LCD_WRITE_A0(ScanBuff[y0][i/3]);
     }
     else                                                              //开始和结束的像素不都是3的倍数
     {
        for(y = y0; y <= y1;y++)
        {
          temp = ScanBuff[y][x0/3];     
          switch(remainder_x0)
          {
               case 1:P1 = 0x1f - ((temp & 0x07c0) >> 6);
                      P2 = 0x1f - (temp & 0x001f);
                      ScanBuff[y][x0/3] = (temp & 0xf800) | (P1 << 6) | P2;
                      break;
               case 2:P2 = 0x1f - (temp & 0x001f);
                      ScanBuff[y][x0/3] = (temp & 0xffc0) | P2;
                      break;
               default:break;
          }
          temp = ScanBuff[y][x1/3];
          switch(remainder_x1)
          {     
               case 0:P1 = 0x1f - ((temp & 0xf800) >> 11);
                      ScanBuff[y][x1/3] = (temp &0x07ff) | (P1 << 11);
                      break;
               case 1:P1 = 0x1f - ((temp & 0xf800) >> 11);
                      P2 = 0x1f - (temp & 0x07c0 >> 6);
                      ScanBuff[y][x1/3] = (temp & 0x001f) | (P1 << 11) | (P2 << 6);
                      break;
               default:break;
          } 
          while ((x0 + 3) <= (x1 - 3)) 
          {
               ScanBuff[y][x0/3 + 1] = Xor_Pixel(ScanBuff[y][x0/3 - 1]);
               x0+=3;
          }
        }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(; y0<= y1;y0++)
          for(i = x0; i < x1; i+=3)
          LCD_WRITE_A0(ScanBuff[y0][i/3]);
     }
        
  } 
  else                                                                  //正常模式
  {
      uint16 colour;
      uint8 c = LCD_COLORINDEX, i;
      
      if(c == 0)colour = 0x0000;                                        //索引值转换
      else if((c > 0) && (c <= 5))colour = 0x4208;
      else if((c > 5) && (c <= 10))colour = 0x8410;
      else if((c > 10) && (c < 15))colour = 0xc618;
      else colour = 0xffff;
      
      if((remainder_x0 == 0) && (remainder_x1 == 2))                    //开始和结束的像素都是3的倍数
      {
          
          for(y = y0; y <= y1;y++)
          for(i = x0; i < x1; i+=3)
          ScanBuff[y][i/3] = colour;
          
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(; y0 <= y1; y0++)
          {
              for(i = x0; i < x1; i+=3)
              LCD_WRITE_A0(colour);
          }
      }
      else if((remainder_x0 != 0) && (remainder_x1 == 2))               //开始的像素不是3的倍数
      {    
        for(y = y0; y <= y1;y++)
        {
          switch(remainder_x0)
          {
              case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
              case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
              default:break;
          }
          for(i = x0 + 3; i <= x1; i+=3)
          ScanBuff[y][i/3] = colour;
        }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(;y0 <= y1; y0++)
          {
              LCD_WRITE_A0(ScanBuff[y0][x0/3]);
              for(i = x0 + 3; i <= x1; i+=3)
              LCD_WRITE_A0(colour);
          }
      }
      else if((remainder_x0 == 0) && (remainder_x1 != 2))               //结束的像素不是3的倍数
      {  
        for(y = y0; y <= y1;y++)
        {  
          switch(remainder_x1)
          {
              case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
              case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
              default:break;
          }
          for(i = x0; i <= (x1 - 3); i+=3)
          ScanBuff[y][i/3] = colour;
        }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(;y0 <= y1; y0++)
          {
              for(i = x0; i <= (x1 - 3); i+=3)
              LCD_WRITE_A0(colour);
              LCD_WRITE_A0(ScanBuff[y0][x1/3]);
          }
      }
      else                                                             //开始和结束的像素不都是3的倍数
      {
        for(y = y0; y <= y1;y++)
        {
          switch(remainder_x0)
          {
              case 1:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xf800) | (colour & 0x07ff);break;
              case 2:ScanBuff[y][x0/3] = (ScanBuff[y][x0/3] & 0xffc0) | (colour & 0x001f);break;
              default:break;
          }
          switch(remainder_x1)
          {
              case 0:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x07ff) | (colour & 0xf800);break;
              case 1:ScanBuff[y][x1/3] = (ScanBuff[y][x1/3] & 0x001f) | (colour & 0xffc0);break;
              default:break;
          }
          for(i = x0 + 3; i < x1; i+=3)
          ScanBuff[y][i/3] = colour;
        }
          LCDCOM = ExtIn;
          LcdSetWrite( x0, y0, x1, y1);
          for(;y0 <= y1; y0++)
          {
            LCD_WRITE_A0(ScanBuff[y0][x0/3]);
            for(i = x0 + 3; i < x1; i+=3)
            LCD_WRITE_A0(colour);
            LCD_WRITE_A0(ScanBuff[y0][x1/3]);
          }
      }
    }

}


/**********************************************************************************************/

static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) 
{
  PixelIndex  pixels;
  PixelIndex  Index0 = *(pTrans+0);
  PixelIndex  Index1 = *(pTrans+1);
  pixels = *p;
  
  switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) 
  {
      case 0:
            switch (Diff&7) 
            {
                  case 0:goto WriteBit0;
                  case 1:goto WriteBit1;
                  case 2:goto WriteBit2;
                  case 3:goto WriteBit3;
                  case 4:goto WriteBit4;
                  case 5:goto WriteBit5;
                  case 6:goto WriteBit6;
                  case 7:goto WriteBit7;
            }
      break;
      case LCD_DRAWMODE_TRANS:
            switch (Diff&7) 
            {
                  case 0:goto WriteTBit0;
                  case 1:goto WriteTBit1;
                  case 2:goto WriteTBit2;
                  case 3:goto WriteTBit3;
                  case 4:goto WriteTBit4;
                  case 5:goto WriteTBit5;
                  case 6:goto WriteTBit6;
                  case 7:goto WriteTBit7;
            }
      break;
      case LCD_DRAWMODE_XOR:
            switch (Diff&7) 
            {
                  case 0:goto WriteXBit0;
                  case 1:goto WriteXBit1;
                  case 2:goto WriteXBit2;
                  case 3:goto WriteXBit3;
                  case 4:goto WriteXBit4;
                  case 5:goto WriteXBit5;
                  case 6:goto WriteXBit6;
                  case 7:goto WriteXBit7;
            }
      break;
  }
/*
        Write with transparency
*/
  WriteTBit0:
    if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
    if (!--xsize)
      return;
  WriteTBit1:
    if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
    if (!--xsize)
      return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -