您的位置 首页 发布

51单片机操控LCD12864液晶屏显现图形菜单

想了很久,每次做菜单都受限于12864字符模式的各种限制,比如字体大小,不能显示图标等等,没有任何效果,这次就来个彻底的解脱,写一个单

想了好久,每次做菜单都受限于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;

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/changshang/fabu/318294.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部