关于单个按键控制LED的程序设计

[复制链接]
4778|10
 楼主| 王挺 发表于 2010-11-13 23:53 | 显示全部楼层 |阅读模式
#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的点亮和熄灭,请各位大虾指教。
liang7143 发表于 2010-11-14 10:27 | 显示全部楼层
请描叙下现象~~
LED = ! LED;
可以改成这样试试,
增加一个变量,假使是flag.
flag = !flag;
LED = flag;
 楼主| 王挺 发表于 2010-11-14 11:15 | 显示全部楼层
源码本身是想用按键控制LED的点亮还是熄灭,但是无法达到预期的效果,仿真的时候不能用按键控制LED,不知程序的哪个地方有问题,求解!
songzhonghui08 发表于 2010-11-14 11:44 | 显示全部楼层
源码本身是想用按键控制LED的点亮还是熄灭,但是无法达到预期的效果,仿真的时候不能用按键控制LED,不知程序的哪个地方有问题,求解!
 楼主| 王挺 发表于 2010-11-14 21:56 | 显示全部楼层
#include <reg51.h>
#define uchar unsigned char
#define key_state_0 0
#define key_state_1 1
#define key_state_2 2
sbit key_input=P1^4;
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();
}
}

把#define key_input P1^4改为sbit key_input=P1^4;就可以实现功能了,还请高手解释一下为什么宏定义不起作用
dong_abc 发表于 2010-11-14 22:26 | 显示全部楼层
把#define key_input P1^4改为sbit key_input=P1^4;就可以实现功能了,还请高手解释一下为什么宏定义不起作用
等楼下讲,我只知道这么用,说不清楚
ji_dan 发表于 2010-11-14 23:34 | 显示全部楼层
这个……有点多!~
sun_shun 发表于 2010-11-15 08:36 | 显示全部楼层
如果你打开REG.H文件看看,里面是怎么定义的,你要是看不懂就看看KEIL手册.
我刚开始学的时候也遇到这个问题,
 楼主| 王挺 发表于 2010-11-17 22:02 | 显示全部楼层
最好有哪位稍微解释一下!让小弟明白!
 楼主| 王挺 发表于 2010-11-17 23:25 | 显示全部楼层
感谢11楼
smile_luo 发表于 2010-11-18 10:02 | 显示全部楼层
路过:lol
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部