在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!)    创芯人才网--重磅上线啦!
查看: 4448|回复: 0

[求助] 菜单程序的调用

[复制链接]
发表于 2010-4-21 13:24:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
菜单程序 如何调用

//这个函数里面的那些变量是怎么实现调用的
//当调用这个“{0,1,0,0,0,(*radio_Auto)},” 函数时,显示的总是不对,不知道这个里面的数值
//是如何来确定的,调用“{0,1,0,0,0,(*radio_dnSeek)}与{1,0,1,0,0,(*radio_upSeek)},”
//可以正常使用,但是我还是不明白里面的那些数值的所代表的意义
//望高人指点,我的QQ:519212866 欢迎交流学习

sbit key_up = P1^4;     //向上搜台
sbit key_dw = P1^3;     //向下搜台
sbit key_voladd = P1^2;     //音量加
sbit key_voldwn = P1^1;     //音量减
//----------------------------变量声明--------------------------------
#define K_Dn 0xfb                //向上键为"A"
#define K_Up 0xfa                //向下键为"B"
#define K_En 0xfd                //回车键为"D"
#define K_Back 0xfc            //返回键为"C"   
#define SIZE_OF_KEYBD_MENU 6    //菜单总长度
uchar KeyFuncIndex = 0;
void (*KeyFuncPtr)();    //KeyFuncPtr是指向函数的指针,该函数返回值为空
uchar Key;

typedef struct   //这个函数里面的那些变量是怎么实现调用的
{
   uchar KeyStateIndex; //当前状态索引号
   uchar KeyDnState;     //当按下"向下"键时转向的状态索引号
   uchar KeyUpState;     //当按下"向上"键时转向的状态索引号
   uchar KeyEnState;     //当按下"回车"键时转向的状态索引号
   uchar KeyBackState;    //当按下"退回"键时转向的状态索引号
   void (*CurrentOperate)();    //当前状态应执行的功能操作
}KbdTabStruct;

void radio_Auto()
{
//    if(Radio_ == 1 && AutoSEEK == 1)         
       FmSeek(RADIO_DOWN); //向上搜台
}

void radio_upSeek()
{
       LcdClr();
       Freq_Step_1(RADIO_UP); //频道往上

           FM_Freq_Disp();
           FM_Vol_Disp();

           lcd_XY(1,0);
           lcdWriteString("向上搜台调节:");
           lcd_XY(2,0);
           lcdWriteString("频率单位:MHz..");
}

void radio_dnSeek()
{
           LcdClr();
           Freq_Step_1(RADIO_DOWN); //频道往下
           FM_Freq_Disp();
           FM_Vol_Disp();
           lcd_XY(2,0);
           lcdWriteString("向下搜台调节:");
           lcd_XY(1,0);
           lcdWriteString("频率单位:MHz..");
}



void main_disp()
{
       LcdClr();
       lcd_XY(1,0);
       lcdWriteString("我们的社会是黑暗");
       lcd_XY(2,0);
       lcdWriteString("他们的幸福在这里");
}





//这个函数里面的那些变量是怎么实现调用的
//当调用这个“{0,1,0,0,0,(*radio_Auto)},” 函数时,显示的总是不对,不知道这个里面的数值
//是如何来确定的,调用“{0,1,0,0,0,(*radio_dnSeek)}与{1,0,1,0,0,(*radio_upSeek)},”
//可以正常使用,但是我还是不明白里面的那些数值的所代表的意义
KbdTabStruct code KeyTab[]=   
{   
   {0,1,0,0,0,(*radio_dnSeek)},
   {1,0,1,0,0,(*radio_upSeek)},
   {0,1,0,0,0,(*radio_Auto)},

   {0,0,0,0,0,(*main_disp)},
   

   {2,1,1,2,0,(*radio_upSeek)},
   {0,0,0,1,0,(*main_disp)},



};



uchar key_act(void)
{
       if(!key_voladd)
       {
           delay_ms(20);
           if(!key_voladd)
           {
               while(!key_voladd);
               FM_VOL++;
               if(FM_VOL>15)
                   FM_VOL = 0;
               RDA5807_volume(FM_VOL); //音量+ 只有16级,   
        }
        }
        
      
       if(!key_voldwn)
       {
           delay_ms(20);
           if(!key_voldwn)
           {
               while(!key_voldwn);

           }
       }

       if(!key_dw)
       {
           delay_ms(20);
           if(!key_dw)
        {
               while(!key_dw);
               Key = K_En;
               return (Key);
    }        
       }            
      
       if(!key_up)     //手动
       {
           delay_ms(20);
           if(!key_up)
        {
               while(!key_up);
               Key = K_Up;
               return (Key);
           }
       }

       if(!key_dw)     //手动
       {
           delay_ms(20);
           if(!key_dw)
        {
               while(!key_dw);
               Key = K_Dn;
               return (Key);
           }
       }
    return 0xff;
}




void GetKeyInput()
{
   Key    = key_act();
   switch(Key)
   {
       case K_En:     //回车键,找出新的状态编号
           KeyFuncIndex=KeyTab[KeyFuncIndex].KeyEnState;
           break;   

       case K_Up:     //向上键,找出新的状态编号
           KeyFuncIndex = 0;
           KeyFuncIndex=KeyTab[KeyFuncIndex+1].KeyUpState;
           break;

       case K_Dn:     //向下键,找出新的状态编号
           KeyFuncIndex = 0;
           KeyFuncIndex=KeyTab[KeyFuncIndex+1].KeyDnState;
           break;



   /*    case K_Back:    //返回键,找出新的状态编号
           KeyFuncIndex=KeyTab[KeyFuncIndex].KeyBackState;
           break;    */

           default:
                   {
                       return;
                       break;
                   }
   }
   KeyFuncPtr = KeyTab[KeyFuncIndex].CurrentOperate;
   (*KeyFuncPtr)();        //执行当前按键的操作
}




void main()
{

   while(1)
   {
           
           GetKeyInput();
   }
   
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-9 21:42 , Processed in 0.017479 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表