×
单片机 > 单片机程序设计 > 详情

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

发布时间:2020-06-22 发布时间:
|
想了很久,每次做菜单都受限于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;

关键字:51单片机  LCD12864  液晶屏显示  图形菜单 

『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ARM 汇编的必知必会