⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd多级菜单.txt

📁 C51源程序集合 包括以下目录源码 ├─AD-MSP430f149D ├─ADC8535 ├─bin ├─c51源程序 ├─c51源程序锦集 ├─ct2Timer ├─
💻 TXT
📖 第 1 页 / 共 4 页
字号:
用【 小 | 中 | 大 】字体浏览 
C51编程:高手们lcd多级菜单如何退回上一级? [JJKKMM] [69次] 01-11-16 上午 09:03:54

这是个很大很复杂的问题,三天三夜也讲不完。(和每人的编程方法有关系了) [《农民运动讲习所》现任所长] [26次] 01-11-16 上午 09:07:30 

怎么个复杂法,还请深圳农民指点一二 [JJKKMM] [26次] 01-11-16 上午 09:19:40 

太复杂了,三天三夜的东东不是一二能说的完的。 [《农民运动讲习所》现任所长] [26次] 01-11-16 上午 09:27:11 

有无例子程序,请道兄支持一下 [JJKKMM] [28次] 01-11-16 上午 09:37:36 
jjkkmm@163.com 

有例程你更看不懂。是从头到脚都不同,怎么看啊。 [《农民运动讲习所》现任所长] [25次] 01-11-16 上午 09:47:17 

看不懂只怪本人道行浅,还请让我试试 [JJKKMM] [24次] 01-11-16 上午 09:58:00 

到http://www.zhaoxu.net/去看看那里好象有一个你要的贴子... [perlme] [58次] 01-11-16 上午 10:10:46 

记住变量 [lezi] [46次] 01-11-16 上午 10:12:28 
每个菜单中应该有一个全局变量,记住该级菜单中的显示位置。再显示程序中应该和
这个变量相关。退回上一级时只用调用上一级的显示程序即可!


主菜单主程序, 子菜单子程序, 子子菜单子子程序. 退出子菜单也只是返回上一级程序, 同时返回一个要处理的任务, 每一级菜单用数组表示. [sinlaw] [35次] 01-11-16 上午 10:51:10 

感谢诸位道友非常实在,不象深圳农民比较虚! [JJKKMM] [24次] 01-11-16 上午 11:10:24 

记住上次的值 [光头] [26次] 01-11-16 上午 11:13:14 

呵呵,谁叫俺是个农民同志。 [《农民运动讲习所》现任所长] [26次] 01-11-16 上午 11:30:00 

小师? [唐朝] [90次] 01-11-16 上午 11:33:41 
你是吗? 

你太厉害了。 [《农民运动讲习所》现任所长] [29次] 01-11-16 下午 12:09:40 

你太厉害了。 [《农民运动讲习所》现任所长] [26次] 01-11-16 下午 12:09:43 

这里有一套有关多层菜单的C原程序发到你的信箱,希望能对你有所帮助。 [huxiangming] [52次] 01-11-16 下午 12:16:53 

我这样做,不知是否合适: [晓奇.] [69次] 01-11-16 下午 12:41:24 
设定一个菜单进入深度变量,一个菜单指针变量,根据这两个变量的值决定显示内容以及光
标定位。光标位置用(code型)数组定位。 

我用两个变量完成所有菜单处理 [阿亮] [63次] 01-11-16 下午 01:01:21 
小弟曾经这样写过:
  MENU变量表示当前菜单(用不同的值),PM变量表示是否第一次进入该菜单
在每级菜单中查询MENU变量,该变量变化则做退出或进入下级菜单处理。


给我发一分好吗?谢谢!958003683168@cmmail.com [球迷] [25次] 01-11-16 下午 01:41:14 

给我也发一封mail:lezi@163.net [lezi] [26次] 01-11-16 下午 01:45:01 

给我也发一封mail:zzl_st@163.net [cruelstone] [25次] 01-11-16 下午 02:04:07 

给我发一份好不好?谢谢!technic@czdiba.com [ZhanXun] [25次] 01-11-16 下午 02:28:54 

拣到宝啦!qqhy@sohu.com [ZHOUQING] [27次] 01-11-16 下午 02:51:23 

我是这样做的... [小陈同志] [66次] 01-11-16 下午 02:57:34 
菜单编程,我用的是一种称为“状态转移法”的方法,这种方法其实再很多关于编程技巧的
书里都有介绍,大概是这样子的:

1、定义全局变量保存当前的操作状态码、显示状态码、菜单选项位置等
2、依据键盘(或者别的输入设备)输入识别码散转到不同的sub分支程序
3、在各sub分支程序中根据当前的状态查表得下一状态码、显示状态码等变量得值并覆盖存
储,菜单显示做相应动作。
4、进入下一状态得处理...

编程之前通常需绘制“状态转移图”若干 

给我也发一封 AXINXU@163.COM 谢谢 [axinxu] [25次] 01-11-16 下午 03:54:14 

给我也发一封hqli1975@263.net [jackli] [23次] 01-11-16 下午 05:54:21 

太多人要,我只能分几次送上,另外声明,该程序是我收集的,具体地点人命忘记了,我们一起感谢他(她)吧 [huxiangming] [27次] 01-11-16 下午 10:28:44 

将每一个界面编一个号,并用变量记住它的相关情况,在界面进入下一个界面时,记住上一个界面号,返回时就可以找到了。 [晓雨] [26次] 01-11-16 下午 10:33:07 

程序1 [huxiangming] [89次] 01-11-16 下午 10:38:06 
#include<reg52.h> 
#include<absacc.h> 
#include<hz-string_t.c> 

#define INPUTSET256; 

#define DEBUG   0  //0:运行,1:调试 
#define ENABLE_INTERRUPT 1//1:中断允许,0:中断禁止 

//定义8155地址 
#define I8155A0x7000 
#define I8155B0x7200 
#definePA1 
#define PB2 
#define PC3 

//定义25045地址 
#define OUTNUMBER 0x01a1 
#define INNUMBER 0x01a2 
#define PASSWORD_ADDR 0x01a3 
#define HIDE_PASSWORD_ADDR 0x01af 

//定义键盘扫描码 
#defineBUTTON_START0x28 
#define BUTTON_STOP0x48 
#define BUTTON_SET0x84 
#define BUTTON_OK0x88 
#define BUTTON_SLAVE0x81 
//0,1,2,3,4,5,6,7,8,9 
unsigned char code keyscancode[]=
{0x82,0x11,0x12,0x14,0x21,0x22,0x24,0x41,0x42,0x44}; 

#include<x25045.h> 
#include<tm12864.h> 




//new var 
unsigned char bdata bitvar; 
sbit keypush=bitvar^0; 
sbit rrtime_flag=bitvar^1;//读取运行参数标志 
sbit showflag=bitvar^2; 


unsigned char keycode,tempkey,i,j; 
unsigned char menuitem=0x00; 
unsigned int runtime[32]; 


unsigned int xdata starttime[36]; 
unsigned int xdata stoptime[32]; 
unsigned int xdata betweentime[32]; 
unsigned char xdata runno1[36]; 
unsigned char xdata linkrun[4]; 
unsigned char xdata linkrunno1[4]; 

unsigned char xdata submenuitem=0; 
unsigned long xdata i8155out; 
unsigned char xdata main_temp,outputnumber,inputnumber; 
unsigned int xdata tempvar[9]; 
char xdata showstr[5]="    "; 
//new var end 


//定义DS12887地址 

