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

发布者:快乐旅行最新更新时间:2015-06-24 来源: 51hei关键字: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;

关键字:51单片机  LCD12864  液晶屏显示  图形菜单 引用地址:51单片机控制LCD12864液晶屏显示图形菜单

上一篇:51单片机驱动8*8LED点阵屏显示沙漏形状汇编程序
下一篇:51单片机i2c存储器24c02驱动程序

推荐阅读最新更新时间:2024-03-16 14:04

51单片机-串口printf系列函数
1.printf系列的函数实现 懂得了单片机通过串口传输数据给电脑端窗口查看,那么,有时我们需要发送字符串,有时需要发送一个变量的数值是多少,以及还要发送回车换行这三种情况。所以我们把这三个功能函数封装起来,方便后续的串口使用。 首先笔者写的“void printf_str(u8 *str)”函数就是专门用来发送字符串给电脑端的。 其次“void printf_num(u32 num)”发送的变量的数值只支持显示十进制数0~4294967295,也就是参数是u32类型。 最后“void printf_rn()”就是发送回车换行符了。 关于这三部分的代码大家可以尝试去阅读一下是怎么实现的,如果有很多地方看不懂那么
[单片机]
<font color='red'>51单片机</font>-串口printf系列函数
AT89C51单片机在无线数据传输中的应用
一般的数字采集系统,是 通过 传感 器将捕捉的现场 信号 转换为电信号,经模/数转换器ADC采样、量化、编码后,为成数字信号,存入数据 存储器 ,或送给微处理器,或通过无线方式将数据发送给接收端进行处理。无线数据传输系统就是 样一套利用无线手段,将采集的数据由测量站发送到主控站的设备。 1 系统组成 系统组成如图1、图2所示。   系统由测量站和主控站两部分组成。测量站主要完成对现场信号的采集、存储,接收遥控 指令并 发送数据。主控站的主要工作是发送遥控指令、接收数据信息、进行数据处理和数据管理、随机显示打印等。 2 AT89C51与数字电台的串行通信 Atmel公司的AT89C51单片机,是一种低功耗、高 性能 的、片
[单片机]
第72节:在液晶屏中把字体顺时针旋转90度显示的算法程序
开场白: 我曾经遇到过这样的项目,客户由于外壳结果的原因,故意把液晶屏物理位置逆时针旋转了90度,在这种情况下,如果按之前的显示驱动就会发现字体也跟着倒了过来,影响了阅读。当时我的解决办法就是把字体的字库数组通过算法顺时针旋转90度就达到了目的。这一节把这个算法教给大家。 这个算法的本质是:请看以下附图1,附图2,附图3. 第一步:旋转90度的本质,就是把原来横向取模改成纵向去模。先把代表每一行16个点阵数的2个char型数据合并成1个int型数据。 第二步:再把每一列的16个点阵按2个字节分别取到一个数组里,就是纵向取模的过程了。 具体内容,请看源代码讲解。 (1)硬件平台: 基于朱兆祺51单片机学习板。
[单片机]
第72节:在<font color='red'>液晶屏</font>中把字体顺时针旋转90度<font color='red'>显示</font>的算法程序
8051单片机的反转法扫描键盘
键盘扫描采用反转法读键:先从P2口的高4位输出零 电平 ,从P2口的低4位读取键盘状态;再从P2口的低4位输出零电平,从P2口的高4位读取键盘状态,将两次读取的结果组合起来就可以得到当前按键的特征码(见程序中TABLE表)。有了这张表就可以编程,将它们转换成顺序码。用当前读得的特征码来顺序查表,用一单元记录查找次数。当在表中查到有该特征码时,它的位置(即查找次数)就是对应的顺序码。对应的键盘查键程序如下: KEY: MOV P2,#0FH ;用反转法查键 MOV A,P2 ANL A,#0FH MOV B,A MOV P2,#0F0H MOV A,P2 ANL A,#0F0H ORL A,B CJNE A,#0FFH,KEY1
[单片机]
51单片机电子钟制作-升级版
经过两天熬夜的艰苦奋战,在原程序基础上进行升级,添加按键多功能操作 新增功能:1. K1模式转换,可自由切换:主界面显示,时间调整,闹钟设置,温度上下限设定等。等 2. K2选定需要调整的位数。 切换至时间调整时,通过K3- 加 ,K4- 减 按键调整数值。 切换至闹钟设置时,通过K3- 加 ,K4- 减 按键调整数值。 切换至温度上下限设定时,通过K3- 加 ,K4- 减 按键调整数值。 准备扩展的新功能:闹钟音乐,喇叭开启和关闭,。 操作说明: 开机进入主界面,显示时钟和温度。按下K1时,进入模式选择,(有时间调整,闹钟设置,温
[单片机]
<font color='red'>51单片机</font>电子钟制作-升级版
基于89C2051单片机的热表通讯模块的开发
1  引言 集中供热方式的普及以及计量供热的实施是建筑节能的有效手段,但需要通过供热系统运行管理的自动化来实现。为了研究热网的控制调节方法,建立了热网模拟实验平台,并且配置了自动监测控制系统。在设备选型时,采用了丹麦Kamstrup 热量表作为实验管网中各主要管段输送热量及实验系统热量的测量采集装置,但该热表配备的数据通讯接口模块只能通过专用外接插口与计算机或相应的数据终端进行一对一的RS - 232 串行通讯,难以满足现场的通讯要求。 2  通讯模块的核心器件 在系统中,单片机一般称为下位机,通常用来完成数据的采集和上传,由PC 机、网络设备、数据库服务器组成的后台应用部分则统称为上位机,对下位机的上传数据进行分析
[单片机]
基于89C20<font color='red'>51单片机</font>的热表通讯模块的开发
51单片机定时器工作方式1、2原理详解
写在前面 1.本篇博文旨在帮助那些像我一样刚入门51单片机,如果你对定时器有一定了解,但是其中的的工作方式不能理解,那么这篇文章很适合你,如果你是大神的话…直接绕行吧…… 2.我在学习的过程中由于知识上的不足很多的讲解看不懂,在翻找了许多资料真正理解之后,打算以一种简单易懂的方式进行解释,这是一份很 详尽基础 的讲解手册。 3.全文以定时器0为例,定时器1的用法与其相同。 4.由于是讲定时器实现原理,文章文字显得较多,不过都是很简单的文字,只要认真看都能看得懂。 知识填充 虽然看懂这篇博文不需要太多的知识储备,但是在这里还是做一个简单的知识普及,便于下文的讲解 4位二进制数可以和1位十六进制数相互转化,如二进制
[单片机]
什么是51单片机?又该如何自学51单片机
51 单片机是目前使用最多的单片机之一,那么什么是 51 单片机呢?作为新手,又该如何自学 51 单片机?为帮助大家更好的学习 51 单片机,本文将对这两个问题予以阐述。如果你对 51 单片机具有兴趣,不妨继续往下阅读哦。 一、何为 51 单片机 51 单片机是对所有兼容 Intel8031 指令系统的单片机的统称。该系列单片机的始祖是 Intel 的 8004 单片机,后来随着 Flashrom 技术的发展,8004 单片机取得了长足的进展,成为应用最广泛的 8 位单片机之一,其代表型号是 ATMEL 公司的 AT89 系列,它广泛应用于工业测控系统之中。很多公司都有 51 系列的兼容机型推出,今后很长的一段时间内将占有大量
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved