📄 lcdslin.c
字号:
/* 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 + -