[AVR单片机] AVR 按键控制LED亮灭问题

[复制链接]
2831|7
 楼主| 侠行江湖 发表于 2013-9-23 11:20 | 显示全部楼层 |阅读模式
大家好,最近在学习AVR atmega8单片机按键控制电路,利用PB0口输入按键控制PD0输出LED(低电平输出LED亮),按键按下PB0口为低电平输入。现在想实现按键按下时LED亮,松开按键时LED灭。我利用以下程序,按一下按键LED常亮,松开按键还是亮.请问问题出在哪了。具体程序、电路如下:
#include <iom8v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned  int

void delay(uint ms)      //延时1ms
{
  uint i,j;
  for(i=0;i<ms;i++)
{
  for(j=0;j<134;j++);
}
}
void main(void)
{
DDRB=0x00;
PINB=0x01;
DDRD=0x01;
PORTD=0x01;
while(1)              //不断循环
{
if((PINB&0x01)==0)           //判断键盘是否被按下
  {
   delay(2);           //调用延时函数,作用消抖
   if((PINB&0x01)==0)         //再次读键盘,以判断刚才判断到的是否为抖动
   {
   PORTD&=~BIT(PD0);       //取反PD0电平状态,也就是改变发光管的状态
   }
   }
}
}
 楼主| 侠行江湖 发表于 2013-9-23 11:23 | 显示全部楼层
具体电路如下图。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qin552011373 发表于 2013-9-23 21:41 | 显示全部楼层
限流电阻选的也有问题的
lnulibin 发表于 2013-9-23 23:30 | 显示全部楼层
程序中只有让PD0引脚置低的语句。
PORTD&=~BIT(PD0);   

没有让PD0引脚置高的语句。怎么让灯亮了以后再灭?
ayb_ice 发表于 2013-9-24 15:27 | 显示全部楼层
直接赋值不就可以了
LED = KEY;
joyme 发表于 2013-9-24 17:46 | 显示全部楼层
或者加一个语句
else
     PORTD |= BIT(PD0);
haochangxu 发表于 2013-9-25 14:25 | 显示全部楼层
我最近也在学习AVR,问下你的例程那来的啊,能分享一份吗?谢谢
xxiao6130 发表于 2013-9-25 16:23 | 显示全部楼层
支持6楼!你可以考虑考虑
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

27

帖子

0

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