51单片机控制LCD12864液晶屏显示图形菜单

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机控制LCD12864液晶屏显示图形

菜单

想了很久,每次做菜单都受限于12864字符模式的各种限制,比如字体大小,不能显示图标等等,没有任

何效果,这次就来个彻底的解脱,写一个单函数就能完

成所有功能的函数,只需要2个图片就能完成任意菜单内容的菜单,可以有2的8次方=256个选择结果,应该能满足所有的要求了吧?菜单的内容就是图片的内容,

因此可以显示任意大小的图形文字混合的菜单条目,比

如使用字符模式,一屏只能显示4行菜单(64/16=4),且只能显示汉字和字符等,显示位置等等的都受限,而

这个方法可以显示比如12*12(64/12=5行)的字符,8*8(64/8=8行)的字符,甚至不是字符,可以是图标+文字+任意其他的图像,只要是图片能显示的,都可以。。哈哈,比较复杂,现在只写了一少半,预期能够提供多种

显示效果,希望我能完成。。。。

void Lcd_Draw_BmpMenu(UINT8 *pMenu,UINT8

*pTitleBmp,UINT8 *pMenuBmp)

{

/*使用2张图片作为纯图形菜单来选择和操作,返回被

选择的项,pMenu是一个指向菜单的各种参数的结构体

的指针,pTitleBmp指向作为菜单标题的一张图片,pMenuBmp指向作为菜单内容的图片(液晶的控制芯片是ST7920)

yx-->;>;

|

\|/

*/

xdata struct { //除非另有说明x坐标均为大列的坐标,一个大列是16个像素,一行共有8大列数据

//========= 以下是入参基本参数,一旦确定,最好不要随意更改 ======

UINT8 Title_x;//标题图片在屏幕上的显示起始位置X UINT8 Title_y;//标题图片在屏幕上的显示起始位置Y UINT8 Title_Len_x;//标题图片的宽

UINT8 Title_Len_y;//标题图片的高

UINT8 Menu_x;//菜单在屏幕上的显示起始位置X

UINT8 Menu_y;//菜单在屏幕上的显示起始位置Y

UINT8 Menu_End_y;//菜单在屏幕上的显示结束位置Y UINT8 Menu_Bmp_x;//菜单图片的宽

UINT8 Menu_Bmp_y;//菜单图片的高

UINT8 Menu_Item_Height;//每一菜单项的高度(像素为单位)

UINT8 Line_x;//最后下划线的起始坐标x

UINT8 Line_y;//最后下划线的起始坐标Y

UINT8 Line_Len;//最后下划线的长度,如果为0,则表

示不画出这条线(像素为单位)

//====== 以下是菜单的风格设置 ========

UINT8 Scroll_Speed;//菜单滚动的速度,0~9个级别,

越低越快,越高越慢(液晶屏显示速度有快有慢,调整这个参数用于适用不同的液晶屏

UINT8 Continue_Scroll;//指定菜单是否可以形成一个

连续滚动选择的效果;0不连续,背景和反白位置都会

根据实际情况滚动 1菜单连续滚动,反白位置不动

UINT8 RePaint;//=0不重画菜单,=1重画整个菜单的图像,一般都是首次调用本函数的时候置1,用于画出整

个菜单,以后调用置0就可以了

UINT8 MenuEffect;//菜单运动的效果;0没有任何效果,只是最普通的菜单形态,1平滑滚动,2平滑滚动,具有惯性效果,3具有减速效果,没有惯性效果,4具有减速和惯性效果

//====== 以下用于控制菜单的选择参数 =======

UINT8 Last_Select_Item;//上次执行本函数后,所选择的菜单项

UINT8 Select_Item;//本次执行本函数,要选择的菜单

}M;

//============== 以下是变量定义 =============== UINT8 xdata Menu_Item_Count;//总共有几个菜单项UINT8 xdata Menu_Screen_Count;//当前一屏最多可以显示几个菜单项

UINT8 xdata

Menu_Box_x,Menu_Box_y,Menu_Box_End_x,Menu_Box_End _y;//需要刷新的区域的坐标

UINT8 *pMenu_Box_Bmp;//需要显示的菜单项的指针StructCopy(&M.Title_x,pMenu,19);//把参数复制到本函数内,便于操作

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

);//画出标题的图片

if(M.Line_Len!=0)

Lcd_DrawRowLine(M.Line_x,M.Line_y,M.Line_Len,1);/ /画出最下面的线

}

//---------------------------------------------------------------------------

//-----------需要刷新的图像的区域

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;

。。。。。还没有写完。。。

相关文档
最新文档