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

📄 lcd13xx.c

📁 lpc2478+ucosII+ucgui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
    col = Data;
  #endif
#endif
  return col;
}

static void XorPixel   (int x, int y) {
  LCD_PIXELINDEX Index = GetPixelIndex(x,y);
  _SetPixel(x,y,LCD_NUM_COLORS-1-Index);
}



/*
        *********************************************************
        *                                                       *
        *       LCD_L0_XorPixel                                 *
        *                                                       *
        *********************************************************

Purpose:  This routine is called by emWin. It writes 1 pixel into the
          display.

*/

void LCD_L0_XorPixel(int x, int y) {
  XORPIXEL(x, y);
}

/*
        *********************************************************
        *                                                       *
        *       LCD_L0_SetPixelIndex                            *
        *                                                       *
        *********************************************************

Purpose:  This routine is called by emWin. It writes 1 pixel into the
          display.

*/
void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
  SETPIXEL(x, y, ColorIndex);
}


/*
        *********************************************************
        *                                                       *
        *          LCD_L0_DrawHLine optimized                      *
        *                                                       *
        *          16 bit bus, Using BITBLT                     *
        *                                                       *
        *********************************************************
*/

#if (LCD_USE_BITBLT)           \
    && (!LCD_SWAP_XY)          \
    && (LCD_BUSWIDTH==16)      \
    && (!defined (LCD_LUT_COM))   \
    && (!defined (LCD_LUT_SEG))   \
    && ((LCD_CONTROLLER == 1356)||(LCD_CONTROLLER == 13806))

void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  #if LCD_MIRROR_X
    #define X0 (LCD_XSIZE-1-(x1))
    #define X1 (LCD_XSIZE-1-(x0))
  #else
    #define X0 x0
    #define X1 x1
  #endif
  #if LCD_MIRROR_Y
    #define Y0 (LCD_YSIZE-1-(y))
  #else
    #define Y0 y
  #endif
  if (x0>x1) return;
  LCD_FillRectBB(X0,Y0,X1,Y0);
  #undef X0
  #undef X1
  #undef Y0
}


/*
        *********************************************************
        *                                                       *
        *          LCD_L0_DrawHLine optimized                      *
        *                                                       *
        *          16 bit bus, 16 bpp                           *
        *                                                       *
        *********************************************************
*/

#elif (LCD_OPTIMIZE)             \
      && (!LCD_SWAP_XY)          \
      && (!LCD_MIRROR_Y)         \
      && (LCD_BUSWIDTH==16)      \
      && (!defined (LCD_LUT_COM))   \
      && (!defined (LCD_LUT_SEG))   \
      && ((LCD_BITSPERPIXEL == 16) || (LCD_BITSPERPIXEL == 15))

void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  #if LCD_MIRROR_X
    #define X0 (LCD_XSIZE-1-(x1))
  #else
    #define X0 x0
  #endif
  if (x0>x1) return;
  {
    register tOff Off = XY2OFF(X0,y);
    register int Rem = x1-x0+1;
    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
      for (; Rem--; Off++) {
        U16 Data;
        READ_MEM(Off, Data);
        Data = LCD_NUM_COLORS-1-Data;
        WRITE_MEM(Off,Data);
      }
    } else {
      for (; Rem >= 8; Off += 8) {
        WRITE_MEM(Off,COLOR);
        WRITE_MEM(Off+1,COLOR);
        WRITE_MEM(Off+2,COLOR);
        WRITE_MEM(Off+3,COLOR);
        WRITE_MEM(Off+4,COLOR);
        WRITE_MEM(Off+5,COLOR);
        WRITE_MEM(Off+6,COLOR);
        WRITE_MEM(Off+7,COLOR);
        Rem -=8;
      }
      for (; Rem--; Off++) {
        WRITE_MEM(Off,COLOR);
      }
    }
  }
  #undef X0
}


/*
        *********************************************************
        *                                                       *
        *          LCD_L0_DrawHLine optimized                   *
        *                                                       *
        *          16 bit bus, 8 bpp                            *
        *                                                       *
        *********************************************************
*/

#elif (LCD_OPTIMIZE)             \
      && (!LCD_SWAP_XY)          \
      && (LCD_BUSWIDTH==16)      \
      && (!defined (LCD_LUT_SEG))   \
      && (LCD_BITSPERPIXEL == 8)
      
