可以不用while等待。
定义函数
#define CPU_F ( (double) 8000000)
#define delay_us( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000000.0) )
#define delay_ms( x ) __delay_cycles( (long) (CPU_F * (double) x / 1000.0) )
#define CO 1
#define SET 2
#define UP 3
#define DOWN 4
#define key_01 (P2IN&BIT5)
#define key_02 (P2IN&BIT4)
#define key_03 (P2IN&BIT3)
#define key_04 (P2IN&BIT2)
//初始化按键IO
void initKeyIO(void)
{
P2DIR &= ~(BIT2 + BIT3 + BIT4 + BIT5); ///引脚方向
P2REN |= (BIT2 + BIT3 + BIT4 + BIT5); //引脚上拉使能
P2OUT |= (BIT2 + BIT3 + BIT4 + BIT5); //上拉
}
uchar last = 1;
//四个按键的检测函数
//有按键则返回1 2 3 4
//无按键则返回 0
unsigned char scanKey(void)
{
if ((key_01 == 0 || key_02 == 0 || key_03 == 0 || key_04 == 0) && (last == 1))
{
delay_ms(10); //去抖动
last = 0;
if (key_01 == 0)
{
return 1;
}
else if (key_02 == 0)
{
return 2;
}
else if (key_03 == 0)
{
return 3;
}
else if (key_04 == 0)
{
return 4;
}
}
if ((key_01) && (key_02))
{
if ((key_03) && (key_04))
last = 1;
}
return 0;
}
使用:
int main(void)
{
initSystemWdtAndIOAndClock(); //8MHZ
while (1)
{
delay_ms(10);
keyValue = scanKey(); //检测按键
if (keyValue != 0)
{
if (keyValue == CO)
{
}else if (keyValue == SET)
{
}else if (keyValue == UP )
{
}else if (keyValue == DOWN )
{
}
}
}
}