#include <reg51.h>
#define uchar unsigned char
#define key_input P1^4
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
char read_key(void)
{
static char key_state = 0;
char key_press, key_return = 0;
key_press = key_input; //读键状态
switch (key_state)
{
case key_state_0: // 按键初始状态
if(!key_press)
key_state = key_state_1; //键被按下,状态转换到确认状态
break;
case key_state_1: //按键确认状态
if(!key_press)
{
key_return = 1; //按键仍按下,按键确认输出为1
key_state = key_state_2; //状态转换到释放状态
}
else
key_state = key_state_0;
break;
case key_state_2:
if(key_press)
key_state = key_state_0; //按键已释放,转换到按键初始状态
break;
}
return key_return;
}
void delay10ms()
{
uchar i, j, k;
for ( i=5; i>0; i-- )
for ( j=4; j>0; j-- )
for ( k=248; k>0; k-- );
}
sbit LED = P2^0;
void main()
{
P1 = 0xff;
P2 = 0xff;
while(1)
{
if( read_key() ) //检测键是否有效按下,按下则
{
LED = ! LED;
}
delay10ms();
}
}
电路说明:当按下P1.4口连接处的按键时(按键为低电平有效),P2.0处连接的LED点亮(LED灯处低电平有效),再次按下按键时LED熄灭。
问题:以上为源码,不知道为什么无法控制LED的点亮和熄灭,请各位大虾指教。 |