标题: 51单片机+12864上面实现3级菜单显示和切换 [打印本页]

作者: xugang    时间: 2013-6-20 23:24
标题: 51单片机+12864上面实现3级菜单显示和切换
用STC12系列的单片机在12864上面实现3级菜单显示!其中显示的图片是用坛子里一网友的LOG改装了的,但忘记是谁了。感谢那网友。

http://player.youku.com/player.php/sid/XMzEwMTU5MTY0/v.swf

优酷视频地址,感兴趣的朋友可以去看看。
代码可能不是很优化,望各位网友拍砖的时候手下留情。
是不是图片太大了,怎么传上去后图片的颜色都变了。感兴趣的还是去看看视频吧视频的效果比图片好。

程序和LOG都在此压缩包里 12864三级菜单.rar (175.29 KB, 下载次数: 914)






















作者: xugang    时间: 2013-6-20 23:42
/**************************************************************
*	+---------------------------------------------------+	  *
*   			   12864三级菜单显示						  *
*	+---------------------------------------------------+  	  *
*															  *
*  此源码版权属 小牛 全权享有,如欲引用,敬请署名并告知		  *
*        严禁随意用于商业目的,违者必究,后果自负			  *
*             			Q Q:513696765 						  *
*			       											  *
*  运行环境:STC12C5A60S2单片机 12M晶振						  *
*  程序说明:在12864上面实现三级菜单显示					  *
**************************************************************/
#include<reg52.h>
#include<intrins.h>
#include"def.h"
#include"mode.h"
#include"fuction.h"

void main()
{	

	init();
	while(1)
	{
		menucut(0,mun,table10,table0sub[0]);
		menucut(1,table0,table9,table1sub[0]);
		menucut(2,table1,table8,table2sub[0]);
		menucut(3,table2,table7,table3sub[0]);
		menucut(4,table3,table6,table4sub[0]);
		menucut(5,table4,table11,table5sub[0]);
		menucut(6,table5,table12,table6sub[0]);		
	}
}



作者: xugang    时间: 2013-6-20 23:42
#ifndef _fuction_h_
#define _fuction_h_

void init()
{
	w_com(0x01);	//清屏
	w_com(0x02);	//地址-》00H
	w_com(0x0c);	//显示状态设置
	w_com(0x30);	//功能设定
	w_com(0x80);
	w_com(0x01);	//清屏

}
//——————————读忙!—————————————//
void r_busy()
{
	IO=0xff;
	R_S=0;
	W_R=1;
	E=1;
	while(IO&0x80);
	E=0;
	
}
//——————————写指令—————————————//
void w_com(uchar com)
{
	r_busy();
	R_S=0;
	W_R=0;
	E=0;
	E=1;
	IO=com;
	E=0;
}
//——————————扩充指令——————————————//
void w_ecom(uchar ecom)
{
	w_com(0x34); //选择8位数据发送,选择为扩充指令 
	r_busy();
	R_S=0;
	W_R=0;
	E=0;
	E=1;
	IO=ecom;
	E=0;
}
//——————————写数据—————————————//
void w_dat(uchar dat)
{
	
	r_busy();

	R_S=1;
	W_R=0;
	E=0;
	E=1;
	IO=dat;
	E=0;
}

void delay(uchar x)
{
	uchar i,j;
	for(i=0;i<x;i++)
		for(j=0;j<124;j++);
}

void draw_pic(uchar *pic)
{
	uchar i,j; 
	w_com(0x01);	//清屏

	for(i=0;i<32;i++)
	{	
		w_ecom(0x80+i);		   //扩充指令,设定绘图RAM垂直地址
		w_ecom(0x80);		   //扩充指令,设定绘图RAM水平地址
		for(j=0;j<16;j++)
		{
			w_dat(*(pic++));
		}
	}

	for(i=0;i<32;i++)
	{	
		w_ecom(0x80+i);			//扩充指令,设定绘图RAM垂直地址
		w_ecom(0x88);			//扩充指令,设定绘图RAM水平地址
		for(j=0;j<16;j++)
		{
		
			w_dat(*(pic++));
		}
	}
		
	w_com(0x36);
	flag=1;
}

void draw_submune(uchar *pic,uchar row)		   //定义两个变量*pic-->图片字模的首地址;row-->子菜单要选择的行
{
	uchar i,j;
	flag=0; 
	w_com(0x01);	//清屏

	for(i=0;i<32;i++)
	{	
		w_ecom(0x80+i);		   //扩充指令,设定绘图RAM垂直地址
		w_ecom(0x80);		   //扩充指令,设定绘图RAM水平地址
		for(j=0;j<16;j++)
		{
			if((i>(16*(row-1))) && (i<(row*16)) && row<3)	 //用于判断LCD前32行的行反白
			w_dat(~(*(pic++)));								 //如果是选择的反白行就反显其数据
			else											 //否则就正常显示其数据
			w_dat(*(pic++));
		}
	}

	for(i=0;i<32;i++)
	{	
		w_ecom(0x80+i);			//扩充指令,设定绘图RAM垂直地址
		w_ecom(0x88);			//扩充指令,设定绘图RAM水平地址
		for(j=0;j<16;j++)
		{
		
			if((i>(16*(row-3))) && (i<((row-2)*16)) && row>2)		//用于判断LCD后32行的行反白
			w_dat(~(*(pic++)));										//如果是选择的反白行就反显其数据										 		
			else													//否则就正常显示其数据
			w_dat(*(pic++));
		}
	}
		
	w_com(0x36);										   
	flag=1;													   		//子菜单显示标志位	
}


void key()
{

	if((s3==0) || (s2==0) )
	{
		delay(10);
		if(s3==0)
		{
			temp++;
			if(temp>6)
			temp=0;
			while(!s3);	
		}

		else if(s2==0)
		{
			temp--;
			if(temp>6)
			temp=6;
			while(!s2);	
		}
	}
}

void keycut()
{
	if((s1==0) || (s0==0) )
	{
		delay(10);
		if(s1==0)
		{
			submune=1;
			if(sub && subflag)
			subflag1=1;

			while(!s1);	
		}
		
		if(submune==0)
		return;

		else if(s0==0) 
		{

			sub=0;
			submune=0;
			subflag1=0;
			submune1=1;

			if(sub1)
			{
				submune=1;
				sub1=0;
				sub=0;
				flag=1;
				subflag=0;
			}
			
			else 
			{
				flag=0;
				submune=0;
				subflag=0;
			}
			 
			
			
			while(!s0);
			
		}
		
		
	}


}

void key_submune()
{

	if((s3==0) || (s2==0))
	{
		delay(10);
		if(s3==0) 
		{
			submune1++;
			if(submune1>4)
			submune1=1;
			while(!s3);	
		}

		else if(s2==0) 
		{
			submune1--;
			if(submune1==0)
			submune1=4;
			while(!s2);	
		}
		subflag=0;
	}
}

void key_submune1()
{

	if((s3==0) || (s2==0))
	{
		delay(10);
		if(s3==0) 
		{
			submune2++;
			if(submune2>4)
			submune2=1;
			while(!s3);	
		}

		else if(s2==0) 
		{
			submune2--;
			if(submune2==0)
			submune2=4;
			while(!s2);	
		}
		subflag=0;
	}
}

/****************************************************************************
*	 num-->第一级菜单的标志位;*add-->第一级菜单的图片的地址入口			*
*	*sbuadd第二级菜单的图片的地址入口;*sbuadd1第三级菜单的图片的地址入口;	*
*****************************************************************************/
void menucut(uchar num,uchar *add,uchar *sbuadd,uchar *sbuadd1)	  
{
	while(num==temp)		  			//第一级菜单的标志位判断条件
	{
		draw_pic(add);		  			//画第一级菜单的图形界面

/*第一级菜单界面等待时的要支持第一级菜单的切换和第二级界面的进入和返回 */
		while((num==temp) && flag)		
		{
			key();						//第一级菜单界面的切换
			keycut();					//第二级界面的进入
			while((num==temp) && (submune==1)) //第二级菜单的标志位判断条件
			{
				draw_submune(sbuadd,submune1);	//画第二级菜单的图形界面
				subflag=1;						//画完第二级菜单的图形界面要置位进入可以进行界面切换的循环
/*第二级菜单界面等待时的要支持第二级菜单的切换和第三级界面的进入和返回 */
				while((num==temp) && (submune==1) && subflag)
				{
					sub=1;				 //第三级菜单的标志位用于区分其级数
					keycut();			 //第二级菜单界面的进入第三级菜单切换和返回第一级菜单
					key_submune();		 //第二级界面的进入
					while(subflag1 && sub)
					{
/*第三级菜单是一个二维数组所以在第二级进入第三级的时候要根据第二级的标志位选择进入第三级的的地址入口*/
						draw_submune(sbuadd1+((submune1-1)*1024),submune2);	  //画第三级菜单的图形界面
						subflag=1;
						sub1=1;		  //画完第三级菜单的图形界面要置位进入可以进行界面切换的循环
						while(subflag1 && sub && subflag)
						{
							 key_submune1();   //第三级界面的切换
							 keycut();		   //第三级界面的返回
						}		
					}
				}		
			}
		}
	}
}

#endif

作者: 心__空灵    时间: 2013-6-25 22:14
下载看看,很强大的样子
作者: dyun1988    时间: 2013-11-20 21:51
下载看看,很强大的样子
作者: abccb    时间: 2013-11-23 10:03
好像很强大
作者: abccb    时间: 2013-11-23 10:04
下一个看看
作者: abccb    时间: 2013-11-23 10:05
谢谢楼主的分享
作者: abccb    时间: 2013-11-23 10:05
真心的感谢楼主
作者: xiaokangkp    时间: 2013-11-26 00:06
谢谢楼主分享,学习一下
作者: zgmzgm    时间: 2013-12-18 12:09
非常不错,谢谢楼主,学习了
作者: yxz1140    时间: 2013-12-21 20:46
非常不错的东东。。。。
作者: xjlfh    时间: 2013-12-23 00:32
学习学习,谢谢啦。
作者: azhiarm9    时间: 2013-12-23 02:11
下载看看,很强大的样子
作者: daizhi1970    时间: 2014-2-1 20:59
O(∩_∩)O谢谢
作者: zhangxiaoljs    时间: 2014-3-6 20:35
谢谢学习了
作者: yhu168    时间: 2014-3-11 09:24
太强大了,学习了!
作者: zhou920017    时间: 2014-3-14 17:23
看看 感谢分享
作者: 小新灬    时间: 2014-3-26 10:53
强   人
作者: lvdianguang    时间: 2014-4-3 18:29
下载看看,谢谢分享。
作者: zenghl    时间: 2014-4-6 13:34
正需要,强顶!!!!
作者: 930417801    时间: 2014-4-17 21:41

努力学习中 
努力学习中 
作者: lyMarvin    时间: 2014-4-17 22:09
真是不错,很强大,学习了
作者: 稻草人‘mirror    时间: 2014-5-2 02:27
很不错,谢谢分享
作者: delux3344    时间: 2014-5-13 14:55

学习学习,谢谢啦。
作者: yy8881    时间: 2014-6-5 14:02
下载看看
作者: qzsulin    时间: 2014-8-7 09:30
不错,学习下,
作者: kpdz009    时间: 2014-8-10 06:57
好好好
作者: ladeng0303    时间: 2014-9-5 15:57
很不错,正好要用到!
作者: 周安松    时间: 2014-9-13 05:29
感谢楼主分享
作者: heam    时间: 2014-9-15 10:49
谢谢分享
作者: tjj163    时间: 2014-10-11 15:23
很强大的样子
作者: blj178    时间: 2014-10-20 20:42
下载来研究研究
作者: weichao4808335    时间: 2015-4-2 20:07
好资料!
作者: 小天爱小葱    时间: 2015-4-24 15:18
刚好需要,谢啦~
作者: 二十出头    时间: 2015-6-7 19:58
弄二级菜单两天了,实在是弄不出来了。参考下!
作者: jasone    时间: 2015-6-27 19:35
xugang 发表于 2013-6-20 23:42
**** 作者被禁止或删除 内容自动屏蔽 ****

赞两个

