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

📄 lcdslin.c

📁 uc-gui.rar
💻 C
📖 第 1 页 / 共 3 页
字号:
/* Remap ...A0, ...A1 -> ...CMD, ...DATA */#define LCD_READCMD0    LCD_READ_A1#define LCD_READDATA0   LCD_READ_A0#define LCD_WRITECMD0   LCD_WRITE_A1#define LCD_WRITEDATA0  LCD_WRITE_A0#ifndef LCD_WAIT  #define LCD_WAIT() while ((LCD_READ_A1()&3)!=3) /* Do not use LCD_READCMD0 to fix NC30-problem (JE) */#endif#define LCD_WRITECMD(cmd)      { LCD_WAIT(); LCD_WRITECMD0(cmd);  }#define LCD_WRITEDATA(data)    { LCD_WAIT(); LCD_WRITEDATA0(data);}/* Access Macros */#define LCD_READDATA()        \  LCD_WRITECMD(0xC5);         \  return LCD_DATA0;#define LCD_SETADR(Adr)       \  LCD_WRITEDATA((U8)Adr);     \  LCD_WRITEDATA((U8)(Adr>>8));\  LCD_WRITECMD(0x24);         \  LCD_Adr=Adr;#define LCD_WRITE1(Byte)      \  LCD_WRITEDATA(Byte);        \  LCD_WRITECMD(0xC0);         \  LCD_Adr++;/* LCD_L0_ReInit */#define LCD_RAMSIZE (0x2000)#define LCD_GSTART  (0x0)#define LCD_XSIZEB  ((LCD_XSIZE_PHYS+7)>>3)#define LCD_TSTART  (LCD_RAMSIZE-(LCD_XSIZEB)-(LCD_YSIZE_PHYS>>3))void LCD_L0_ReInit(void) {  LCD_WRITECMD(0x81);           /* SetModeXor */  LCD_WRITEDATA((U8)LCD_TSTART);/* SetTextAdr */  LCD_WRITEDATA((U8)(LCD_TSTART>>8));  LCD_WRITECMD(0x40);  LCD_WRITEDATA(1);             /* SetTextArea */  LCD_WRITEDATA(1>>8);  LCD_WRITECMD(0x41);  LCD_WRITECMD(0x9C);           /* SetTextGraph */  LCD_WRITEDATA(LCD_GSTART);    /* SetGraphAdr */  LCD_WRITEDATA(LCD_GSTART>>8);  LCD_WRITECMD(0x42);  LCD_WRITEDATA(LCD_XSIZEB);    /* SetGraphArea */  LCD_WRITEDATA(LCD_XSIZEB>>8);  LCD_WRITECMD(0x43);}/* LCD_FirstInit */void LCD_FirstInit(void) {  int i;  LCD_INIT_CONTROLLER();  LCD_SETADR(0);  for (i=0; i<100; i++) {    LCD_WRITE1(0xff);  }  LCD_SETADR(0);  for (i=0;i<LCD_RAMSIZE;i++) {    LCD_WRITE1(0x0);  }}#endif /* T6963 *//*        *********************************************************        *                                                       *        *       Write 1 byte and manage cache                   *        *                                                       *        **********************************************************/static void LCD_Write(int Adr, U8 Byte) {  if (Cache[Adr]!=Byte) {    Cache[Adr]=Byte;    if (LCD_Adr!=Adr) {      LCD_SETADR(Adr);    }    LCD_WRITE1(Byte);  }}#define LCD_WRITE(Adr,Byte) LCD_Write(Adr,Byte);/*        *********************************************************        *                                                       *        *       Internal set pixel routines                     *        *                                                       *        **********************************************************/static void _SetPixel(int x, int y, LCD_PIXELINDEX c) {  U8 Mask=1<<(7-(x&7));  int Adr=XY2OFF(x,y);  U8 CacheByte=Cache[Adr];  if (c)    CacheByte|= Mask;  else    CacheByte&=~Mask;  LCD_WRITE(Adr,CacheByte)}static PIXELCOLOR _GetPixel(int x, int y) {  int Adr=XY2OFF(x,y);  U8 Mask=1<<(7-(x&7));  return (Cache[Adr]&Mask) ? 1 : 0;}static void XorPixel   (int x, int y) {  LCD_PIXELINDEX Index = _GetPixel(x,y);  _SetPixel(x,y, LCD_NUM_COLORS-1-Index);}/*        *********************************************************        *                                                       *        *       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_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_DrawHLine optimized                   *        *                                                       *        **********************************************************/#if (LCD_OPTIMIZE)               \      && (!LCD_SWAP_XY)          \      && (!LCD_MIRROR_X)         \      && (!LCD_MIRROR_Y)         \      && (!LCD_SUPPORT_COMTRANS) \      && (!LCD_SUPPORT_SEGTRANS)void LCD_L0_DrawHLine  (int x0, int y,  int x1) {  register int Off = XY2OFF(x0,y);  int iByte = x0>>3;  int Byte1 = x1>>3;  U8 Mask =    0xff   >> (x0&7);  U8 EndMask = 0xff80 >> (x1&7);  U8 Data;  if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {    for (; iByte<Byte1; iByte++) {      Data = Cache[Off];      Data ^= Mask;       LCD_WRITE(Off++,Data);      Mask = 0xff;    }    Mask &= EndMask;    Data = Cache[Off];    Data ^= Mask;     LCD_WRITE(Off++,Data);  } else {                                  /* Clear pixels in line */    int NumBytes = Byte1-iByte;    if (COLOR==0) {      if (NumBytes) {        Data = Cache[Off] & (~Mask);        LCD_WRITE(Off++,Data);        NumBytes--;      /* Fill bytes in 2 loops for speed reasons ... */        for (; NumBytes>=4; NumBytes-=4) {          LCD_WRITE(Off++,0);          LCD_WRITE(Off++,0);          LCD_WRITE(Off++,0);          LCD_WRITE(Off++,0);        }        for (; NumBytes; NumBytes--) {          LCD_WRITE(Off++,0);        }        Mask = 0xff;      }      Mask &= EndMask;      Data = Cache[Off];      Data &= ~Mask;       LCD_WRITE(Off++,Data);    } else {                                  /* Set pixels in line */      if (NumBytes) {        Data = Cache[Off] | Mask;         LCD_WRITE(Off++,Data);        NumBytes--;      /* Fill bytes in 2 loops for speed reasons ... */        for (; NumBytes>=4; NumBytes-=4) {          LCD_WRITE(Off++,0xff);          LCD_WRITE(Off++,0xff);          LCD_WRITE(Off++,0xff);          LCD_WRITE(Off++,0xff);        }        for (; NumBytes; NumBytes--) {          LCD_WRITE(Off++,0xff);        }        Mask = 0xff;      }      Mask &= EndMask;      Data = Cache[Off] | Mask;       LCD_WRITE(Off++,Data);    }  }}#else/*        *********************************************************        *                                                       *        *          LCD_L0_DrawHLine unoptimized                 *        *                                                       *        **********************************************************/void LCD_L0_DrawHLine  (int x0, int y,  int x1) {  if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {    while (x0 <= x1) {      XORPIXEL(x0, y);      x0++;    }  } else {    while (x0 <= x1) {      SETPIXEL(x0, y, COLOR);      x0++;    }  }}#endif/*        *********************************************************        *                                                       *        *          LCD_L0_DrawVLine                             *        *                                                       *        **********************************************************/void LCD_L0_DrawVLine  (int x, int y0,  int y1) {  if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {    while (y0 <= y1) {      XORPIXEL(x, y0);      y0++;    }  } else {    while (y0 <= y1) {      SETPIXEL(x, y0, COLOR);      y0++;    }  }}/*        *********************************************************        *                                                       *        *          LCD_FillRect, unoptimized                    *        *                                                       *        **********************************************************/void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {  for (; y0 <= y1; y0++) {    LCD_L0_DrawHLine(x0,y0, x1);  }}/*        *********************************************************        *                                                       *        *    Support for dynamic inversion of entire LCD        *        *                                                       *        **********************************************************/#if LCD_REVERSEMODE_SUPPORTvoid LCD_SetNormalDispMode    (void) {}void LCD_SetReverseDispMode   (void) {}#endif/*        *********************************************************        *                                                       *        *          Draw Bitmap 1 BPP, optimized                 *        *                                                       *        **********************************************************/#if (LCD_OPTIMIZE)               \      && (!LCD_SWAP_XY)          \      && (!LCD_MIRROR_X)         \      && (!LCD_MIRROR_Y)         \      && (!LCD_SUPPORT_COMTRANS) \      && (!LCD_SUPPORT_SEGTRANS)static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {  LCD_PIXELINDEX Index0 = *(pTrans+0);  LCD_PIXELINDEX Index1 = *(pTrans+1);  x+=Diff;  if ((Index0==Index1) & (!(GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)))) {    LCD_PIXELINDEX ColorIndexOld= COLOR;    COLOR = Index0;    LCD_L0_DrawHLine(x,y,x+xsize-1);    COLOR = ColorIndexOld;    return;  }  {    int Adr=XY2OFF(x,y);    int x1 = x+xsize-1;    U8 Mask    = 0xff   >> (x &7);    U8 EndMask = 0xff80 >> (x1&7);    U8 CacheByte;    U16 PixelData;    int NumBytes = (x1>>3) - (x>>3);    if (NumBytes) {      CacheByte=Cache[Adr];      PixelData   = (*(p+1) | ((*p)<<8));      PixelData >>= (8+(x&7)-(Diff&7));      switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {      case 0:        if (!COLOR)          PixelData ^= 255;        CacheByte = (CacheByte&~Mask)|(PixelData&Mask);        break;      case LCD_DRAWMODE_TRANS:        if (COLOR)          CacheByte |= (PixelData&Mask);        else          CacheByte &= ~(PixelData&Mask);        break;      case LCD_DRAWMODE_XOR:        CacheByte ^= (PixelData&Mask);        break;      }      LCD_WRITE(Adr++,CacheByte);      {         int DiffOld = Diff;        Diff+= 8-(x&7);         if ((DiffOld&~7) != (Diff&~7))          p++;      }      x=0;      NumBytes--;      for (; NumBytes; NumBytes--) {        PixelData   = (*(p+1) | ((*p)<<8));        PixelData >>= (8-(Diff&7));        p++;        switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {        case 0:          if (!COLOR)            PixelData ^= 255;          CacheByte=PixelData&255;          break;        case LCD_DRAWMODE_TRANS:          CacheByte=Cache[Adr];          if (COLOR)            CacheByte |= PixelData;          else            CacheByte &= ~PixelData;          break;        case LCD_DRAWMODE_XOR:          CacheByte=Cache[Adr] ^ PixelData;          break;        }        LCD_WRITE(Adr++,CacheByte);      }      Mask = 0xff;    }    PixelData   = (*(p+1) | ((*p)<<8));    PixelData >>= (8+(x&7)-(Diff&7));    Mask &= EndMask;    CacheByte = Cache[Adr];    switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {    case 0:      if (!COLOR)        PixelData ^= 255;      CacheByte = (CacheByte&~Mask)|(PixelData&Mask);      break;    case LCD_DRAWMODE_TRANS:      if (COLOR)        CacheByte |= (PixelData&Mask);      else        CacheByte &= ~(PixelData&Mask);      break;    case LCD_DRAWMODE_XOR:      CacheByte ^= (PixelData&Mask);      break;    }    LCD_WRITE(Adr++,CacheByte);  }}#else/*        *********************************************************        *                                                       *        *          Draw Bitmap 1 BPP, no optimization           *        *                                                       *        **********************************************************/static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {  PIXELCOLOR pixels;  PIXELCOLOR Index0 = *(pTrans+0);  PIXELCOLOR Index1 = *(pTrans+1);/*        Jump to right entry point*/  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;    }  }/*

⌨️ 快捷键说明

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