51单片机控制LCD12864液晶屏显示图形菜单
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;
。。。。。还没有写完。。。