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

📄 lcddrive.c

📁 基于2410的LCD试验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
        *ret = *DAT_Point;          // 读到数据 
    }            
   
    return(1);
}



/*********************************************************************************************************
** Function name: GUI_HLine
** Descriptions: 画水平线。
**              操作失败原因是指定地址超出缓冲区范围。
** Input: x0	水平线起点所在列的位置
**        y0	水平线起点所在行的位置
**        x1    水平线终点所在列的位置
**        color	显示颜色
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Note: 针对STN液晶屏修改
** Modified by: 黄绍斌
** Modified Date: 2006-01-13 
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_HLine(uint16 x0, uint16 y0, uint16 x1, TCOLOR color) 
{     
    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;
      
    while(x1 >= x0)
    {  
        GUI_Point(x0, y0, 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(y1 == y0) 
    {
        GUI_HLine(x0, y0, x1, color);
        return;
    }
    if(x1 == x0) 
    {   
        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    显示数据缓冲区(uint8, 格式为 R:3, G:3, B:2)
** Output: 无
** Created by: 黄绍斌
** Created Date: 2005-12-31 
**-------------------------------------------------------------------------------------------------------
** Note: 针对STN液晶屏修改
** Modified by: 黄绍斌
** Modified Date: 2006-01-13  
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void  GUI_DispPic( uint16 x, uint16 y, 
                   uint16 w, uint16 h,
                   uint8  *buffer)
{
    int    i, j;
    
    volatile uint8  *DAT_Point;
    volatile uint8  *DAT_Point1;
    uint32   lcm_addr;  // 液晶显示地址
  
    
    // 需填充区域参数过滤
    if( x > (GUI_LCM_XMAX-1) ||
        y > (GUI_LCM_YMAX-1)
       ) 
    {   return;
    }
      
    if((x+w) > GUI_LCM_XMAX)
    {   return;
    }
    if((y+h) > GUI_LCM_YMAX)
    {   return;
    }            
                
    // 使用LUBK9111屏时,x1 = GUI_LCM_XMAX - x -1, y = GUI_LCM_YMAX - y - 1;
    // 若按图片显示时,则先要找到图片右下角的起始点坐标(即目标坐标时图片的最
    // 小坐标位置,即可以地址递增,而数据数据需要递减)和对应的数据地址(数据结
    // 束地址),然后循环输入数据。
    buffer = buffer + w * h - 1;            // 取得图片右下角的地址
    x = GUI_LCM_XMAX - (x+w);
    y = GUI_LCM_YMAX - (y+h); 
    
    // 更新显示数据
    for(i=0; i<h; i++)			// 输出h行数据
    {         
        // 输出一行(w)数据         
        lcm_addr = y*GUI_LCM_XMAX + x;
        DAT_Point = (uint8 *)FrameBuffer;
        DAT_Point += lcm_addr;
   
        for(j=0; j<w; j++)
        {   
            lcm_addr = (uint32) DAT_Point;
            if(lcm_addr & 0x01)
            {
                DAT_Point1 = (uint8 *)(lcm_addr & 0xFFFFFFFE);
                *DAT_Point1 = *buffer;	    // 输出数据 
            }
            else
            {
                DAT_Point1 = (uint8 *)(lcm_addr | 0x00000001);
                *DAT_Point1 = *buffer;	    // 输出数据 
            }                                    
            buffer--;
            DAT_Point++;
        }
       
        // 指向下一行
        y++;
    } // end of for(i=0; i<h; i++)...              
}

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

⌨️ 快捷键说明

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