📄 lcd多级菜单.txt
字号:
用【 小 | 中 | 大 】字体浏览
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 + -