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

📄 lcddrive.c

📁 基于ARM9 S3C2410 定时器的实验程序原代码
💻 C
📖 第 1 页 / 共 2 页
字号:
**              操作失败原因是指定地址超出缓冲区范围。
** Input: x0	水平线起点所在列的位置
**        y0	水平线起点所在行的位置
**        x1    水平线终点所在列的位置
**        color	显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_HLine(uint16 x0, uint16 y0, uint16 x1, TCOLOR color) 
{  
    volatile uint16  *p_buffer;   
    uint16  bak;

    if(x0 > x1)         // 对x0、x1大小进行排列,以便画图
    {  
        bak = x1;
        x1 = x0;
        x0 = bak;
    }
    if(x0 >= GUI_LCM_XMAX) return;              // 参数过滤
    if(y0 >= GUI_LCM_YMAX) return;
      
    p_buffer = (uint16 *)FrameBuffer;           // 设置填充显示缓冲区的地址    
    p_buffer = p_buffer + y0*GUI_LCM_XMAX + x0; // 计算显示点对应显示缓冲区的位置     
    while(x1 >= x0)
    {  
        *p_buffer++ = color;                    // 不断填充并显示	
        x0++;
        if(x0 >= GUI_LCM_XMAX) return;          // 若超出一行的范围,则直接退出
    }
}



