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

📄 c_display.c

📁 乐高机器人的源码,开发平台是IAR_for_AVR.
💻 C
📖 第 1 页 / 共 2 页
字号:
//
// 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 + -