void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  #if LCD_MIRROR_X
  {
    int t = (LCD_XSIZE-1-(x0));
    x0 = (LCD_XSIZE-1-(x1));
    x1 = t;
  }
  #endif
  #if LCD_MIRROR_Y
    y = (LCD_YSIZE-1-(y));
  #endif
  {
    register tOff Off = XY2OFF(x0,y);
    /* register */ U16 Data;
/* XOR mode */
    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
      if (x0&1) {
        READ_MEM(Off, Data);
        Data ^= ((unsigned int)255);
        WRITE_MEM(Off,Data);
        x0++;
        Off++;
      }
      for (; x0<x1; x0+=2, Off++) {
        READ_MEM(Off,Data);
        Data ^= 0xffff;
        WRITE_MEM(Off,Data);
      }      
      if ((x1&1)==0) {
        READ_MEM(Off,Data);
        Data ^=  (U16)255<<8;
        WRITE_MEM(Off,Data);
      }
/* WRITE mode */
    } else {
      if (x0&1) {
        READ_MEM(Off,Data);
        Data = (Data&((U16)0xff<<8)) | (COLOR);
        WRITE_MEM(Off,Data);
        x0++;
        Off++;
      }
      Data = COLOR|((U16)COLOR<<8);
      /* Optimization for longer lines ... */
      #ifdef LCD_WRITE_MEM32
      if ((x0<x1-4) && (x0&2)) { /* Write 16 bits if necessary */
        WRITE_MEM(Off,Data);
        x0+=2;
        Off++;
      }
      /* write 4 pixels at a time, loop unrolled  */
      { register U32 Data32 = Data| (Data<<16);
        for (;x0<x1-32-2; x0+=32, Off+=16) {
          LCD_WRITE_MEM32(Off+0,Data32);
          LCD_WRITE_MEM32(Off+2,Data32);
          LCD_WRITE_MEM32(Off+4,Data32);
          LCD_WRITE_MEM32(Off+6,Data32);
          LCD_WRITE_MEM32(Off+8,Data32);
          LCD_WRITE_MEM32(Off+10,Data32);
          LCD_WRITE_MEM32(Off+12,Data32);
          LCD_WRITE_MEM32(Off+14,Data32);
        }
      }
      { register U32 Data32 = Data| (Data<<16);
        for (;x0<x1-16-2; x0+=16, Off+=8) {
          LCD_WRITE_MEM32(Off+0,Data32);
          LCD_WRITE_MEM32(Off+2,Data32);
          LCD_WRITE_MEM32(Off+4,Data32);
          LCD_WRITE_MEM32(Off+6,Data32);
        }
      }
      { register U32 Data32 = Data| (Data<<16);
        for (;x0<x1-8-2; x0+=8, Off+=4) {
          LCD_WRITE_MEM32(Off+0,Data32);
          LCD_WRITE_MEM32(Off+2,Data32);
        }
      }
      #else
      for (;x0<x1-10; x0+=12, Off+=6) {
        /* swapping can be ignored, so use faster LCD_WRITE_MEM */
        LCD_WRITE_MEM(Off,Data); 
        LCD_WRITE_MEM(Off+1,Data);
        LCD_WRITE_MEM(Off+2,Data);
        LCD_WRITE_MEM(Off+3,Data);
        LCD_WRITE_MEM(Off+4,Data);
        LCD_WRITE_MEM(Off+5,Data);
      }
      #endif
      /* write the last pixels 2 at a time */
      for (; x0<x1; x0+=2, Off++) {
        /* swapping can be ignored, so use faster LCD_WRITE_MEM */
        LCD_WRITE_MEM(Off,Data);
      }      
      if ((x1&1)==0) {
        READ_MEM(Off, Data);
        Data = (Data&((unsigned int)0xff)) | ((U16)COLOR<<8);
        WRITE_MEM(Off,Data);
      }
    }
  }
}



/*
        *********************************************************
        *                                                       *
        *          LCD_L0_DrawHLine optimized                   *
        *                                                       *
        *          16 bit bus, 4 bpp                            *
        *                                                       *
        *********************************************************
*/

#elif (LCD_OPTIMIZE)             \
      && (!LCD_SWAP_XY)          \
      && (LCD_BUSWIDTH==16)      \
      && (!defined (LCD_LUT_SEG))   \
      && (LCD_BITSPERPIXEL == 4)

void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  #if LCD_MIRROR_X
    #define X0 (LCD_XSIZE-1-(x1))
  #else
    #define X0 x0
  #endif
  #if LCD_MIRROR_Y
    #define Y (LCD_YSIZE - 1 - y)
  #else
    #define Y y
  #endif
  if (x0>x1) return;
  {
    register tOff Off;
    register int Rem;
    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
      for (; (x0&3    )&&(x0<=x1); x0++) XORPIXEL(x0, y);
      for (; ((x1+1)&3)&&(x0<=x1); x1--) XORPIXEL(x1, y);
      Off = XY2OFF(X0,Y);
      Rem = (x1-x0+4)>>2;
      for (; Rem--; Off++) {
        U16 c;
        READ_MEM(Off, c);
        c ^= 0xffff; 
        WRITE_MEM(Off,c);
      }
    } else {
      U16 col = COLOR+(COLOR<<4)+(COLOR<<8)+(COLOR<<12);
      for (; (x0&3    )&&(x0<=x1); x0++)
        SETPIXEL(x0, y, COLOR);
      for (; ((x1+1)&3)&&(x0<=x1); x1--)
        SETPIXEL(x1, y, COLOR);
      Off = XY2OFF(X0,Y);
      Rem = (x1-x0+4)>>2;
      for (; Rem--; Off++) {
        /* swapping can be ignored, so use faster LCD_WRITE_MEM */
        LCD_WRITE_MEM(Off,col);
      }
    }
  }
  #undef X0
}

/*
        *********************************************************
        *                                                       *
        *          LCD_L0_DrawHLine optimized                   *
        *                                                       *
        *          16 bit bus, 1 bpp                            *
        *                                                       *
        *********************************************************
*/

#elif (LCD_OPTIMIZE)             \
      && (!LCD_SWAP_XY)          \
      && (LCD_BUSWIDTH==16)      \
      && (!defined (LCD_LUT_SEG))   \
      && (LCD_BITSPERPIXEL == 1)

void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  #if LCD_MIRROR_X
  {
    int temp = x0;
    x0 = (LCD_XSIZE-1-(x1));
    x1 = (LCD_XSIZE-1-(temp));
  }
  #endif
  #if LCD_MIRROR_Y
  {
    y = (LCD_YSIZE - 1 - y);
  }
  #endif
  {
    register tOff Off = XY2OFF(x0,y);
    int iWord = x0>>4;
    int Word1 = x1>>4;
    U16 Mask   =  0xffff   >> (x0&15);
    U16 EndMask = 0xffff8000 >> (x1&15);
    U16 Data;
    if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
      for (; iWord<Word1; iWord++) {
        READ_MEM(Off,Data);
        Data ^= Mask; 
        WRITE_MEM(Off++,Data);

⌨️ 快捷键说明

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