马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
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();
}
} |