51單片機控制LCD12864液晶屏顯示圖形菜單
void Lcd_Draw_BmpMenu(UINT8 *pMenu,UINT8 *pTitleBmp,UINT8 *pMenuBmp)
{
/*使用2張圖片作為純圖形菜單來選擇和操作,返回被選擇的項,pMenu是一個指向菜單的各種參數(shù)的結(jié)構(gòu)體的指針,pTitleBmp指向作為菜單標(biāo)題的一張圖片,pMenuBmp指向作為菜單內(nèi)容的圖片(液晶的控制芯片是ST7920)
yx-->>
|
|/
*/
xdata struct { //除非另有說明x坐標(biāo)均為大列的坐標(biāo),一個大列是16個像素,一行共有8大列數(shù)據(jù)
//========= 以下是入?yún)⒒緟?shù),一旦確定,最好不要隨意更改 ======
UINT8 Title_x;//標(biāo)題圖片在屏幕上的顯示起始位置X
UINT8 Title_y;//標(biāo)題圖片在屏幕上的顯示起始位置Y
UINT8 Title_Len_x;//標(biāo)題圖片的寬
UINT8 Title_Len_y;//標(biāo)題圖片的高
UINT8 Menu_x;//菜單在屏幕上的顯示起始位置X
UINT8 Menu_y;//菜單在屏幕上的顯示起始位置Y
UINT8 Menu_End_y;//菜單在屏幕上的顯示結(jié)束位置Y
UINT8 Menu_Bmp_x;//菜單圖片的寬
UINT8 Menu_Bmp_y;//菜單圖片的高
UINT8 Menu_Item_Height;//每一菜單項的高度(像素為單位)
UINT8 Line_x;//最后下劃線的起始坐標(biāo)x
UINT8 Line_y;//最后下劃線的起始坐標(biāo)Y
UINT8 Line_Len;//最后下劃線的長度,如果為0,則表示不畫出這條線(像素為單位)
//====== 以下是菜單的風(fēng)格設(shè)置 ========
UINT8 Scroll_Speed;//菜單滾動的速度,0~9個級別,越低越快,越高越慢(液晶屏顯示速度有快有慢,調(diào)整這個參數(shù)用于適用不同的液晶屏
UINT8 Continue_Scroll;//指定菜單是否可以形成一個連續(xù)滾動選擇的效果;0不連續(xù),背景和反白位置都會根據(jù)實際情況滾動 1菜單連續(xù)滾動,反白位置不動
UINT8 RePaint;//=0不重畫菜單,=1重畫整個菜單的圖像,一般都是首次調(diào)用本函數(shù)的時候置1,用于畫出整個菜單,以后調(diào)用置0就可以了
UINT8 MenuEffect;//菜單運動的效果;0沒有任何效果,只是最普通的菜單形態(tài),1平滑滾動,2平滑滾動,具有慣性效果,3具有減速效果,沒有慣性效果,4具有減速和慣性效果
//====== 以下用于控制菜單的選擇參數(shù) =======
UINT8 Last_Select_Item;//上次執(zhí)行本函數(shù)后,所選擇的菜單項
UINT8 Select_Item;//本次執(zhí)行本函數(shù),要選擇的菜單項
}M;
//============== 以下是變量定義 ===============
UINT8 xdata Menu_Item_Count;//總共有幾個菜單項
UINT8 xdata Menu_Screen_Count;//當(dāng)前一屏最多可以顯示幾個菜單項
UINT8 xdata Menu_Box_x,Menu_Box_y,Menu_Box_End_x,Menu_Box_End_y;//需要刷新的區(qū)域的坐標(biāo)
UINT8 *pMenu_Box_Bmp;//需要顯示的菜單項的指針
StructCopy(&M.Title_x,pMenu,19);//把參數(shù)復(fù)制到本函數(shù)內(nèi),便于操作
Menu_Item_Count=M.Menu_Bmp_y/M.Menu_Item_Height;//總共有幾個菜單項
Menu_Screen_Count=(M.Menu_End_y-M.Menu_y)/M.Menu_Item_Height;//一屏最多可以顯示多少項菜單
//---------------------------------------------------------------------------
if(M.RePaint==1)//如果需要重畫整個菜單圖像
{
Lcd_Draw_BMP(M.Title_x,
M.Title_y,
M.Title_x+M.Title_Len_x,
M.Title_y+M.Title_Len_y,
pTitleBmp
);//畫出標(biāo)題的圖片
if(M.Line_Len!=0)
Lcd_DrawRowLine(M.Line_x,M.Line_y,M.Line_Len,1);//畫出最下面的線
}
//---------------------------------------------------------------------------
//-----------需要刷新的圖像的區(qū)域
Menu_Box_x=M.Menu_x;
Menu_Box_y=M.Menu_y;
Menu_Box_End_x=M.Menu_x+M.Menu_Bmp_x;
Menu_Box_End_y=M.Menu_End_y;
評論