#define P12887SEC        0x7f00//12887秒地址 
#define P12887SEC_ALM     0x7f01//12887秒报警地址 
#define P12887MIN      0x7f02//12887分地址 
#define P12887MIN_ALM     0x7f03//12887分报警地址 
#define P12887HOUR      0x7f04//12887时地址 
#define P12887HOUR_ALM    0x7f05//12887时报警地址 
#define P12887WEEK      0x7f06//12887星期地址 
#define P12887DAY      0x7f07//12887日期地址 
#define P12887MONTH      0x7f08//12887月地址 
#define P12887YEAR      0x7f09//12887年地址 
#define P12887MCA      0x7f0a//寄存器a地址 
#define P12887MCB      0x7f0b//寄存器a地址 
#define P12887MCC         0x7f0c//寄存器a地址 
#define P12887MCD         0x7f0d//寄存器a地址 
#define P12887RAM         0x7f0e//12887不掉电RAM起始地址 

void  init_12887();                   //DS12887初始化程序 
void  gettime_12887();                //取DS12887时间子程序(年月日时分) 
void  settime_12887();                //设置DS12887时间子程序 


void i8155_init(unsigned int memaddress,unsigned char command); 
//intel 8155 端口输出 
//memaddress:8155基址; 
//portnum:端口号(1:PA、2:PB、3:PC) 
//portstatu:端口输出字 
void i8155_outport(unsigned int memaddress,unsigned char portnum,unsigned char 
portstatu); 

//intel 8155 端口输入 
//memaddress:8155基址; 
//portnum:端口号(1:PA、2:PB、3:PC) 
//返回值:端口状态 
unsigned char i8155_inport(unsigned int memaddress,unsigned char portnum); 

void showinitscreen(); 
void init(); 

void timer0() interrupt 1 using 1 
{ 
unsigned char temp; 
//晶振为 11.0592MHZ 时计数 9216(0xdb00) 次为 10ms 
TH0=0xd8; 
TL0=0x00; 

temp=(XBYTE[0x7e00]&0x0f);//有键按下时 !=0x0f 
if(temp!=0x0f)//是否有键按下 
{ 
if(keypush==1) 
{ 
keycode=~temp; 
if((XBYTE[0x7ee0]&0x0f)!=0x0f) 
{ 
keycode=keycode&0x1f; 
} 
else if((XBYTE[0x7ed0]&0x0f)!=0x0f) 
{ 
keycode=keycode&0x2f; 
} 
else if((XBYTE[0x7eb0]&0x0f)!=0x0f) 
{ 
keycode=keycode&0x4f; 
} 
else if((XBYTE[0x7e30]&0x0f)!=0x0f) 
{ 
keycode=keycode&0x8f; 
} 

} 
else 
{ 
keypush=1; 
keycode=0; 
} 
} 
else 
{ 
keypush=0; 
} 
} 
void ds12887_int1() interrupt 2 using 2 
{ 
rrtime_flag=0; 
ACC=XBYTE[P12887MCC];           //读寄存器C 清除中断请求标志IRQF 
} 


