?? lcddriver.c
字號(hào):
** 操作失敗原因是指定地址超出緩沖區(qū)范圍。
** Input: x0 水平線(xiàn)起點(diǎn)所在列的位置
** y0 水平線(xiàn)起點(diǎn)所在行的位置
** x1 水平線(xiàn)終點(diǎn)所在列的位置
** color 顯示顏色
** Output: 無(wú)
** 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) // 對(duì)x0、x1大小進(jìn)行排列,以便畫(huà)圖
{
bak = x1;
x1 = x0;
x0 = bak;
}
if(x0 >= GUI_LCM_XMAX) return; // 參數(shù)過(guò)濾
if(y0 >= GUI_LCM_YMAX) return;
p_buffer = (uint16 *)FrameBuffer; // 設(shè)置填充顯示緩沖區(qū)的地址
p_buffer = p_buffer + y0*GUI_LCM_XMAX + x0; // 計(jì)算顯示點(diǎn)對(duì)應(yīng)顯示緩沖區(qū)的位置
while(x1 >= x0)
{
*p_buffer++ = color; // 不斷填充并顯示
x0++;
if(x0 >= GUI_LCM_XMAX) return; // 若超出一行的范圍,則直接退出
}
}
/*********************************************************************************************************
** Function name: GUI_RLine
** Descriptions: 畫(huà)垂直線(xiàn)。
** 操作失敗原因是指定地址超出緩沖區(qū)范圍。
** Input: x0 垂直線(xiàn)起點(diǎn)所在列的位置
** y0 垂直線(xiàn)起點(diǎn)所在行的位置
** y1 垂直線(xiàn)終點(diǎn)所在行的位置
** color 顯示顏色
** Output: 無(wú)
** 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) // 對(duì)y0、y1大小進(jìn)行排列,以便畫(huà)圖
{
bak = y1;
y1 = y0;
y0 = bak;
}
if(x0 >= GUI_LCM_XMAX) return; // 參數(shù)過(guò)濾
if(y0 >= GUI_LCM_YMAX) return;
while(y1 >= y0)
{
GUI_Point(x0, y0, color); // 逐點(diǎn)顯示,描出垂直線(xiàn)
y0++;
if(y0 >= GUI_LCM_YMAX) return; // 若超出屏幕的范圍,則直接退出
}
}
/*********************************************************************************************************
** Function name: GUI_Rectangle
** Descriptions: 畫(huà)矩形。
** 操作失敗原因是指定地址超出緩沖區(qū)范圍。
** Input: x0 矩形左上角的x坐標(biāo)值
** y0 矩形左上角的y坐標(biāo)值
** x1 矩形右下角的x坐標(biāo)值
** y1 矩形右下角的y坐標(biāo)值
** color 顯示顏色
** Output: 無(wú)
** 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: 填充矩形。畫(huà)一個(gè)填充的矩形,填充色與邊框色一樣。
** 操作失敗原因是指定地址超出緩沖區(qū)范圍。
** Input: x0 矩形左上角的x坐標(biāo)值
** y0 矩形左上角的y坐標(biāo)值
** x1 矩形右下角的x坐標(biāo)值
** y1 矩形右下角的y坐標(biāo)值
** color 填充顏色
** Output: 無(wú)
** 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;
// 先找出矩形左上角與右下角的兩個(gè)點(diǎn),保存在(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;
}
// 判斷是否只是直線(xiàn)
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); // 當(dāng)前畫(huà)水平線(xiàn)
y0++; // 下一行
}
}
/*********************************************************************************************************
** Function name: GUI_Line
** Descriptions: 畫(huà)任意兩點(diǎn)之間的直線(xiàn)。
** 操作失敗原因是指定地址超出緩沖區(qū)范圍。
** Input: x0 直線(xiàn)起點(diǎn)的x坐標(biāo)值
** y0 直線(xiàn)起點(diǎn)的y坐標(biāo)值
** x1 直線(xiàn)終點(diǎn)的x坐標(biāo)值
** y1 直線(xiàn)終點(diǎn)的y坐標(biāo)值
** color 顯示顏色(對(duì)于黑白色LCM,為0時(shí)滅,為1時(shí)顯示)
** Output: 無(wú)
** 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; // 直線(xiàn)x軸差值變量
int32 dy; // 直線(xiàn)y軸差值變量
int8 dx_sym; // x軸增長(zhǎng)方向,為-1時(shí)減值方向,為1時(shí)增值方向
int8 dy_sym; // y軸增長(zhǎng)方向,為-1時(shí)減值方向,為1時(shí)增值方向
int32 dx_x2; // dx*2值變量,用于加快運(yùn)算速度
int32 dy_x2; // dy*2值變量,用于加快運(yùn)算速度
int32 di; // 決策變量
dx = x1-x0; // 求取兩點(diǎn)之間的差值
dy = y1-y0;
// 判斷增長(zhǎng)方向,或是否為水平線(xiàn)、垂直線(xiàn)、點(diǎn)
if(dx>0) // 判斷x軸方向
{
dx_sym = 1; // dx>0,設(shè)置dx_sym=1
}
else
{
if(dx<0)
{
dx_sym = -1; // dx<0,設(shè)置dx_sym=-1
}
else
{
// dx==0,畫(huà)垂直線(xiàn),或一點(diǎn)
GUI_RLine(x0, y0, y1, color);
return;
}
} // end of if(dx>0)...else...
if(dy>0) // 判斷y軸方向
{
dy_sym = 1; // dy>0,設(shè)置dy_sym=1
}
else
{
if(dy<0)
{
dy_sym = -1; // dy<0,設(shè)置dy_sym=-1
}
else
{
// dy==0,畫(huà)水平線(xiàn),或一點(diǎn)
GUI_HLine(x0, y0, x1, color);
return;
}
} // end of if(dy>0)...else...
// 將dx、dy取絕對(duì)值
dx = dx_sym * dx;
dy = dy_sym * dy;
// 計(jì)算2倍的dx及dy值
dx_x2 = dx*2;
dy_x2 = dy*2;
// 使用Bresenham法進(jìn)行畫(huà)直線(xiàn)
if(dx >= dy) // 對(duì)于dx>=dy,則使用x軸為基準(zhǔn)
{
di = dy_x2 - dx;
while(x0 != x1)
{
GUI_Point(x0, y0, color);
x0 += dx_sym;
if(di<0)
{
di += dy_x2; // 計(jì)算出下一步的決策值
}
else
{
di += dy_x2 - dx_x2;
y0 += dy_sym;
}
} // end of while(x0 != x1)...
GUI_Point(x0, y0, color); // 顯示最后一點(diǎn)
}
else // 對(duì)于dx<dy,則使用y軸為基準(zhǔn)
{
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); // 顯示最后一點(diǎn)
} // end of if(dx >= dy)...else...
}
/*********************************************************************************************************
** Function name: GUI_DispPic
** Descriptions: 指定位置顯示圖片(圖片大小為w、h)。
** 不能正確顯示原因可能是指定的起始點(diǎn)不對(duì),或高度、寬度超出液晶顯示范圍,或數(shù)據(jù)格式錯(cuò)誤。
** Input: x,y 更新區(qū)域的起始點(diǎn)(左上角)
* w,h 區(qū)域?qū)挾群透叨?* buffer 顯示數(shù)據(jù)緩沖區(qū)(uint16, 格式為 R:5, G:6, B:5)
** Output: 無(wú)
** 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;
// 需填充區(qū)域參數(shù)過(guò)濾
if( (x >= GUI_LCM_XMAX) ||
(y >= GUI_LCM_YMAX)
)
{ return;
}
if((x+w) > GUI_LCM_XMAX)
{ return;
}
if((y+h) > GUI_LCM_YMAX)
{ return;
}
// 更新顯示數(shù)據(jù)
for(i=0; i<h; i++) // 輸出h行數(shù)據(jù)
{
// 輸出一行(w)數(shù)據(jù)
p_buffer = (uint16 *)FrameBuffer;
p_buffer = p_buffer + y*GUI_LCM_XMAX + x;
for(j=0; j<w; j++)
{
*p_buffer++ = *buffer++; // 輸出數(shù)據(jù)
}
// 指向下一行
y++;
} // end of for(i=0; i<h; i++)...
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -