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

📄 lcd.c

📁 Cirrus Logic EP7312处理器部分控制程序。
💻 C
📖 第 1 页 / 共 2 页
字号:
//****************************************************************************
//
// LCD.C - General drawing routines.
//
// Copyright (c) 1998-2001 Cirrus Logic, Inc.
//
//****************************************************************************
#include "lib7312.h"
#include "font.h"

//****************************************************************************
//
// LCDLine and LCDColorLine draw a line from (lX1, lY1) to (lX2, lY2).  This
// is an implementation of Bresenham's line drawing algorithm; for details,
// see any reputable graphics book.
//
//****************************************************************************
void
LCDLine(long lX1, long lY1, long lX2, long lY2, char cColor)
{       
    long lX, lY, lXend, lYend, lDx, lDy, lD, lXinc, lYinc, lIncr1, lIncr2;

    lDx = lX2 > lX1 ? lX2 - lX1 : lX1 - lX2;
    lDy = lY2 > lY1 ? lY2 - lY1 : lY1 - lY2;
    
    if(lDx >= lDy)
    {
        if(lX1 > lX2)
        {
            lX = lX2;
            lY = lY2;
            lXend = lX1;

            if(lDy == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = -1;
                }
                else
                {
                    lYinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lXend = lX2;

            if(lDx == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = 1;
                }
                else
                {
                    lYinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDy;
        lD = lIncr1 - lDx;
        lIncr2 = 2 * (lDy - lDx);

        LCDSetPixel(lX, lY, cColor);

        while(lX < lXend)
        {
            lX++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lY += lYinc;      
                lD += lIncr2;
            }

            LCDSetPixel(lX, lY, cColor);
        }
    }
    else
    {
        if(lY1 > lY2)
        {
            lX = lX2;
            lY = lY2;
            lYend = lY1;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = -1;
                }
                else
                {
                    lXinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lYend = lY2;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = 1;
                }
                else
                {
                    lXinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDx;
        lD = lIncr1 - lDy;
        lIncr2 = 2 * (lDx - lDy);

        LCDSetPixel(lX, lY, cColor);

        while(lY < lYend)
        {
            lY++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lX += lXinc;
                lD += lIncr2;
            }

            LCDSetPixel(lX, lY, cColor);
        }
    }
}

void
LCDColorLine(long lX1, long lY1, long lX2, long lY2, CPixel sColor)
{       
    long lX, lY, lXend, lYend, lDx, lDy, lD, lXinc, lYinc, lIncr1, lIncr2;

    lDx = lX2 > lX1 ? lX2 - lX1 : lX1 - lX2;
    lDy = lY2 > lY1 ? lY2 - lY1 : lY1 - lY2;
    
    if(lDx >= lDy)
    {
        if(lX1 > lX2)
        {
            lX = lX2;
            lY = lY2;
            lXend = lX1;

            if(lDy == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = -1;
                }
                else
                {
                    lYinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lXend = lX2;

            if(lDx == 0)
            {
                lYinc = 0;
            }
            else
            {
                if(lY2 > lY1)
                {
                    lYinc = 1;
                }
                else
                {
                    lYinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDy;
        lD = lIncr1 - lDx;
        lIncr2 = 2 * (lDy - lDx);

        LCDColorSetPixel(lX, lY, sColor);

        while(lX < lXend)
        {
            lX++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lY += lYinc;      
                lD += lIncr2;
            }

            LCDColorSetPixel(lX, lY, sColor);
        }
    }
    else
    {
        if(lY1 > lY2)
        {
            lX = lX2;
            lY = lY2;
            lYend = lY1;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = -1;
                }
                else
                {
                    lXinc = 1;
                }
            }
        }
        else
        {
            lX = lX1;
            lY = lY1;
            lYend = lY2;

            if(lDx == 0)
            {
                lXinc = 0;
            }
            else
            {
                if(lX2 > lX1)
                {
                    lXinc = 1;
                }
                else
                {
                    lXinc = -1;
                }
            }
        }

        lIncr1 = 2 * lDx;
        lD = lIncr1 - lDy;
        lIncr2 = 2 * (lDx - lDy);

        LCDColorSetPixel(lX, lY, sColor);

        while(lY < lYend)
        {
            lY++;

            if(lD < 0)
            {
                lD += lIncr1;
            }
            else
            {
                lX += lXinc;
                lD += lIncr2;
            }

            LCDColorSetPixel(lX, lY, sColor);
        }
    }
}

//****************************************************************************
//
// LCDCircle and LCDColorCircle draw a circle at the specified location.
// This is an implementation of Bresenham's circle drawing algorithm; for
// details, see any reputable graphics book.
//
//****************************************************************************
void
LCDCircle(long lX, long lY, long lRadius, char cColor)
{
    long lXpos, lYpos, lD;

    lXpos = 0;
    lYpos = lRadius;

    lD = 3 - (2 * lYpos);

    while(lYpos >= lXpos)
    {
        LCDSetPixel(lX + lXpos, lY + lYpos, cColor);
        LCDSetPixel(lX + lYpos, lY + lXpos, cColor);
        LCDSetPixel(lX + lXpos, lY - lYpos, cColor);
        LCDSetPixel(lX - lYpos, lY + lXpos, cColor);
        LCDSetPixel(lX - lXpos, lY - lYpos, cColor);
        LCDSetPixel(lX - lYpos, lY - lXpos, cColor);
        LCDSetPixel(lX - lXpos, lY + lYpos, cColor);
        LCDSetPixel(lX + lYpos, lY - lXpos, cColor);

        if(lD < 0)
        {
            lD += (4 * lXpos) + 6;
        }
        else
        {
            lD += 10 + (4 * (lXpos - lYpos));
            lYpos--;
        }

⌨️ 快捷键说明

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