//************************************************************** 
// 
//主程序 
// 
//************************************************************** 
void main() 
{ 

i8155out=0x00; 
x25045_disable(); 


outputnumber=x25045_readbyte(OUTNUMBER); 
for(i=0;i<outputnumber;i++) 
{ 
runtime=(int)0x00; 
runno1=0x00; 
starttime=x25045_readword(i*7); 
stoptime=x25045_readword(i*7+2); 
betweentime=x25045_readword(i*7+4); 
} 

x25045_init(); 
init(); 
TH0=0xd8; 
TL0=0x00; 


//初始化变量 

while(1) 
{ 
init_12887(); 
//*********************** 
#if DEBUG 
x25045_disable(); 
#else 
x25045_init(); 
#endif 
//*********************** 

TMOD=0x01; 
ET0=1; 
TR0=1; 
#if ENABLE_INTERRUPT 
EX1=1; 
PX1=1; 
PT0=0; 
#endif 
EA=1; 

//********************************** 
//加入限时运行功能 
if((x25045_readbyte(0x01bb)==1)&&(menuitem!=0x20)&&(menuitem!=0x1b)) 
{ 
tempkey=0; 
gettime_12887(); 
for(i=0;i<3;i++) 
{ 
if(tempvar<=x25045_readbyte(0x01b5-3+i)) 
{ 
tempkey++; 
} 
else 
{ 
break; 
} 
} 
if(tempkey<3) 
{ 
if(menuitem!=0x20) 
{ 
showflag=0; 
} 
menuitem=0x20; 

} 
else 
{ 
menuitem=0; 
} 
tempkey=0x50; 
i=0; 
} 

//********************************** 

//主循环开始 
tm12864_reset(); 
x25045_resetwatchdog(); 
//键盘处理程序 

   if((keycode!=0)&&(keypush==0)) 
   { 
   i=0; 
   while(i<10) 
   { 
   if(keycode==keyscancode) 
   { 
   tempkey=i; 
   break; 
   } 
   else 
   { 
   tempkey=keycode; 
   } 
   i++; 
   } 
   } 
   else 
   { 
   tempkey=0x50; 
   } 
   keycode=0; 

   //屏幕显示处理 
   switch(menuitem) 
   { 
   case 0x00://自动运行状态 
   tm12864_reset(); 
   if(showflag==0) 
   { 
tm12864_fillscreen(0x00); 
showflag=1; 

} 
showinitscreen(); 
tm12864_writestr(0,0,"    ",0); 
tm12864_writestr(12,0,"    ",0); 
tm12864_writestr(0,4,"                ",0); 
tm12864_writestr(0,6,"    ",0); 
tm12864_writehz(4,6,zzyx,0); 
tm12864_writestr(12,6,"    ",0); 

if(tempkey==BUTTON_STOP)//进入“设置确认”菜单 
{ 
j=0; 
menuitem=0x01; 
showflag=0; 
} 
       tempkey=0x50; 
   break; 
   case 0x01://设置确认菜单 
   tm12864_reset(); 
   if(showflag==0) 
   { 
tm12864_fillscreen(0x00); 
tm12864_writestr(4,6,"      ",1); 
tm12864_writehz(0,6,mm,0); 
showflag=1; 
} 
showinitscreen(); 


if((j<6)&&(tempkey<0x0a)) 
{ 
tm12864_writehz(0,6,mm,0); 
tm12864_writestr((j+4),6,"*",1); 
tempvar[j]=tempkey; 
j++; 
} 
if(j==6) 
{ 
for(j=0;j<6;j++) 
{ 
if(tempvar[j]!=x25045_readbyte(PASSWORD_ADDR+j)) 
{ 
j=0; 
showflag=0; 
menuitem=0x00; 
break; 
} 
} 
tm12864_writestr(0,6,"  ",0); 
tm12864_writestr(6,6,"    ",0); 
tm12864_writehz(2,6,set,1); 
tm12864_writehz(10,6,yunxing,0); 
if(tempkey==BUTTON_OK) 
{ 
       menuitem=0x03; 
       j=0; 
       submenuitem=0; 
       showflag=0; 
       tempvar[0]=1; 
       } 
       } 
submenuitem=0; 

       if(tempkey==BUTTON_START) 
       { 
       menuitem=0x00; 
       showflag=0; 
       } 

       tempkey=0x50; 
break; 
   case 0x02://运行确认菜单 
   tm12864_reset(); 
   if(showflag==0) 
   { 
tm12864_fillscreen(0x00); 
showflag=1; 
} 
showinitscreen(); 
   switch(submenuitem) 
   { 
   case 0x00: 
tm12864_writehz(2,6,set,0); 
tm12864_writehz(10,6,yunxing,1); 
switch(tempkey) 
{ 
case BUTTON_OK: 
   menuitem=0x00; 
   showflag=0; 
   while(1){}; 
   break; 
   case BUTTON_STOP: 
   case BUTTON_SLAVE: 
   submenuitem=0x01; 
   showflag=0; 
   break; 
   } 
break; 
case 0x01: 
tm12864_writehz(2,6,set,1); 
tm12864_writehz(10,6,yunxing,0); 
switch(tempkey) 
{ 
case BUTTON_OK: 
   menuitem=0x03; 
   showflag=0; 
   submenuitem=0x00; 
   break; 
   case BUTTON_START: 
   case BUTTON_SLAVE: 
   submenuitem=0; 
   showflag=0; 
   break; 
   } 
break; 
} 
       tempkey=0x50; 
   break; 
   case 0x03://设置菜单 
   tm12864_reset(); 
   if(showflag==0) 
   { 
tm12864_fillscreen(0x00); 
showflag=1; 
j=0; 
} 
   x25045_writestatu(0x00);  

原程序2 [huxiangming] [68次] 01-11-16 下午 10:39:14 


       // ******************************************************* 
       //加入隐蔽菜单功能 

if((j<6)&&(tempkey<0x0a)) 
{ 
tempvar[j]=tempkey; 
j++; 
showstr[0]=j+0x30; 
showstr[1]='\0'; 
tm12864_writestr(15,7,showstr,0); 
tempkey=0x50; 
} 

       if(j==6) 
{ 
for(j=0;j<6;j++) 
{ 
#if DEBUG 
tempvar[j]=x25045_readbyte(0x01a9+j); 
#else 
if(tempvar[j]!=x25045_readbyte(0x01a9+j)) 
{ 
j=0; 
break; 
} 
#endif 
} 
if(tempkey==BUTTON_SET) 
{ 
       menuitem=0x1b; 
       j=0; 
       submenuitem=0; 
       showflag=0; 
       tempvar[0]=1; 
       } 
       } 
       // ******************************************************* 
   switch(submenuitem) 
   { 
   case 0x00: 
   tm12864_writestr(0,0,"1 ",1); 
   tm12864_writehz(2,0,scsd,1); 
   tm12864_writestr(0,2,"2 ",0); 
   tm12864_writehz(2,2,srsd,0); 
   tm12864_writestr(0,4,"3 ",0); 
   tm12864_writehz(2,4,lssd,0); 
   tm12864_writestr(0,6,"4 ",0); 
   tm12864_writehz(2,6,xtcs,0); 

   break; 
   case 0x01: 
   tm12864_writestr(0,0,"1 ",0); 
   tm12864_writehz(2,0,scsd,0); 
   tm12864_writestr(0,2,"2 ",1); 
   tm12864_writehz(2,2,srsd,1); 
   tm12864_writestr(0,4,"3 ",0); 
   tm12864_writehz(2,4,lssd,0); 
   tm12864_writestr(0,6,"4 ",0); 
   tm12864_writehz(2,6,xtcs,0); 
   break; 
   case 0x02: 
   tm12864_writestr(0,0,"1 ",0); 
   tm12864_writehz(2,0,scsd,0); 
   tm12864_writestr(0,2,"2 ",0); 
   tm12864_writehz(2,2,srsd,0); 
   tm12864_writestr(0,4,"3 ",1); 
   tm12864_writehz(2,4,lssd,1); 
   tm12864_writestr(0,6,"4 ",0); 
   tm12864_writehz(2,6,xtcs,0); 
   break; 
   case 0x03: 
   tm12864_writestr(0,0,"1 ",0); 
   tm12864_writehz(2,0,scsd,0); 
   tm12864_writestr(0,2,"2 ",0); 
   tm12864_writehz(2,2,srsd,0); 
   tm12864_writestr(0,4,"3 ",0); 
   tm12864_writehz(2,4,lssd,0); 
   tm12864_writestr(0,6,"4 ",1); 
   tm12864_writehz(2,6,xtcs,1); 
   break; 

   } 
   switch(tempkey) 
   { 
   case BUTTON_START: 
   menuitem=0x02; 
   submenuitem=0; 
   showflag=0; 
   break; 

   case BUTTON_SLAVE: 
   if(submenuitem<0x03) 
   { 
   submenuitem++; 
   } 
   else 
   { 
   submenuitem=0x00; 
   } 
   break; 
   case BUTTON_OK: 
   menuitem=0x04+submenuitem; 
   //如果密码与隐蔽选单密码相符则进入隐蔽选单 
   /* 
   if(check_password(HIDEMENU)) 
   { 
   menuitem=0x20; 
   }*/ 
   submenuitem=0x00; 
   tempvar[0]=0x00; 
   showflag=0; 
   break; 
   } 
   tempkey=0x50; 
   break; 

   case 0x04://输出设定菜单 
   tm12864_reset(); 
   if(showflag==0) 
   { 
tm12864_fillscreen(0x00); 

showflag=1; 
} 
tm12864_writehz(0,0,xzhlh,0); 
tm12864_writestr(10,0,"  ",0); 
tm12864_writehz(14,0,hao,0); 
tm12864_writehz(0,2,gz,0); 
tm12864_writehz(10,2,fen,0); 
tm12864_writehz(14,2,miao,0); 
tm12864_writehz(0,4,tz,0); 
tm12864_writehz(14,4,miao,0); 
tm12864_writehz(0,6,jg,0);//汉字“间隔”尚未建立 
tm12864_writehz(14,6,miao,0); 

if(submenuitem!=7) 
{ 
tm12864_writehz(10,4,fen,0); 
tm12864_writehz(10,6,fen,0); 

} 

switch(tempkey) 
{ 
case BUTTON_SLAVE: 
if(submenuitem<7) 
{ 
submenuitem++; 
} 
else 
{ 
showflag=0; 
submenuitem=0; 
tempvar[0]=0; 
} 
if((tempvar[0]>32)||(tempvar[0]==0)) 
{ 
submenuitem=0; 
tempvar[0]=0; 
} 
else if(tempvar[2]>59) 
{ 
submenuitem=2; 
tempvar[2]=0; 
} 
else if(tempvar[4]>59) 
{ 
submenuitem=4; 
tempvar[4]=0; 
} 
else if(tempvar[6]>59) 
{ 
submenuitem=6; 
tempvar[6]=0; 
} 
j=0; 
break; 
case BUTTON_STOP: 
submenuitem=0x00; 
menuitem=0x03; 
showflag=0; 
tempvar[0]=0; 
j=0; 
break; 
} 

switch(submenuitem) 
{ 
case 0://获取回路号 
if((j<2)&&(tempkey<0x0a)) 
{ 
tempvar[0]=tempvar[0]*0x0a+tempkey; 
j++; 
} 

showstr[0]=(tempvar[0]/0x0a+0x30); 
showstr[1]=(tempvar[0]%0x0a+0x30); 
showstr[2]='\0'; 
tm12864_writestr(12,0,showstr,1); 
break; 
case 1://获取工作时间-分 
showstr[0]=(tempvar[0]/0x0a+0x30); 
showstr[1]=(tempvar[0]%0x0a+0x30); 
showstr[2]='\0'; 
tm12864_writestr(12,0,showstr,0); 
if(j==0) 
{ 
if(tempvar[0]!=0) 
{ 
tempvar[1]=x25045_readword((tempvar[0]*7-7)); 
tempvar[2]=tempvar[1]%60; 
tempvar[1]=tempvar[1]/60; 
tempvar[3]=x25045_readword((tempvar[0]*7-5)); 
tempvar[4]=tempvar[3]%60; 
tempvar[3]=tempvar[3]/60; 
tempvar[5]=x25045_readword((tempvar[0]*7-3)); 
tempvar[6]=tempvar[5]%60; 
tempvar[5]=tempvar[5]/60; 
showstr[0]=(tempvar[2]/10+0x30); 
showstr[1]=(tempvar[2]%10+0x30); 
showstr[2]='\0'; 
tm12864_writestr(12,2,showstr,0); 
showstr[0]=(tempvar[3]/1000+0x30); 
showstr[1]=((tempvar[3]%1000)/100+0x30); 
showstr[2]=((tempvar[3]%100)/10+0x30); 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -