电子产业一站式赋能平台

PCB联盟网

搜索
查看: 1667|回复: 1
收起左侧

单片机C语言实例-205-彩屏图片显示

[复制链接]
发表于 2022-2-23 14:11:17 | 显示全部楼层 |阅读模式
单片机C语言实例-205-彩屏图片显示

/*
================================================================================
File Name : GUI_Basic.c
Author    : LiYOng
Date      : 2008-12-12 15:51
Version   : 1.0
Decription: This file contains some basic functions for GUI, It need the LCD
            Drive functions
================================================================================
*/
#include "GUI_Basic.H"
#include "GUI_Type.H"
#include "fontlib.h"
/*
================================================================================
Function     : GUI_DrawRectangle( )
Description  : Draw a rectangle
Input        : -pRect, point to a rectangle structure
output       : None
================================================================================
*/
void GUI_DrawRectangle( RECT* pRect )
{
        LINE line;

        line.xs = pRect->xs;
        line.xe = pRect->xe;
        line.ys = pRect->ys;
        line.ye = pRect->ys;
        line.Color = pRect->Color;
        LCDDrawHRLine( &line );

        line.xe = pRect->xs;
        line.ye = pRect->ye;
        LCDDrawHRLine( &line );

        line.xs = pRect->xe;
        line.ys = pRect->ye;
        LCDDrawHRLine( &line );

        line.xe = pRect->xe;
        line.ye = pRect->ys;
        LCDDrawHRLine( &line );
}
/*
================================================================================
Function     : GUI_DrawLine( )
Description  : Draw a line
Input        : -pLine, point to a line structure
output       : None
================================================================================
*/
void GUI_DrawLine( LINE* pLine )
{
        INT32S   dx;                                                // 直线x轴差值变量
        INT32S   dy;                  // 直线y轴差值变量
        INT32S    dx_sym;                                // x轴增长方向,为-1时减值方向,为1时增值方向
        INT32S    dy_sym;                                // y轴增长方向,为-1时减值方向,为1时增值方向
        INT32S   dx_x2;                                        // dx*2值变量,用于加快运算速度
        INT32S   dy_x2;                                        // dy*2值变量,用于加快运算速度
        INT32S   di;                                                // 决策变量

        POINT    point;
        LINE     line;

        line.xs = pLine->xs;
        line.ys = pLine->ys;
        line.xe = pLine->xe;
        line.ye = pLine->ye;
        line.Color = pLine->Color;

  point.Color = pLine->Color;

        dx = line.xe - line.xs;
  dy = line.ye - line.ys;

/* 判断增长方向,或是否为水平线、垂直线、点 */
        if( dx > 0 )                                        // 判断x轴方向
        {
                dx_sym = 1;                                        // dx>0,设置dx_sym=1
        }
        else
        {
                if( dx < 0 )
                {
                        dx_sym = -1;                  // dx<0,设置dx_sym=-1
                }
                else
                {
                        LCDDrawHRLine( &line );
                        return;
                }
        }

        if( dy > 0 )                                                        // 判断y轴方向
        {
                dy_sym = 1;                                        // dy>0,设置dy_sym=1
        }
        else
        {
                if( dy < 0 )
                {
                        dy_sym = -1;                                // dy<0,设置dy_sym=-1
                }
                else
                {  // dy==0,画水平线,或一点
                        LCDDrawHRLine( &line );
                        return;
                }
        }

        /* 将dx、dy取绝对值 */
        dx = dx_sym * dx;
        dy = dy_sym * dy;

        /* 计算2倍的dx及dy值 */
        dx_x2 = dx*2;
        dy_x2 = dy*2;

/* 使用Bresenham法进行画直线 */
        if( dx >= dy )                                                // 对于dx>=dy,则使用x轴为基准
        {
                di = dy_x2 - dx;
    while( line.xs != line.xe )
    {
                        point.x = line.xs;
                        point.y = line.ys;
                        LCDDrawPoint( &point );
                        line.xs += dx_sym;
                        if( di < 0 )
                        {
                                di += dy_x2;                        // 计算出下一步的决策值
                        }
                        else
                        {
                                di += dy_x2 - dx_x2;
                                line.ys += dy_sym;
                        }
    }
                LCDDrawPoint( &point );                // 显示最后一点
        }
        else                                                                // 对于dx<dy,则使用y轴为基准
        {
                di = dx_x2 - dy;
    while( line.ys != line.ye )
    {
                        point.x = line.xs;
                        point.y = line.ys;
                        LCDDrawPoint( &point );
                        line.ys += dy_sym;
                        if(di<0)
                        {
                                di += dx_x2;
                        }
                        else
                        {
                                di += dx_x2 - dy_x2;
                                line.xs += dx_sym;
                        }
    }
                LCDDrawPoint( &point );                // 显示最后一点
        }
}
/*


更多详情参考附件文档
+08:00C299联盟网3842.png
游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

2

主题

129

帖子

482

积分

一级会员

Rank: 1

积分
482
发表于 2022-2-24 09:11:22 | 显示全部楼层
111111111111111111
回复 支持 反对

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


联系客服 关注微信 下载APP 返回顶部 返回列表