作者: 1678    时间: 2015-8-7 18:56
你们都自己喜欢写头文件啊
作者: engcyh    时间: 2015-8-7 19:08
支持,谢谢分享~~~~!
作者: hyq2012510    时间: 2015-8-31 19:45
好资料
作者: 邰夏留    时间: 2015-9-11 19:23
电路呢???????
作者: 北极光2015    时间: 2015-10-5 18:15
谢谢分享。正在学习多级菜单!
作者: ababzx2199    时间: 2015-10-22 10:35
好像很强大的样子
作者: xiao23123    时间: 2015-11-5 15:08
不知道这个图片是用什么软件处理的
作者: aj1139420688    时间: 2016-3-17 09:43
如果用串行口的lcd12864会更简单
作者: 398231290    时间: 2016-3-18 15:26
厉害,好厉害
作者: 7547163    时间: 2016-5-2 09:58
感谢分享,正要寻找呢
作者: guangyong_xia    时间: 2016-5-25 19:42
看起来不错,正要学习编写菜单,先收藏了,谢谢!
作者: guangyong_xia    时间: 2016-5-25 19:45
看起来不错,正要学习菜单,先收藏了,谢谢!
作者: join22life    时间: 2016-7-1 15:28
五个币希望能用            
作者: 状元郎    时间: 2016-7-1 23:52
新手,寻找,老司机带带我
作者: 状元郎    时间: 2016-7-1 23:53
感谢楼主怎么不能下载
作者: wojjh    时间: 2016-7-19 09:29
非常感谢楼主的分享,下载下来学习一下~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
作者: duan316    时间: 2016-7-19 11:18
学习了厉害
作者: fengqishi    时间: 2016-8-21 21:46
怎么在中断中调回显示程序啊


作者: cvi670    时间: 2016-8-22 14:20
干的漂亮楼主
作者: 曹世鹏    时间: 2016-9-21 16:37
一层层嵌套的。希望能够用结构体和指针来做。那样不会这么的繁琐。
作者: linnyshow    时间: 2016-11-5 13:59
没有黑币。可惜了。。。
作者: billtest36    时间: 2017-4-12 23:30
太好了 感謝分享  
作者: dawei1935    时间: 2017-4-24 19:19
谢谢楼主
作者: jamyg    时间: 2017-4-27 09:00
好资料,值得学习
作者: 1182687819    时间: 2017-9-30 20:09
切换了几个界面,液晶屏突然什么都不显示了;复位也不行,断电重启一下换了几个界面,又不行啦,是什么问题呀
作者: Huyssen    时间: 2017-10-5 17:10
正需要,很感谢楼主
作者: lq115116    时间: 2017-11-29 12:19
谢谢分享
作者: huajiata    时间: 2018-1-9 10:47
多谢分享
作者: j172756239    时间: 2018-4-10 10:20
牛逼!!很赞
作者: yulin3192    时间: 2018-4-17 13:31
谢谢楼主的分享
作者: 31415ydl    时间: 2018-6-23 19:53
支持楼主
作者: 31415ydl    时间: 2018-6-23 19:54
多谢分享
作者: zhsir    时间: 2018-7-26 11:00
功能强大,想法不错
作者: Longan.Wang    时间: 2018-8-7 08:34
参考一下,谢谢!
作者: guanzhongmou    时间: 2018-8-22 16:26
好资料~!
作者: luhuayiw    时间: 2018-10-15 09:41
学习了,多谢分享!
作者: hong19851024    时间: 2018-10-16 15:57
好资料
作者: Rorschach    时间: 2018-11-19 19:14
好啊,可惜黑币又没了
作者: c51stm32    时间: 2018-11-23 09:58
太强大了,学习了!
作者: EEEEELI    时间: 2018-11-23 21:55
受用,谢谢
作者: zeze10000    时间: 2018-12-7 00:07
菜单不错,学习一下
作者: gnez    时间: 2018-12-12 12:28
感谢分享!!!!!
作者: pianer    时间: 2018-12-20 23:53
为什么我烧到板子上什么都不显示呀

作者: doublecityggb    时间: 2018-12-27 08:48
很不错。
作者: 3290700544    时间: 2019-7-17 08:41
膜拜大神   好厉害    佩服
作者: tfq1    时间: 2019-11-3 15:37
我想问一下LCD12864主界面5秒后怎么显示其他界面
作者: 1481714970    时间: 2019-11-3 18:33
赞一个  很给力
作者: 西点钟灵毓秀    时间: 2019-11-3 20:06
下载在哪里?
作者: kaiyunliu    时间: 2020-5-14 16:13
感谢分享
作者: freemusic8    时间: 2024-8-27 12:35
下载来研究研究




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1