#include"reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit K1=P3^1;
sbit LED=P2^0;
#define K1_press 1
#define KEY_UNPRESS 0
void delay(u16 m)
{
while(m--);
}
u8 key_scan(u8 mode)
{
static u8 key=1;
if(mode) key=1;
if(key==1&&K1==0)
{
delay(1000);
key=0;
return K1_press;
}
else key=1;
return KEY_UNPRESS;
}
void main()
{
u8 key=0;
while(1)
{
key=key_scan(0);
if(key==K1_press)
LED=!LED;
}
}
对于这个代码,我的理解是按一下独立按键,LED1就会亮起,再按一下LED就会熄灭。但是实验现象是LED这个亮灭不按套路出牌,找不到规律,所以想问问这是怎么回事
你没有判断按键抬起,所以会比较快去执行多次按下。
解决的办法是加一个按键抬起判断,如果有抬起,再进行下次按下判断。
/******************KEY mode按下 *******************/
if(MenuKey_Mode==0)//extern
{
if(KeyMode_status==0) //确定已经松开
{
KeyMode_counter++;
if(KeyMode_counter ==5)//消抖
{
if(MenuKey_Mode==0)//再次确认按键按下
{KeyMode_counter =0;KeyMode_flag =1;KeyMode_status =1;}
}
}
}
/******************KEY enter松开 *******************/
if(MenuKey_Mode ==1)//extern
{
if(KeyMode_status==1)
{
KeyMode_counter++;
if(KeyMode_counter ==10)
{
if(MenuKey_Mode !=0)
{KeyMode_counter =0;KeyMode_flag =0;KeyMode_status =0;}
}
}
}
如果有帮助请点采纳!