打印

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

[复制链接]
3711|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,不知程序的哪个地方有问题,求解!

使用特权

评论回复
5
王挺|  楼主 | 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;就可以实现功能了,还请高手解释一下为什么宏定义不起作用

使用特权

评论回复
6
dong_abc| | 2010-11-14 22:26 | 只看该作者
把#define key_input P1^4改为sbit key_input=P1^4;就可以实现功能了,还请高手解释一下为什么宏定义不起作用
等楼下讲,我只知道这么用,说不清楚

使用特权

评论回复
7
ji_dan| | 2010-11-14 23:34 | 只看该作者
这个……有点多!~

使用特权

评论回复
8
sun_shun| | 2010-11-15 08:36 | 只看该作者
如果你打开REG.H文件看看,里面是怎么定义的,你要是看不懂就看看KEIL手册.
我刚开始学的时候也遇到这个问题,

使用特权

评论回复
9
王挺|  楼主 | 2010-11-17 22:02 | 只看该作者
最好有哪位稍微解释一下!让小弟明白!

使用特权

评论回复
10
王挺|  楼主 | 2010-11-17 23:25 | 只看该作者
感谢11楼

使用特权

评论回复
11
smile_luo| | 2010-11-18 10:02 | 只看该作者
路过:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

21

帖子

0

粉丝