/*********************************************************************************************************
** Function name: GUI_RLine
** Descriptions: 画垂直线。
**               操作失败原因是指定地址超出缓冲区范围。
** Input: x0	垂直线起点所在列的位置
**        y0	垂直线起点所在行的位置
**        y1    垂直线终点所在行的位置
**        color	显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_RLine(uint16 x0, uint16 y0, uint16 y1, TCOLOR color) 
{  
    uint16  bak;

    if(y0 > y1) 	    // 对y0、y1大小进行排列,以便画图
    {  
        bak = y1;
        y1 = y0;
        y0 = bak;
    }    
    if(x0 >= GUI_LCM_XMAX) return;      // 参数过滤
    if(y0 >= GUI_LCM_YMAX) return;
   
    while(y1 >= y0)
    {  
        GUI_Point(x0, y0, color);       // 逐点显示,描出垂直线
        y0++;
        if(y0 >= GUI_LCM_YMAX) return;  // 若超出屏幕的范围,则直接退出
    }	
}



/*********************************************************************************************************
** Function name: GUI_Rectangle
** Descriptions: 画矩形。
**               操作失败原因是指定地址超出缓冲区范围。
** Input: x0	矩形左上角的x坐标值
**        y0    矩形左上角的y坐标值
**        x1    矩形右下角的x坐标值
**        y1    矩形右下角的y坐标值
**        color	显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_Rectangle(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{  
    GUI_HLine(x0, y0, x1, color);
    GUI_HLine(x0, y1, x1, color);
    GUI_RLine(x0, y0, y1, color);
    GUI_RLine(x1, y0, y1, color);
}



/*********************************************************************************************************
** Function name: GUI_RectangleFill
** Descriptions: 填充矩形。画一个填充的矩形,填充色与边框色一样。
**              操作失败原因是指定地址超出缓冲区范围。
** Input: x0	矩形左上角的x坐标值
**        y0    矩形左上角的y坐标值
**        x1    矩形右下角的x坐标值
**        y1    矩形右下角的y坐标值
**        color	填充颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_RectangleFill(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{  
    uint32  i;

    // 先找出矩形左上角与右下角的两个点,保存在(x0,y0),(x1,y1) 
    if(x0 > x1) 						// 若x0>x1,则x0与x1交换
    {  
        i = x0;
        x0 = x1;
        x1 = i;
    }
    
    if(y0 > y1)						    // 若y0>y1,则y0与y1交换
    {  
        i = y0;
        y0 = y1;
        y1 = i;
    }
   
    // 判断是否只是直线 
    if(y0 == y1) 
    {
        GUI_HLine(x0, y0, x1, color);
        return;
    }
    if(x0 == x1) 
    {   
        GUI_RLine(x0, y0, y1, color);
        return;
    }

    while(y0 <= y1)						
    {  
        GUI_HLine(x0, y0, x1, color);   // 当前画水平线
        y0++;						    // 下一行
    }
}



/*********************************************************************************************************
** Function name: GUI_Line
** Descriptions: 画任意两点之间的直线。
**              操作失败原因是指定地址超出缓冲区范围。
** Input: x0	直线起点的x坐标值
**        y0	直线起点的y坐标值
**        x1    直线终点的x坐标值
**        y1    直线终点的y坐标值
**        color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)
{  
    int32   dx;						// 直线x轴差值变量
    int32   dy;          			// 直线y轴差值变量
    int8    dx_sym;					// x轴增长方向,为-1时减值方向,为1时增值方向
    int8    dy_sym;					// y轴增长方向,为-1时减值方向,为1时增值方向
    int32   dx_x2;					// dx*2值变量,用于加快运算速度
    int32   dy_x2;					// dy*2值变量,用于加快运算速度
    int32   di;						// 决策变量   
   
    dx = x1-x0;						// 求取两点之间的差值
    dy = y1-y0;
   
    // 判断增长方向,或是否为水平线、垂直线、点 
    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
        {  
            // dx==0,画垂直线,或一点
            GUI_RLine(x0, y0, y1, color);
      	    return;
        }
    } // end of if(dx>0)...else... 
   
    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,画水平线,或一点
            GUI_HLine(x0, y0, x1, color);
      	    return;
        }
    } // end of if(dy>0)...else...
    
    // 将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(x0 != x1)
        {  
            GUI_Point(x0, y0, color);
            x0 += dx_sym;
            if(di<0)
            {  
                di += dy_x2;			// 计算出下一步的决策值
            }
            else
            {  
                di += dy_x2 - dx_x2;
                y0 += dy_sym;
            }
        } // end of while(x0 != x1)...
        GUI_Point(x0, y0, color);		// 显示最后一点
    }
    else								// 对于dx<dy,则使用y轴为基准
    {  
        di = dx_x2 - dy;
        while(y0 != y1)
        {  
            GUI_Point(x0, y0, color);
            y0 += dy_sym;
            if(di<0)
            {  
                di += dx_x2;
            }
            else
            {  
                di += dx_x2 - dy_x2;
                x0 += dx_sym;
            }
        } // end of while(y0 != y1)...
        GUI_Point(x0, y0, color);		// 显示最后一点
    } // end of if(dx >= dy)...else...  
}



/*********************************************************************************************************
** Function name: GUI_DispPic
** Descriptions: 指定位置显示图片(图片大小为w、h)。
**              不能正确显示原因可能是指定的起始点不对,或高度、宽度超出液晶显示范围,或数据格式错误。
** Input: x,y  	    更新区域的起始点(左上角)
*		  w,h		区域宽度和高度
*         buffer    显示数据缓冲区(uint16, 格式为 R:5, G:6, B:5)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_DispPic( uint16 x, uint16 y, 
                   uint16 w, uint16 h,
                   uint16  *buffer)
{
    int    i, j;
    
    volatile uint16  *p_buffer;
  
    
    // 需填充区域参数过滤
    if( (x >= GUI_LCM_XMAX) ||
        (y >= GUI_LCM_YMAX)
       ) 
    {   return;
    }
      
    if((x+w) > GUI_LCM_XMAX)
    {   return;
    }
    if((y+h) > GUI_LCM_YMAX)
    {   return;
    }                         
    
    // 更新显示数据
    for(i=0; i<h; i++)			// 输出h行数据
    {         
        // 输出一行(w)数据         
        p_buffer = (uint16 *)FrameBuffer;
        p_buffer = p_buffer + y*GUI_LCM_XMAX + x;
   
        for(j=0; j<w; j++)
        {   
            *p_buffer++ = *buffer++;    // 输出数据 
        }
       
        // 指向下一行
        y++;
    } // end of for(i=0; i<h; i++)...              
}

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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