📄 lcdmem.c
字号:
/*
*********************************************************************************************************
* uC/GUI
* Universal graphic software for embedded applications
*
* (c) Copyright 2002, Micrium Inc., Weston, FL
* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
*
* 礐/GUI is protected by international copyright laws. Knowledge of the
* source code may not be used to write a similar product. This file may
* only be used in accordance with a license and should not be redistributed
* in any way. We appreciate your understanding and fairness.
*/
#include <string.h> /* for memset */
#include <stddef.h> /* needed for definition of NULL */
#include "LCD_Private.h" /* private modul definitions & config */
#include "GUI_Private.h"
#include "GUIDebug.h"
#include "LCD_0.h" /* Defines for first display */
#include "2440addr.h"
#include "2440lib.h"
#include "2440slib.h"
#include "lcdlib.h"
#include "glib.h"
#include "2440lcd.h"
#include "DEMO256.h"
#ifndef LCD_BUSWIDTH
#define LCD_BUSWIDTH 16
#endif
#define BKCOLOR LCD_BKCOLORINDEX
#define COLOR LCD_COLORINDEX
//static U32 frameBuffer[LCD_YSIZE_PHYS][LCD_XSIZE_PHYS];
/*********************************************
*
* Draw Bitmap 1 BPP
*
**********************************************
*/
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;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
do {
LCD_L0_SetPixelIndex(x++, y, (*p & (0x80 >> Diff)) ? Index1 : Index0);
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
case LCD_DRAWMODE_TRANS:
do {
if (*p & (0x80 >> Diff))
LCD_L0_SetPixelIndex(x, y, Index1);
x++;
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
case LCD_DRAWMODE_XOR:;
do {
if (*p & (0x80 >> Diff)) {
int Pixel = LCD_L0_GetPixelIndex(x, y);
LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - 1 - Pixel);
}
x++;
if (++Diff == 8) {
Diff = 0;
p++;
}
} while (--xsize);
break;
}
}
/*********************************************
*
* Draw Bitmap 2 BPP
*
**********************************************
*/
#if (LCD_MAX_LOG_COLORS > 2)
static void _DrawBitLine2BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Pixels = *p;
int CurrentPixel = Diff;
x += Diff;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
do {
int Shift = (3 - CurrentPixel) << 1;
int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x++, y, PixelIndex);
if (++CurrentPixel == 4) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
break;
case LCD_DRAWMODE_TRANS:
do {
int Shift = (3 - CurrentPixel) << 1;
int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
if (Index) {
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x, y, PixelIndex);
}
x++;
if (++CurrentPixel == 4) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
break;
}
}
#endif
/*********************************************
*
* Draw Bitmap 4 BPP
*
**********************************************
*/
#if (LCD_MAX_LOG_COLORS > 4)
static void _DrawBitLine4BPP(int x, int y, U8 const * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Pixels = *p;
int CurrentPixel = Diff;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x++, y, PixelIndex);
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
break;
case LCD_DRAWMODE_TRANS:
do {
int Shift = (1 - CurrentPixel) << 2;
int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
if (Index) {
LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
LCD_L0_SetPixelIndex(x, y, PixelIndex);
}
x++;
if (++CurrentPixel == 2) {
CurrentPixel = 0;
Pixels = *(++p);
}
} while (--xsize);
break;
}
}
#endif
/*********************************************
*
* Draw Bitmap 8 BPP
*
**********************************************
*/
#if (LCD_MAX_LOG_COLORS > 16)
static void _DrawBitLine8BPP(int x, int y, U8 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX Pixel;
switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
case 0:
if (pTrans) {
for (; xsize > 0; xsize--, x++, p++) {
Pixel = *p;
LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
}
} else {
for (; xsize > 0; xsize--, x++, p++) {
LCD_L0_SetPixelIndex(x, y, *p);
}
}
break;
case LCD_DRAWMODE_TRANS:
if (pTrans) {
for (; xsize > 0; xsize--, x++, p++) {
Pixel = *p;
if (Pixel) {
LCD_L0_SetPixelIndex(x, y, *(pTrans + Pixel));
}
}
} else {
for (; xsize > 0; xsize--, x++, p++) {
Pixel = *p;
if (Pixel) {
LCD_L0_SetPixelIndex(x, y, Pixel);
}
}
}
break;
}
}
#endif
/*********************************************
*
* Draw Bitmap 16 BPP
*
**********************************************
*/
#if (LCD_BITSPERPIXEL > 8)
static void DrawBitLine16BPP(int x, int y, U16 const * p, int xsize, const LCD_PIXELINDEX * pTrans) {
LCD_PIXELINDEX pixel;
if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) {
if (pTrans) {
for (; xsize > 0; xsize--, x++, p++) {
pixel = *p;
LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));
}
} else {
for (;xsize > 0; xsize--, x++, p++) {
LCD_L0_SetPixelIndex(x, y, *p);
}
}
} else {
if (pTrans) {
for (; xsize > 0; xsize--, x++, p++) {
pixel = *p;
if (pixel) {
LCD_L0_SetPixelIndex(x, y, *(pTrans + pixel));
}
}
} else {
for (; xsize > 0; xsize--, x++, p++) {
pixel = *p;
if (pixel) {
LCD_L0_SetPixelIndex(x, y, pixel);
}
}
}
}
}
#endif
/*********************************************************************
*
* Exported functions
*
**********************************************************************
*/
/*********************************************
*
* LCD_L0_SetPixelIndex
*
**********************************************
Purpose:
Sets the index of the given pixel. The upper layers of emWin
calling this routine make sure that the coordinates are in range, so
that no check on the parameters needs to be performed.
*/
void LCD_L0_SetPixelIndex(int x, int y, int PixelIndex)
{
U32 tempC1,tempC2;
tempC1 = (PixelIndex & 0xff0000)<<3;
tempC2 = (PixelIndex & 0x00ff00)<<2;
frameBuffer16BitTft640480[y][x>>1] = tempC1 | tempC2 | (PixelIndex << 3);
}
/*********************************************
*
* LCD_L0_GetPixelIndex
*
**********************************************
Purpose:
Returns the index of the given pixel. The upper layers of emWin
calling this routine make sure that the coordinates are in range, so
that no check on the parameters needs to be performed.
*/
unsigned int LCD_L0_GetPixelIndex(int x, int y)
{
unsigned int tempC,tempC1,tempC2;
tempC1 = (frameBuffer16BitTft640480[y][x>>1] & 0xff0000)>>3;
tempC2 = (frameBuffer16BitTft640480[y][x>>1] & 0x00ff00)>>2;
tempC = tempC1 | tempC2 | ((frameBuffer16BitTft640480[y][x>>1] & 0x0000ff)>>3);
return( tempC );
}
/*********************************************
*
* LCD_L0_XorPixel
*
**********************************************
*/
void LCD_L0_XorPixel(int x, int y) {
LCD_PIXELINDEX PixelIndex = LCD_L0_GetPixelIndex(x, y);
LCD_L0_SetPixelIndex(x, y, LCD_NUM_COLORS - PixelIndex - 1);
}
/*********************************************
*
* LCD_L0_DrawHLine
*
**********************************************
*/
void LCD_L0_DrawHLine (int x0, int y, int x1) {
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
for (; x0 <= x1; x0++) {
LCD_L0_XorPixel(x0, y);
}
} else {
for (; x0 <= x1; x0++) {
LCD_L0_SetPixelIndex(x0, y, LCD_COLORINDEX);
}
}
}
/*********************************************
*
* LCD_L0_DrawVLine
*
**********************************************
*/
void LCD_L0_DrawVLine (int x, int y0, int y1) {
if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
for (; y0 <= y1; y0++) {
LCD_L0_XorPixel(x, y0);
}
} else {
for (; y0 <= y1; y0++) {
LCD_L0_SetPixelIndex(x, y0, LCD_COLORINDEX);
}
}
}
/*********************************************
*
* LCD_L0_FillRect
*
**********************************************
*/
void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
for (; y0 <= y1; y0++) {
LCD_L0_DrawHLine(x0, y0, x1);
}
}
/*********************************************
*
* LCD_L0_DrawBitmap
*
**********************************************
*/
void LCD_L0_DrawBitmap(int x0, int y0,
int xsize, int ysize,
int BitsPerPixel,
int BytesPerLine,
const U8* pData, int Diff,
const LCD_PIXELINDEX* pTrans)
{
int i;
/* Use _DrawBitLineXBPP */
for (i=0; i<ysize; i++) {
switch (BitsPerPixel) {
case 1:
_DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans);
break;
case 2:
_DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans);
break;
case 4:
_DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans);
break;
case 8:
_DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans);
break;
case 16:
DrawBitLine16BPP(x0, i + y0, (const U16 *)pData, xsize, pTrans);
break;
}
pData += BytesPerLine;
}
}
/*********************************************
*
* LCD_L0_SetOrg
*
**********************************************
*/
void LCD_L0_SetOrg(int x, int y) {
GUI_USE_PARA(x);
GUI_USE_PARA(y);
}
/*********************************************
*
* LCD_On / LCD_Off
*
**********************************************
*/
void LCD_On (void)
{
}
void LCD_Off (void)
{
}
/*********************************************
*
* LCD_L0_Init
*
**********************************************
Purpose:
Initialises the LCD-controller.
*/
int LCD_L0_Init(void)
{
U16 mode = MODE_TFT_16BIT_640480;
Lcd_Port_Init();
Lcd_Init(mode);
Glib_Init(mode);
Select_Tcon();
Lcd_PowerEnable(0, 1);
Lcd_EnvidOnOff(1);
Glib_ClearScr(0, mode);
return 0;
}
void LCD_L0_ReInit(void) {
LCD_INIT_CONTROLLER(); /* macro defined in config */
}
/*********************************************
*
* LCD_L0_SetLUTEntry
*
**********************************************
*/
void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
GUI_USE_PARA(Pos);
GUI_USE_PARA(Color);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -