📄 c_display.c
字号:
//
// Programmer
//
// Date init 14.12.2004
//
// Reviser $Author:: Dktochpe $
//
// Revision date $Date:: 17-02-06 8:45 $
//
// Filename $Workfile:: c_display.c $
//
// Version $Revision:: 36 $
//
// Archive $Archive:: /LMS2006/Sys01/Main/Firmware/Source/c_display. $
//
// Platform C
//
#include <string.h>
#include "stdconst.h"
#include "modules.h"
#include "c_display.iom"
#include "c_display.h"
#include "d_display.h"
static IOMAPDISPLAY IOMapDisplay;
static VARSDISPLAY VarsDisplay;
const HEADER cDisplay =
{
0x000A0001L,
"Display",
cDisplayInit,
cDisplayCtrl,
cDisplayExit,
(void *)&IOMapDisplay,
(void *)&VarsDisplay,
(UWORD)sizeof(IOMapDisplay),
(UWORD)sizeof(VarsDisplay),
0x0000 //Code size - not used so far
};
const SCREEN_CORDINATE SCREEN_CORDINATES[SCREENS] =
{
{ 0, 0,DISPLAY_WIDTH,DISPLAY_HEIGHT }, // Background
{ 0, 8,DISPLAY_WIDTH,DISPLAY_HEIGHT - 8 }, // Large
{ 0, 8,DISPLAY_WIDTH,24 } // Small
};
const SCREEN_CORDINATE SELECT_FRAME_CORDINATES =
{
38,41,24,24
};
const SCREEN_CORDINATE MENUICON_CORDINATES[MENUICONS] =
{
{ DISPLAY_MENUICONS_X_OFFS,DISPLAY_MENUICONS_Y,24,24 }, // Left
{ DISPLAY_MENUICONS_X_OFFS + DISPLAY_MENUICONS_X_DIFF,DISPLAY_MENUICONS_Y,24,24 }, // Center
{ DISPLAY_MENUICONS_X_OFFS + DISPLAY_MENUICONS_X_DIFF * 2,DISPLAY_MENUICONS_Y,24,24 },// Right
};
const SCREEN_CORDINATE STATUSICON_CORDINATES[STATUSICONS] =
{
{ 0, 0,12, 8 }, // Bluetooth
{ 12, 0,12, 8 }, // Usb
{ 76, 0,12, 8 }, // Vm
{ 88, 0,12, 8 } // Battery
};
const SCREEN_CORDINATE STEPICON_CORDINATES[STEPICONS] =
{
{ 11,16,11,16 }, // Step 1
{ 28,16,11,16 }, // Step 2
{ 45,16,11,16 }, // Step 3
{ 62,16,11,16 }, // Step 4
{ 79,16,11,16 } // Step 5
};
void cDisplaySetPixel(UBYTE X,UBYTE Y)
{
if ((X < DISPLAY_WIDTH) && (Y < DISPLAY_HEIGHT))
{
IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] |= (1 << (Y % 8));
}
}
void cDisplayClrPixel(UBYTE X,UBYTE Y)
{
if ((X < DISPLAY_WIDTH) && (Y < DISPLAY_HEIGHT))
{
IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] &= ~(1 << (Y % 8));
}
}
void cDisplayChar(FONT *pFont,UBYTE On,UBYTE X,UBYTE Y,UBYTE Char)
{
UBYTE *pSource;
UBYTE FontWidth;
UBYTE FontHeight;
UBYTE Items;
UBYTE Item;
UBYTE TmpY;
Items = pFont->ItemsX * pFont->ItemsY;
Item = Char - ' ';
if (Item < Items)
{
FontWidth = pFont->ItemPixelsX;
pSource = (UBYTE*)&pFont->Data[Item * FontWidth];
while (FontWidth--)
{
TmpY = 0;
FontHeight = pFont->ItemPixelsY;
while (FontHeight--)
{
if (On == TRUE)
{
if (((*pSource) & (1 << TmpY)))
{
cDisplaySetPixel(X,Y + TmpY);
}
else
{
cDisplayClrPixel(X,Y + TmpY);
}
}
else
{
if (((*pSource) & (1 << TmpY)))
{
cDisplayClrPixel(X,Y + TmpY);
}
else
{
cDisplaySetPixel(X,Y + TmpY);
}
}
TmpY++;
}
X++;
pSource++;
}
}
}
void cDisplayString(FONT *pFont,UBYTE X,UBYTE Y,UBYTE *pString)
{
UBYTE *pSource;
UBYTE *pDestination;
UBYTE FontWidth;
UBYTE Line;
UBYTE Items;
UBYTE Item;
Line = (Y & 0xF8) / 8;
Items = pFont->ItemsX * pFont->ItemsY;
pDestination = (UBYTE*)&IOMapDisplay.Display[Line * DISPLAY_WIDTH + X];
while (*pString)
{
Item = *pString - ' ';
if (Item < Items)
{
FontWidth = pFont->ItemPixelsX;
pSource = (UBYTE*)&pFont->Data[Item * FontWidth];
while (FontWidth--)
{
*pDestination = *pSource;
pDestination++;
pSource++;
}
}
pString++;
}
}
void cDisplayUpdateScreen(SCREEN_CORDINATE *pCord,BMPMAP *pBitmap)
{
UBYTE *pSource;
UBYTE *pDestination;
UBYTE Line;
UBYTE Lines;
if (pBitmap)
{
if ((((pBitmap->StartY + pCord->StartY) & 0x07) == 0) && ((pBitmap->PixelsY & 0x07) == 0))
{
pSource = pBitmap->Data;
Line = (pBitmap->StartY + pCord->StartY) / 8;
Lines = Line + pBitmap->PixelsY / 8;
while (Line < Lines)
{
pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + pBitmap->StartX + pCord->StartX];
memcpy(pDestination,pSource,(size_t)pBitmap->PixelsX);
pSource += pBitmap->PixelsX;
Line++;
}
}
}
}
void cDisplayCenterString(FONT *pFont,UBYTE *pString,UBYTE Line)
{
UWORD Chars;
UBYTE Column;
if (pString)
{
Chars = 0;
while (pString[Chars])
{
Chars++;
}
Column = (DISPLAY_WIDTH - Chars * pFont->ItemPixelsX) / 2;
cDisplayString(pFont,Column,Line * 8,pString);
}
}
void cDisplayUpdateMenuIcon(UBYTE *pIcon,SCREEN_CORDINATE *pCord)
{
UBYTE *pDestination;
UBYTE Line;
UBYTE Column;
UBYTE Lines;
UBYTE Columns;
if (((pCord->StartY & 0x07) == 0) && ((pCord->PixelsY & 0x07) == 0))
{
Line = pCord->StartY / 8;
Lines = Line + pCord->PixelsY / 8;
Columns = pCord->StartX + pCord->PixelsX;
if (pIcon != NULL)
{
while (Line < Lines)
{
Column = pCord->StartX;
pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + Column];
while (Column < Columns)
{
*pDestination |= *pIcon;
pIcon++;
pDestination++;
Column++;
}
Line++;
}
}
else
{
while (Line < Lines)
{
pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + pCord->StartX];
memset(pDestination,0,(size_t)pCord->PixelsX);
Line++;
}
}
}
}
void cDisplayUpdateIcon(ICON *pIcons,UBYTE Index,SCREEN_CORDINATE *pCord)
{
UBYTE *pSource;
UBYTE *pDestination;
UBYTE Line;
UBYTE Lines;
if (pIcons)
{
if ((Index > 0) && (Index <= (pIcons->ItemsX * pIcons->ItemsY)))
{
Index--;
if (((pCord->StartY & 0x07) == 0) && ((pCord->PixelsY & 0x07) == 0))
{
Line = pCord->StartY / 8;
Lines = Line + pCord->PixelsY / 8;
pSource = &pIcons->Data[((Index / pIcons->ItemsX) * pIcons->ItemsX * pIcons->ItemPixelsX * pIcons->ItemPixelsY / 8) + ((Index % pIcons->ItemsX) * pIcons->ItemPixelsX)];
while (Line < Lines)
{
pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + pCord->StartX];
memcpy(pDestination,pSource,(size_t)pCord->PixelsX);
pSource += (pIcons->ItemPixelsX * pIcons->ItemsX);
Line++;
}
}
}
else
{
if (((pCord->StartY & 0x07) == 0) && ((pCord->PixelsY & 0x07) == 0))
{
Line = pCord->StartY / 8;
Lines = Line + pCord->PixelsY / 8;
while (Line < Lines)
{
pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + pCord->StartX];
memset(pDestination,0,(size_t)pCord->PixelsX);
Line++;
}
}
}
}
}
void cDisplayLineX(UBYTE X1,UBYTE X2,UBYTE Y)
{
UBYTE X;
UBYTE M;
M = 1 << (Y % 8);
Y >>= 3;
for (X = X1;X < X2;X++)
{
IOMapDisplay.Display[Y * DISPLAY_WIDTH + X] |= M;
}
}
void cDisplayLineY(UBYTE X,UBYTE Y1,UBYTE Y2)
{
UBYTE Y;
for (Y = Y1;Y < Y2;Y++)
{
IOMapDisplay.Display[(Y / 8) * DISPLAY_WIDTH + X] |= (1 << (Y % 8));
}
}
void cDisplayFrame(SCREEN_CORDINATE *pCord)
{
cDisplayLineX(pCord->StartX,pCord->StartX + pCord->PixelsX - 1,pCord->StartY);
cDisplayLineY(pCord->StartX,pCord->StartY,pCord->StartY + pCord->PixelsY - 1);
cDisplayLineY(pCord->StartX + pCord->PixelsX - 1,pCord->StartY,pCord->StartY + pCord->PixelsY - 1);
}
void cDisplayEraseLine(UBYTE Line)
{
UBYTE Tmp;
for (Tmp = 0;Tmp < DISPLAY_WIDTH;Tmp++)
{
IOMapDisplay.Display[Line * DISPLAY_WIDTH + Tmp] = 0x00;
}
}
void cDisplayErase(void)
{
UBYTE Tmp;
for (Tmp = 0;Tmp < (DISPLAY_HEIGHT / 8);Tmp++)
{
cDisplayEraseLine(Tmp);
}
}
void cDisplayEraseScreen(SCREEN_CORDINATE *pCord)
{
UBYTE *pDestination;
UBYTE Line;
UBYTE Lines;
if (((pCord->StartY & 0x07) == 0) && ((pCord->PixelsY & 0x07) == 0))
{
Line = pCord->StartY / 8;
Lines = Line + pCord->PixelsY / 8;
while (Line < Lines)
{
pDestination = &IOMapDisplay.Display[Line * DISPLAY_WIDTH + pCord->StartX];
memset(pDestination,0,(size_t)pCord->PixelsX);
Line++;
}
}
}
void cDisplayDraw(UBYTE Cmd,UBYTE On,UBYTE X1,UBYTE Y1,UBYTE X2,UBYTE Y2)
{
switch (Cmd)
{
case DISPLAY_ERASE_ALL :
{
cDisplayErase();
}
break;
case DISPLAY_PIXEL :
{
if (On == TRUE)
{
cDisplaySetPixel(X1,Y1);
}
else
{
cDisplayClrPixel(X1,Y1);
}
}
break;
case DISPLAY_HORISONTAL_LINE :
{
if (On == TRUE)
{
if (X1 > X2)
{
cDisplayLineX(X2,X1,Y1);
}
else
{
cDisplayLineX(X1,X2,Y1);
}
}
}
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -