aleyn 发表于 2006-9-29 11:38:15

国庆大餐之,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

armok 发表于 2006-9-29 11:39:44

果然是大餐!

aleyn 发表于 2006-9-29 11:44:06

这。。。。加裤也太快了。。。。。^o^



发贴相差才1分钟左右。。。。。哈哈哈。。

joson 发表于 2006-9-29 11:49:22

很好的生成工具

AVR-MEGA128 发表于 2006-9-29 12:22:30

来点图片吧.

shaoshunda 发表于 2006-9-29 13:05:30

能不能说说原理,及其用法

dodgecat 发表于 2006-9-29 14:15:56

用单色点阵液晶和单片机都会碰这样的问题,呵呵

我2001年在一家公司做的时候,那东西全汇编的,恐怖的代码量,我第一件事就是做一个生成菜单结构的工具,跟楼主的差不多,加一些显示函数,不过不久我就走了,不知道他们后来用不用



后来用C还写过一个架构,底层是API,核心是一个定时器和函数表,做成事件驱动的几层结构,中间是硬件定义和显示控件,最后就差写一个IDE集成开发环境和模拟显示了



到现在我接触的东西,还是涉及架构问题,架构做好能让开发尽量专注于应用逻辑,否则麻烦死了

huangdongle 发表于 2006-9-29 14:30:31

就是啦,能不能说说原理,及其用法

linmch 发表于 2006-9-29 14:46:52

学习中

aleyn 发表于 2006-9-29 15:13:03

标题应该是给我起错了,但我实在不知道应该起什么名字好.



实际的情况如下:



项目名称:频率发生器 v2.0

项目简介:通过LCD上的菜单,实时设置Mega8的三个定时器的各个寄存器,这样,

   就可以通过显波器来监视Mega8的定时器的各个寄存器相互作用.



比如:Mega8的T1定时器,是最难懂的也是比较复杂的定时器之一,而我们可以通过

这个项目,了解到T1定时器所需的各个寄存器的相互作用.

又比如:Mega8的 COM1A/B与WGM1之间的作用,通过这个实时设置,就可以实时的通过示波器

看到.



这个项目没有任何按键,所有的用户交互都是通过电视遥控器和红外接收头来完成的.

aleyn 发表于 2006-9-29 15:16:43

本项目中的IRv2原程序,看这里:

http://www.ouravr.com.cn/bbs/bbs_content.jsp?bbs_sn=673341&bbs_page_no=1&bbs_id=1000

shuinieh 发表于 2007-10-1 15:10:30

谢谢分享

1181zjf 发表于 2007-10-1 15:31:03

to 10楼:联接打不开!!!

bing0110 发表于 2007-10-1 21:49:03

谢谢分享

chengjia535 发表于 2007-10-2 19:28:31

"大餐"

jxhjjm 发表于 2007-10-3 18:02:50

就是啦,能不能说说原理,及其用法

jxhjjm 发表于 2007-10-3 18:03:26

看得眼花

zkf0100007 发表于 2007-10-3 18:14:49

对啊,能不能上个图片看看,谢谢!

asdfasdf 发表于 2007-10-3 18:46:25

有图片才完美!!!支持图片!!!

amwdnvfku 发表于 2007-11-3 16:28:48

lzlym182 发表于 2007-11-3 17:46:46

我的菜单部分代码
用最笨拙的判断语句实现
//************************************************************************************
//函数名称: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       
       
}

lzlym182 发表于 2007-11-3 17:57:50

液晶是lcm12864
没有照相机,传个自己画的效果图,有兴趣的朋友可以点击看下
a href=./bbs_upload/files_8/ourdev_179663.doc target='_blank'>点击此处打开ourdev_179663.doc(文件大小:42K)</a>

lzlym182 发表于 2007-11-3 18:00:23

点击此处打开ourdev_179664.doc(文件大小:42K)

1860 发表于 2009-2-26 15:10:55

收下了谢谢

flyerhacker 发表于 2009-3-10 17:07:46

学习

elecfun 发表于 2009-3-10 20:25:16

好东西啊,够我学习一阵子了

wahaha 发表于 2009-3-10 21:59:18

收藏

jchqxl 发表于 2009-3-10 22:16:55

强人~学习中

zhc7302 发表于 2009-3-10 22:21:02

mark!

xihacow 发表于 2009-3-10 22:34:56

村长对菜单很有研究,学习学习

ljgvictory 发表于 2009-3-11 11:06:38

MARK

wisebaby 发表于 2009-3-12 18:05:24

【21楼】 lzlym182

GUI高手.正在努力.

jchqxl 发表于 2009-3-22 23:12:50

学习!

wenhaoo 发表于 2009-3-23 18:55:52

mark..

看来不学AVR不行了。。!!!

xyz2008 发表于 2009-3-31 10:37:04

mark

1860 发表于 2009-4-1 08:58:14

收藏。谢谢

sunyouyuan 发表于 2009-4-1 12:50:17

mark

challenger86 发表于 2009-4-16 17:49:59

学习中。

10086 发表于 2009-4-19 16:41:44

收藏!

panqh333 发表于 2009-4-21 09:01:55

mark

gaj8 发表于 2009-4-21 09:38:48

mark

a105 发表于 2009-4-22 02:21:56

收藏

0620221 发表于 2009-6-18 09:01:28

ddddddddddddd

qq335702318 发表于 2009-11-20 20:29:03

mark

smtgg 发表于 2009-11-20 20:49:16

学习

lf8013 发表于 2009-11-20 22:20:19

村长又发利市了

wangxiaoacc 发表于 2009-11-20 23:05:02

好东西。又挖坟了

ksniper 发表于 2009-11-20 23:14:47

mark

wuxinping 发表于 2010-2-9 12:40:58

回复【19楼】amwdnvfku
-----------------------------------------------------------------------

谢谢分享

wuxinping 发表于 2010-2-17 11:22:01

好东西

twlkzxy 发表于 2010-4-7 13:32:36

mark

CCUE 发表于 2010-4-13 10:45:58

mark

sky_walker 发表于 2010-4-13 12:57:33

mark

deadiceboy 发表于 2010-4-15 00:14:50

mark

ATmega_16 发表于 2010-5-1 09:44:01

下来看看!等一下去使使

zlj2008 发表于 2010-5-1 10:31:21

huchengxtu 发表于 2010-5-1 11:32:10

学习制作菜单·

xjf20072608 发表于 2010-5-1 12:55:26

zc136688 发表于 2010-5-1 13:04:06

好东西啊 记号一下

yqlomg 发表于 2010-5-2 16:00:39

mark

niewenge 发表于 2010-5-5 17:45:24

mark

zuceyige 发表于 2010-6-27 10:55:45

mark1

3g465 发表于 2010-6-28 12:17:17

mark

hiferr 发表于 2010-6-28 15:47:40

留个脚印

tuowai 发表于 2010-7-7 02:33:33

标记下,以后慢慢学习!

ljt8015 发表于 2010-7-7 09:10:05

AVRmenu.exe也开源吧!~~

wzxavr 发表于 2010-8-26 13:16:45

mark

smtgg 发表于 2010-12-2 17:12:09

收藏

wenfeiexe 发表于 2010-12-2 17:14:18

cool

wpnx 发表于 2011-3-10 00:15:18

mark

fuwu 发表于 2011-5-16 22:42:32

mark,学习下

dzq112358 发表于 2011-5-16 23:21:46

mark

10086 发表于 2011-5-19 18:50:00

mark

linhuaou 发表于 2011-5-19 22:35:52

mark

wbanng 发表于 2011-5-19 22:45:46

mark

wdh2152 发表于 2011-5-20 11:02:04

hao

416446891 发表于 2011-5-20 12:37:03

MARK

OyutianO 发表于 2011-6-15 11:30:34

收藏了

twd3621576 发表于 2011-7-15 01:35:12

mark

wangyj173 发表于 2011-10-4 18:12:30

吃村长的大餐。。。。

GNMXD 发表于 2011-10-12 17:35:01

非常感兴趣

zzf_2010 发表于 2012-2-25 22:01:36

MARK,正在调试1602的菜单的参数设置部分

yingmin_alex 发表于 2012-7-26 09:15:40

标记,待有空再详细看完

chengying 发表于 2012-9-29 09:38:12

mark


orzorzorzorz 发表于 2012-9-29 21:27:44

本帖最后由 orzorzorzorz 于 2012-9-29 21:30 编辑

看起来不错么

261854681 发表于 2012-9-30 09:25:19

这个能不能用在51单片机上啊?老村长大侠

edkaifa 发表于 2013-1-25 16:33:10

回复支持一下 谢谢分享

大漠游民 发表于 2013-1-27 01:50:41

学习了,

jz701209李 发表于 2013-4-12 10:56:41

谢谢楼主......

261854681 发表于 2013-4-12 11:12:52

没有下文了

BigWolf 发表于 2013-4-12 11:15:38

赶紧围观   
页: [1]
查看完整版本: 国庆大餐之,LCD1602的菜单生成和显示方法。