国庆大餐之,LCD1602的菜单生成和显示方法。
#include <LCDv3.h>#include "Config.h"
#include "Menu.h"
#include "LCD_Interface.c"
#include "Input.c"
#define MENU_LINE 2
unsigned char MenuNo(unsigned char No)
{
if ((No>=0)&&(No<=9))
{
return No+'0';
}
else if ((No>=10)&&(No<=36))
{
return No-10+'A';
}
else
{
return '?';
}
}
void ChooseRadioMenu(unsigned char ParamCaptionID,unsigned char MenuDefineID,unsigned char *Value)
{
flash unsigned char *Caption;
flash unsigned char *pDefine;
unsigned char Key;
unsigned char Pos;
unsigned int TopMenuItem;
unsigned int CurrentMenuItem;
//unsigned char i;
unsigned char MenuCount;
delay_ms(10);
SOUND_STOP;
LCD_WriteCaption(ParamCaptionID,0);
Pos=LCD_Position()-1;
WriteCGRAM(0x82,1,0);
WriteCGRAM(0x83,2,0);
WriteCGRAM(0x84,3,0);
pDefine=SubMenuDefine+(unsigned int)2*(unsigned int)MenuDefineID;
MenuCount=pDefine;
TopMenuItem=pDefine;
CurrentMenuItem=*Value;
if (CurrentMenuItem>MenuCount-1)
{
CurrentMenuItem=MenuCount-1;
}
Key=1;
while (Key!=BT_APPLY)
{
if (Key!=0)
{
LCD_Ctrl(LCD_SET_DDRAM|Pos);
Caption=Menu+(CAPTION_LENGTH+2)*(TopMenuItem+CurrentMenuItem-1);
if (CurrentMenuItem==0)
{
LCD_Write(3);
}
else if (CurrentMenuItem==MenuCount-1)
{
LCD_Write(1);
}
else
{
LCD_Write(2);
}
//LCD_Write(MenuNo(CurrentMenuItem));
LCD_Write(' ');
LCD_Write('=');
LCD_PutStrF(Caption);
}
Key=GetKey();
if (Key!=0)
{
if (Key==BT_UP)
{
if (CurrentMenuItem>0)
{
CurrentMenuItem--;
}
}
else if (Key==BT_DOWN)
{
if (CurrentMenuItem<MenuCount-1)
{
CurrentMenuItem++;
}
}
else if (Key==BT_APPLY)
{
*Value=CurrentMenuItem;
}
else if (Key==BT_LEFT)
{
Key=BT_APPLY;
}
delay_ms(10);
SOUND_STOP;//Sound Stop
}
}
}
void ShowMenu(void)
{
flash unsigned char *pMenu;
flash unsigned char *pDefine;
flash unsigned char *Caption;
unsigned char Key;
unsigned int TopMenuItem;
unsigned int CurrentMenuItem;
unsigned char i;
unsigned char Stack;
unsigned char StackIndex;
unsigned char DrawMenuItem={LCD_SET_DDRAM,0xC0,1,0,0,1};
unsigned char MenuCount;
unsigned char j;
//unsigned char MenuItem;
pMenu=Menu;
pDefine=SubMenuDefine;
TopMenuItem=0;
CurrentMenuItem=0;
//MenuItem=0;
Key=1;
WriteCGRAM(0x80,0,0);
WriteCGRAM(0x81,1,0);
StackIndex=0;
Stack=0;
Stack=0;
Stack=0;
MenuCount=SubMenuDefine;
while (1)
{
if (Key!=0)
{
for (j=0;j<2;j++)
{
LCD_Ctrl(DrawMenuItem);
if (DrawMenuItem[(unsigned char)(j+4)]<MenuCount)
{
Caption=Menu+(CAPTION_LENGTH+2)*(TopMenuItem+DrawMenuItem[(unsigned char)(j+4)]);
if (DrawMenuItem[(unsigned char)(j+2)])
{
LCD_PutStrF(" ");
LCD_Write(0);
LCD_Write(MenuNo(DrawMenuItem[(unsigned char)(j+4)]+1));
LCD_Write('.');
LCD_PutStrF(Caption);
}
else
{
LCD_PutStrF(" ");
LCD_Write(MenuNo(DrawMenuItem[(unsigned char)(j+4)]+1));
LCD_Write('.');
LCD_PutStrF(Caption);
}
}
else
{
for (i=0;i<16;i++) LCD_Write(' ');
}
}
}
Key=GetKey();
if (Key!=0)
{
if (Key==BT_UP)
{
if (DrawMenuItem)
{
DrawMenuItem=1;
DrawMenuItem=0;
}
else if (DrawMenuItem>0)
{
DrawMenuItem--;
DrawMenuItem--;
}
}
else if (Key==BT_DOWN)
{
if (DrawMenuItem)
{
DrawMenuItem=0;
DrawMenuItem=1;
}
else if (DrawMenuItem<MenuCount-1)
{
DrawMenuItem++;
DrawMenuItem++;
}
}
else if ((Key==BT_APPLY)||(Key==BT_RIGHT))
{
if (DrawMenuItem)
{
CurrentMenuItem=TopMenuItem+DrawMenuItem;
}
else
{
CurrentMenuItem=TopMenuItem+DrawMenuItem;
}
if (CurrentMenuItem<MENU_COUNT)
{
pMenu=Menu+(CAPTION_LENGTH+2)*CurrentMenuItem+CAPTION_LENGTH+1;
if (*pMenu>MENU_SUBITEM)
{
Stack=pDefine-SubMenuDefine;
Stack=DrawMenuItem;
Stack=DrawMenuItem;
StackIndex++;
pDefine=SubMenuDefine+(unsigned int)(*pMenu-MENU_SUBITEM)*2;
TopMenuItem=*pDefine -1;
MenuCount=pDefine;
DrawMenuItem=1;
DrawMenuItem=0;
DrawMenuItem=0;
DrawMenuItem=1;
}
else if (*pMenu<=MENU_SUBITEM)
{
ExecuteMenu(CurrentMenuItem+1);
}
}
}
else if (Key==BT_LEFT)
{
if (StackIndex>0)
{
StackIndex--;
pDefine=SubMenuDefine+(unsigned int)(Stack);
TopMenuItem=*pDefine -1;
MenuCount=pDefine;
DrawMenuItem=Stack;
DrawMenuItem=1-Stack;
DrawMenuItem=Stack;
DrawMenuItem=Stack+1;
}
}
delay_ms(10);
SOUND_STOP;//Sound Stop
}
}
}
AVR源程序(CVAVR 1.24.8)
生成AVR菜单的工具
http://cache.amobbs.com/bbs_upload782111/files_6/armok01130437.jpg 果然是大餐! 这。。。。加裤也太快了。。。。。^o^
发贴相差才1分钟左右。。。。。哈哈哈。。 很好的生成工具 来点图片吧. 能不能说说原理,及其用法 用单色点阵液晶和单片机都会碰这样的问题,呵呵
我2001年在一家公司做的时候,那东西全汇编的,恐怖的代码量,我第一件事就是做一个生成菜单结构的工具,跟楼主的差不多,加一些显示函数,不过不久我就走了,不知道他们后来用不用
后来用C还写过一个架构,底层是API,核心是一个定时器和函数表,做成事件驱动的几层结构,中间是硬件定义和显示控件,最后就差写一个IDE集成开发环境和模拟显示了
到现在我接触的东西,还是涉及架构问题,架构做好能让开发尽量专注于应用逻辑,否则麻烦死了 就是啦,能不能说说原理,及其用法 学习中 标题应该是给我起错了,但我实在不知道应该起什么名字好.
实际的情况如下:
项目名称:频率发生器 v2.0
项目简介:通过LCD上的菜单,实时设置Mega8的三个定时器的各个寄存器,这样,
就可以通过显波器来监视Mega8的定时器的各个寄存器相互作用.
比如:Mega8的T1定时器,是最难懂的也是比较复杂的定时器之一,而我们可以通过
这个项目,了解到T1定时器所需的各个寄存器的相互作用.
又比如:Mega8的 COM1A/B与WGM1之间的作用,通过这个实时设置,就可以实时的通过示波器
看到.
这个项目没有任何按键,所有的用户交互都是通过电视遥控器和红外接收头来完成的. 本项目中的IRv2原程序,看这里:
http://www.ouravr.com.cn/bbs/bbs_content.jsp?bbs_sn=673341&bbs_page_no=1&bbs_id=1000 谢谢分享 to 10楼:联接打不开!!! 谢谢分享 "大餐" 就是啦,能不能说说原理,及其用法 看得眼花 对啊,能不能上个图片看看,谢谢! 有图片才完美!!!支持图片!!! 好 我的菜单部分代码
用最笨拙的判断语句实现
//************************************************************************************
//函数名称:SIGNAL(SIG_INTERRUPT7)
//函数功能:键盘上有键被按下时触发该中断
//入口参数:无
//出口参数:无
//附注:
//************************************************************************************
void disp_layer_1()
{
unsigned char i;
unsigned char manu1[]="电压设置";
unsigned char manu2[]="角度变比设置";
unsigned char manu3[]="起始位置设置";
unsigned char manu4[]="状态查看";
unsigned char manu5={{0xa2,0xb1},{0xa2,0xb2},{0xa2,0xb3},{0xa2,0xb4}};
write_command(clr_screen);
delay_ms(10);
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<2;i++)
write_data(manu5);
write_command(0x81);
for(i=0;i<8;i++)
write_data(manu1);
write_command(0x90);
for(i=0;i<2;i++)
write_data(manu5);
write_command(0x91);
for(i=0;i<12;i++)
write_data(manu2);
write_command(0x88);
for(i=0;i<2;i++)
write_data(manu5);
write_command(0x89);
for(i=0;i<12;i++)
write_data(manu3);
write_command(0x98);
for(i=0;i<2;i++)
write_data(manu5);
write_command(0x99);
for(i=0;i<8;i++)
write_data(manu4);
write_command(0x80);
write_command(AC_highlight);
}
void disp_standby()
{
unsigned char i;
unsigned char manu2={0xA3,0xAE};
write_command(clr_screen);
delay_ms(10);
write_command(0x92);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(manu2);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(AC_highlight_off);
}
void disp_voltage_setup(int shi_kuang_ge_shu)
{
unsigned char i,j;
unsigned char manu1[]="电压幅度";
// - + 实框 虚框
unsigned char manu2={{0xA3,0xAD},{0xA3,0xAB},{0xA1,0xF6},{0xA1,0xF5}};
write_command(clr_screen);
delay_ms(10);
write_command(0x82);
for(i=0;i<8;i++)
write_data(manu1);
write_command(0x90);
for(i=0;i<2;i++)
write_data(manu2);
write_command(0x97);
for(i=0;i<2;i++)
write_data(manu2);
write_command(0x91);
for(j=0;j<(shi_kuang_ge_shu);j++)
for(i=0;i<2;i++)
write_data(manu2);
write_command(0x91+shi_kuang_ge_shu);
for(j=0;j<(6-shi_kuang_ge_shu);j++)
for(i=0;i<2;i++)
write_data(manu2);
write_command(0x8b);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(AC_highlight_off);
}
void disp_ratio_warning()
{
unsigned char i;
unsigned char manu1[]="提示:设置之前请";
unsigned char manu2[]="先确认罗盘已变换";
unsigned char manu3[]="是否继续操作?";
unsigned char manu4[]=" 是否 ";
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<16;i++)
write_data(manu1);
write_command(0x90);
for(i=0;i<16;i++)
write_data(manu2);
write_command(0x88);
for(i=0;i<16;i++)
write_data(manu3);
write_command(0x98);
for(i=0;i<16;i++)
write_data(manu4);
write_command(0x9b);
write_command(AC_highlight);
}
void disp_ratio_setup()
{
unsigned char i;
unsigned char manu1={0xa2,0xb1,0x20,0x20,0xa3,0xb1,0xa3,0xba,0xa3,0xb3,0xa3,0xb6,0xa3,0xb0};
unsigned char manu2={0xa2,0xb2,0x20,0x20,0xa3,0xb1,0xa3,0xba,0xa3,0xb1,0xa3,0xb8,0xa3,0xb0};
unsigned char manu3={0xa2,0xb3,0x20,0x20,0xa3,0xb1,0xa3,0xba,0xa3,0xb9,0xa3,0xb0,0x20,0x20};
unsigned char manu4={0xa2,0xb4,0x20,0x20,0xa3,0xb1,0xa3,0xba,0xa3,0xb6,0xa3,0xb0,0x20,0x20};
unsigned char manu5={0xA1,0xCC};
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<14;i++)
write_data(manu1);
write_command(0x90);
for(i=0;i<14;i++)
write_data(manu2);
write_command(0x88);
for(i=0;i<14;i++)
write_data(manu3);
write_command(0x98);
for(i=0;i<14;i++)
write_data(manu4);
switch(ratio)
{
case 360:
{
write_command(0x87);
for(i=0;i<2;i++)
write_data(manu5);
}; break;
case 180:
{
write_command(0x97);
for(i=0;i<2;i++)
write_data(manu5);
}; break;
case 90:
{
write_command(0x8f);
for(i=0;i<2;i++)
write_data(manu5);
}; break;
case 60:
{
write_command(0x9f);
for(i=0;i<2;i++)
write_data(manu5);
}; break;
default:;
}
write_command(0x80);
write_command(AC_highlight);
}
void disp_position_warning()
{
unsigned char i;
unsigned char manu1[]=" 提示 ";
unsigned char manu2[]="更改此项有风险";
unsigned char manu3[]="是否继续操作?";
unsigned char manu4[]=" 是否 ";
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<16;i++)
write_data(manu1);
write_command(0x90);
for(i=0;i<16;i++)
write_data(manu2);
write_command(0x88);
for(i=0;i<16;i++)
write_data(manu3);
write_command(0x98);
for(i=0;i<16;i++)
write_data(manu4);
write_command(0x9b);
write_command(AC_highlight);
}
void disp_position_setup()
{
unsigned char i;
unsigned char character1[]="初始位置修改";
cli();
eeprom_add_0=EEPROM_read(0x0000);
eeprom_add_1=EEPROM_read(0x0001);
eeprom_add_2=EEPROM_read(0x0002);
eeprom_add_3=EEPROM_read(0x0003);
bai_wei=eeprom_add_0;
shi_wei=eeprom_add_1;
ge_wei=eeprom_add_2;
shifen_wei=eeprom_add_3;
write_command(clr_screen);
delay_ms(10);
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<12;i++)
write_data(character1);
write_command(0x8a);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8a);
write_command(AC_highlight);
sei();
}
void disp_status()
{
{
unsigned char i;
unsigned char manu1[]="角度变比";
unsigned char manu2[]="电压幅度";
unsigned char manu3={ {0xa3,0xb1,0xa3,0xba,0xa3,0xb3,0xa3,0xb6,0xa3,0xb0},
{0xa3,0xb1,0xa3,0xba,0xa3,0xb1,0xa3,0xb8,0xa3,0xb0},
{0xa3,0xb1,0xa3,0xba,0xa3,0xb9,0xa3,0xb0,0x20,0x20},
{0xa3,0xb1,0xa3,0xba,0xa3,0xb6,0xa3,0xb0,0x20,0x20}};
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<8;i++)
write_data(manu1);
write_command(0x88);
for(i=0;i<8;i++)
write_data(manu2);
switch(ratio)
{
case 360:
{
write_command(0x92);
for(i=0;i<10;i++)
write_data(manu3);
} ; break;
case 180:
{
write_command(0x92);
for(i=0;i<10;i++)
write_data(manu3);
} ; break;
case 90:
{
write_command(0x92);
for(i=0;i<10;i++)
write_data(manu3);
} ; break;
case 60:
{
write_command(0x92);
for(i=0;i<10;i++)
write_data(manu3);
} ; break;
default: ;
}
write_command(0x9c);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(AC_highlight_off);
}
}
SIGNAL(SIG_INTERRUPT7)
{
unsigned char a,b,key,i;
a=TIMSK; //保存定时器中断屏蔽寄存器的状态值
TIMSK&=~(1<<TOIE1); //不管先前定时器溢出是否允许,到要将其禁止。程序中有溢出中断,若溢出标志位置位
//程序将会去等待该按键中断结束(溢出中断的优先级别比外部中断7低)再去实行溢出中断
//实际上保存此定时器中断屏蔽寄存器的状态值无太多意义,暂时先这样写着
//测试是否是键盘误抖动
delay_ms(10);
if(!(PIND&0x80)) //软件延时10ms还有键按下
{
//开始键盘扫描
DDRD|=(1<<DDD7); //改变口D的第7位的方向为输出低
PORTD&=~(1<<PORTD7);
DDRF=0x00; //F口输入上拉
PORTF=0x00;
delay_us(10); //软件延时
b=PINF; //读断口F的电平值
b|=0xc0; //屏蔽掉不用的高两位
if(b==0xFE)
key=1; //向上键
if(b==0xFD)
key=2; //向左键
if(b==0xFB)
key=3; //向右键
if(b==0xF7)
key=4; //向下键
if(b==0xEF)
key=5; //菜单键
if(b==0xDF)
key=6; //确定键
keyboard_init(); //将各口的输入输出情况翻转过来
while(!(PIND&0x80)); //等待键释放
/* if(press_num==1) //第一次有键被按下,则必须是菜单键才会有响应
{
if(key==5)
{
write_command(clr_screen);
delay_ms(10);
write_command(0x80);
for(i=0;i<10;i++)
write_data(manu1);
write_command(0x90);
for(i=0;i<14;i++)
write_data(manu2);
write_command(0x88);
for(i=0;i<14;i++)
write_data(manu3);
write_command(0x98);
for(i=0;i<6;i++)
write_data(manu4);
write_command(0x90);
write_command(AC_highlight);
}
}
} */
//第一次有键被按下,则必须是菜单键才会有响应,显示的是第一层画面,也就是
// 1.电压设置 +
// 2.角变比
// 3.起始位置
// 4.状态查看
/*11111111************************************************************************************************************/
if(press_num==1)
{
if(key==MENU)
{
disp_layer_1(); //刷新显示第一层界面
layer=1;where=0; //层标记为1,选中行标记为0
press_num=2;
}
}
/*22222222************************************************************************************************************/
//再有键被按下,响应的键有UP DOWNMENU ENTER。LEFT和RIGHT不被响应,这里的响应是指界面不会被刷新
else if(press_num==2)
{
if(key==MENU) //如果是MENU,则返回待机画面。层标记为0,press_num标记复位为1
{
disp_standby(); //返回待机画面
press_num=1;
layer=0;
}
else if(key==ENTER) //是ENTER,先判断where的值,再确定要跳入的下一个界面,最后层标记为2,选中行标记为0
{
if(where==0)
disp_voltage_setup(module-2); //显示“1.电压设置”的子菜单
else if(where==1)
disp_ratio_warning(); //显示“2.角度变比设置”的子菜单“提示:修改此项之前请先确认罗盘是否变化 是否继续操作 是 否”
else if(where==2)
disp_position_warning(); //显示“3.初始位置设置”的子菜单
else if(where==3)
disp_status(); //显示“4.状态查看”的内容
else
;
press_num=3;
layer=2;
where_0_next=0;
where_1_next=0; //层标记为2,下一子菜单的位置标记默认为0
where_2_next=0;
}
else if(key==UP) //是UP,先判断显白的位置也就是where的值,如果where==0则where=3,否则where-=1;然后再依据where的值去刷新显白的位置
{
if(where==0)
where=3;
else
where-=1;
write_command(clr_address); //复位lcm的ac值
if(where==0) //在第一行位置处显白
{
write_command(0x80);
write_command(AC_highlight);
}
else if(where==1) //在第二行位置处显白
{
write_command(0x90);
write_command(AC_highlight);
}
else if(where==2) //在第三行位置处显白
{
write_command(0x88);
write_command(AC_highlight);
}
else //在第四行位置处显白
{
write_command(0x98);
write_command(AC_highlight);
}
}
else if(key==DOWN) //是DOWN,先判断显白的位置也就是where的值,如果where==3则where=0,否则where+=1;然后再依据where的值去刷新显白的位置
{
if(where==3)
where=0;
else
where+=1;
write_command(clr_address); //复位lcm的ac值
if(where==0) //在第一行位置处显白
{
write_command(0x80);
write_command(AC_highlight);
}
else if(where==1) //在第二行位置处显白
{
write_command(0x90);
write_command(AC_highlight);
}
else if(where==2) //在第三行位置处显白
{
write_command(0x88);
write_command(AC_highlight);
}
else //在第四行位置处显白
{
write_command(0x98);
write_command(AC_highlight);
}
}
else //其余,什么也不做
;
}
/*3333333************************************************************************************************************/
//再有键被按下,当where=3时响应的键有 MENU ENTER。LEFT和RIGHT不被响应,这里的响应是指界面不会被刷新
//当where=0,1,2时,响应的键有MENU ENTER LEFT和RIGHT.
else if(press_num==3)
{
//电压设置的子菜单,也就是显示
// 1.30v
// 2.50v
// 3.70v
// 4.90v
if(where==0)
{
if(key==MENU) //如果是MENU,则返回待机画面。层标记为0,press_num标记复位为1
{
disp_standby(); //返回待机画面
press_num=1;
layer=0;
}
else if(key==ENTER) //如果是ENTER,则先判断where_next的值然后再进行响应的处理
{
if(where_0_next==0) //30v
module=3; //改变调制度
else if(where_0_next==1)
module=4;
else if(where_0_next==2)
module=5;
else if(where_0_next==3)
module=6;
else if(where_0_next==4)
module=7;
else if(where_0_next==5)
module=8;
else //故障恢复调制度为4
module=4;
//修改完毕返回待机画面
disp_standby(); //返回待机画面
press_num=1;
}
else if(key==LEFT) //如果是向左按键
{
if(where_0_next!=0)
where_0_next-=1;
disp_voltage_setup(where_0_next+1);
}
else if(key==RIGHT) //如果是向下按键
{
if(where_0_next!=5)
where_0_next+=1;
disp_voltage_setup(where_0_next+1);
}
else //如果是LEFT和RIGHT键
;
}
else if(where==1)
{
if(key==MENU) //如果是MENU,则返回待机画面。层标记为0,press_num标记复位为1
{
disp_standby(); //返回待机画面
press_num=1;
layer=0;
}
else if(key==ENTER)
{
if(where_1_next==0)
{
disp_ratio_setup(); //显示 "1.1:360 ";
// "2.1:180 ";
// "3.1:90";
// "4.1:60";
press_num=4;
where_1_next_next=0; //层标记为2,下一子菜单的位置标记默认为0
}
else
{
press_num=2; //返回上一目录
disp_layer_1();
write_command(0x90);
write_command(AC_highlight);
}
}
else if(key==LEFT)
{
if(where_1_next==0)
where_1_next=1;
else
where_1_next-=1;
if(where_1_next==0)
{
write_command(0x9b);
write_command(AC_highlight);
}
else
{
write_command(0x9c);
write_command(AC_highlight);
}
}
else if(key==RIGHT)
{
if(where_1_next==1)
where_1_next=0;
else
where_1_next+=1;
if(where_1_next==0)
{
write_command(0x9b);
write_command(AC_highlight);
}
else
{
write_command(0x9c);
write_command(AC_highlight);
}
}
else
;
}
else if(where==2)
{
if(key==MENU) //如果是MENU,则返回待机画面。层标记为0,press_num标记复位为1
{
disp_standby(); //返回待机画面
press_num=1;
layer=0;
}
else if(key==ENTER)
{
if(where_2_next==0)
{
disp_position_setup(); //显示 "1.1:360 ";
press_num=4;
where_2_next_next=0; //层标记为2,下一子菜单的位置标记默认为0
}
else
{
press_num=2; //返回上一目录
disp_layer_1();
write_command(0x88);
write_command(AC_highlight);
}
}
else if(key==LEFT)
{
if(where_2_next==0)
where_2_next=1;
else
where_2_next-=1;
if(where_2_next==0)
{
write_command(0x9b);
write_command(AC_highlight);
}
else
{
write_command(0x9c);
write_command(AC_highlight);
}
}
else if(key==RIGHT)
{
if(where_2_next==1)
where_2_next=0;
else
where_2_next+=1;
if(where_2_next==0)
{
write_command(0x9b);
write_command(AC_highlight);
}
else
{
write_command(0x9c);
write_command(AC_highlight);
}
}
else
;
}
/***********if(where==3)*******************************************************************************/
else if(where==3)
{
if(key==MENU) //如果是MENU,则返回待机画面。层标记为0,press_num标记复位为1
{
disp_standby(); //返回待机画面
write_command(AC_highlight_off);
press_num=1;
}
else if(key==ENTER)
{
disp_standby(); //返回待机画面
write_command(AC_highlight_off);
press_num=1;
}
else
;
}
else
;
}
/*44444444444****************************************************************************************/
else if(press_num==4) //能进到这一层界面的也就是where==1和where==2这两个
{
if(where==1) //能响应的按键有UP DOWN MENU和ENTER,不响应LEFT和RIGHT
{
if(key==MENU) //如果是MENU,则返回待机画面。press_num标记复位为1
{
disp_standby(); //返回待机画面
press_num=1;
}
else if(key==ENTER) //如果是ENTER,则先判断where_1_next_next的值然后再进行响应的处理
{
if(where_1_next_next==0) //1:360
ratio=360; //改变角变比
else if(where_1_next_next==1) //1:180
ratio=180;
else if(where_1_next_next==2) //1:90
ratio=90;
else if(where_1_next_next==3) //1:60
ratio=60;
else //故障恢复为1:360
ratio=360;
//修改完毕返回待机画面
disp_standby(); //返回待机画面
press_num=1;
}
else if(key==UP) //如果是向上按键
{
if(where_1_next_next==0)
where_1_next_next=3;
else
where_1_next_next-=1;
write_command(clr_address); //复位lcm的ac值
if(where_1_next_next==0) //在第一行位置处显白
{
write_command(0x80);
write_command(AC_highlight);
}
else if(where_1_next_next==1) //在第二行位置处显白
{
write_command(0x90);
write_command(AC_highlight);
}
else if(where_1_next_next==2) //在第三行位置处显白
{
write_command(0x88);
write_command(AC_highlight);
}
else //在第四行位置处显白
{
write_command(0x98);
write_command(AC_highlight);
}
}
else if(key==DOWN) //如果是向下按键
{
if(where_1_next_next==3)
where_1_next_next=0;
else
where_1_next_next+=1;
write_command(clr_address); //复位lcm的ac值
if(where_1_next_next==0) //在第一行位置处显白
{
write_command(0x80);
write_command(AC_highlight);
}
else if(where_1_next_next==1) //在第二行位置处显白
{
write_command(0x90);
write_command(AC_highlight);
}
else if(where_1_next_next==2) //在第三行位置处显白
{
write_command(0x88);
write_command(AC_highlight);
}
else //在第四行位置处显白
{
write_command(0x98);
write_command(AC_highlight);
}
}
else //如果是LEFT和RIGHT键
;
}
if(where==2) //响应所有的按键
{
if(key==MENU) //如果是MENU,则返回待机画面。press_num标记复位为1
{
disp_standby(); //返回待机画面
press_num=1;
}
else if(key==ENTER) //如果是ENTER,则先判断where_1_next_next的值然后再进行响应的处理
{
//将修改的数据赋给new_position,同时也赋old_position,保证再次运行时电机是从这个位置开始启动的
old_position=bai_wei*100.0+shi_wei*10.0+ge_wei+shifen_wei*0.1;
new_position=old_position;
//修改完毕返回待机画面
disp_standby(); //返回待机画面
press_num=1;
}
else if(key==UP) //如果是向上按键,先判断光标所处的是哪个位置,百位,十位,个位或者十分位
{
if(where_2_next_next==0) //百位
{
if(bai_wei==3)
bai_wei=0;
else
bai_wei+=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8a);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8a);
write_command(AC_highlight);
}
else if(where_2_next_next==1) //十位
{
if(shi_wei==5)
shi_wei=0;
else
shi_wei+=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8b);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8b);
write_command(AC_highlight);
}
else if(where_2_next_next==2) //个位
{
if(ge_wei==9)
ge_wei=0;
else
ge_wei+=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8c);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8c);
write_command(AC_highlight);
}
else if(where_2_next_next==3) //十分位
{
if(shifen_wei==9)
shifen_wei=0;
else
shifen_wei+=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8e);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8e);
write_command(AC_highlight);
}
else //其他出错不处理
;
}
else if(key==DOWN) //如果是向下按键
{
if(where_2_next_next==0) //百位
{
if(bai_wei==0)
bai_wei=3;
else
bai_wei-=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8a);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8a);
write_command(AC_highlight);
}
else if(where_2_next_next==1) //十位
{
if(shi_wei==0)
shi_wei=5;
else
shi_wei-=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8b);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8b);
write_command(AC_highlight);
}
else if(where_2_next_next==2) //个位
{
if(ge_wei==0)
ge_wei=9;
else
ge_wei-=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8c);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8c);
write_command(AC_highlight);
}
else if(where_2_next_next==3) //十分位
{
if(shifen_wei==0)
shifen_wei=9;
else
shifen_wei-=1;
//确定好百位上的值以后就去刷新该位显示
write_command(clr_address);
write_command(0x8e);
for(i=0;i<2;i++)
write_data(chinese_0_to_9);
write_command(0x8e);
write_command(AC_highlight);
}
else //其他出错不处理
;
}
else if(key==LEFT) //向左按键
{
if(where_2_next_next!=0)
where_2_next_next-=1;
if(where_2_next_next==0)
{
write_command(clr_address);
write_command(0x8a);
write_command(AC_highlight);
}
else if(where_2_next_next==1)
{
write_command(clr_address);
write_command(0x8b);
write_command(AC_highlight);
}
else if(where_2_next_next==2)
{
write_command(clr_address);
write_command(0x8c);
write_command(AC_highlight);
}
else if(where_2_next_next==3)
{
write_command(clr_address);
write_command(0x8e);
write_command(AC_highlight);
}
else
;
}
else if(key==RIGHT) //向右按键
{
if(where_2_next_next!=3)
where_2_next_next+=1;
if(where_2_next_next==0)
{
write_command(clr_address);
write_command(0x8a);
write_command(AC_highlight);
}
else if(where_2_next_next==1)
{
write_command(clr_address);
write_command(0x8b);
write_command(AC_highlight);
}
else if(where_2_next_next==2)
{
write_command(clr_address);
write_command(0x8c);
write_command(AC_highlight);
}
else if(where_2_next_next==3)
{
write_command(clr_address);
write_command(0x8e);
write_command(AC_highlight);
}
else
;
}
else //key值出现异常处理,什么都不做
;
}
}
else if(press_num==5)
{
;
}
else
;
}
TIMSK=a; //恢复TIMSK
} 液晶是lcm12864
没有照相机,传个自己画的效果图,有兴趣的朋友可以点击看下
a href=./bbs_upload/files_8/ourdev_179663.doc target='_blank'>点击此处打开ourdev_179663.doc(文件大小:42K)</a> 点击此处打开ourdev_179664.doc(文件大小:42K) 收下了谢谢 学习 好东西啊,够我学习一阵子了 收藏 强人~学习中 mark! 村长对菜单很有研究,学习学习 MARK 【21楼】 lzlym182
GUI高手.正在努力. 学习! mark..
看来不学AVR不行了。。!!! mark 收藏。谢谢 mark 学习中。 收藏! mark mark 收藏 ddddddddddddd mark 学习 村长又发利市了 好东西。又挖坟了 mark 回复【19楼】amwdnvfku
-----------------------------------------------------------------------
谢谢分享 好东西 mark mark mark mark 下来看看!等一下去使使 顶 学习制作菜单· 顶 好东西啊 记号一下 mark mark mark1 mark 留个脚印 标记下,以后慢慢学习! AVRmenu.exe也开源吧!~~ mark 收藏 cool mark mark,学习下 mark mark mark mark hao MARK 收藏了 mark 吃村长的大餐。。。。 非常感兴趣 MARK,正在调试1602的菜单的参数设置部分 标记,待有空再详细看完 mark
本帖最后由 orzorzorzorz 于 2012-9-29 21:30 编辑
看起来不错么 这个能不能用在51单片机上啊?老村长大侠 回复支持一下 谢谢分享 学习了, 谢谢楼主...... 没有下文了 赶紧围观
页:
[1]