|
完整源码下载:
caidan12864 .zip
(207.75 KB, 下载次数: 349)
单片机主程序预览:
- /**************************************************************
- * +---------------------------------------------------+ *
- * 12864三级菜单显示 *
- * +---------------------------------------------------+ *
- * *
- * 此源码版权属 小牛 全权享有,如欲引用,敬请署名并告知 *
- * 严禁随意用于商业目的,违者必究,后果自负 *
- * *
- * 运行环境: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]);
- }
- }
复制代码- 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
复制代码
|
评分
-
查看全部评分
|