?? lcddrive.c
字號:
{
*p_buffer++ = color; // 不斷填充并顯示
x0++;
if(x0 >= GUI_LCM_XMAX) return; // 若超出一行的范圍,則直接退出
}
}
/*********************************************************************************************************
** Function name: GUI_RLine
** Descriptions: 畫垂直線。
** 操作失敗原因是指定地址超出緩沖區范圍。
** Input: x0 垂直線起點所在列的位置
** y0 垂直線起點所在行的位置
** y1 垂直線終點所在行的位置
** color 顯示顏色
** Output: 無
********************************************************************************************************/
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: 無
********************************************************************************************************/
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: 無
********************************************************************************************************/
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: 無
********************************************************************************************************/
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: 無
********************************************************************************************************/
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 + -