找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2371|回复: 3
打印 上一主题 下一主题
收起左侧

利用单片机中断方式控制按键次数不同时亮灯不同,但按键后灯都不亮。哪里错了?

[复制链接]
跳转到指定楼层
楼主
ID:316425 发表于 2018-5-6 16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "reg51.h"

sbit led1=P2^4;
sbit led2=P2^5;
sbit led3=P2^6;
sbit led4=P2^7;
sbit k1=P2^0;
sbit k2=P2^1;
sbit k4=P3^3;

unsigned char presskeynum=0;

void delay(unsigned int i)   
{
    unsigned int j,k;
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}


void key()
{
                 if(presskeynum==1)
        {

                if(k1==0)
                        {
                        delay(30);
                        led1=0;
                                
                        }
                        if(k2==0)
                                {
                                        delay(30);
                                        led2=0;
        }
               
  }               
                if(presskeynum==2)
        {

                if(k1==0)
                        {
                        delay(10);
                        led3=0;
                        }
                        if(k2==0)
                                {
                                        delay(10);
                                        led4=0;
        }
               
        }
        
}

void Int0INit()
{
IT0=1;
EX0=1;
EA=1;
}


        
void main()
{
        
        led1=1;
  led2=1;
        led3=1;
  led4=1;
        Int0INit();



         while(1);
}


void Int0() interrupt 0
{


delay(10);
        if(k4==0)
        {
               
         presskeynum++;
                if(presskeynum==3)
                        presskeynum=0;
                else key();

        }



        

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:316425 发表于 2018-5-6 17:37 | 只看该作者
刚发现k4的引脚写错了,应该是P3^2,并不是这的错
回复

使用道具 举报

板凳
ID:164602 发表于 2018-5-7 09:19 | 只看该作者
程序的逻辑有大问题,还有小问题!!!!!
第一:逻辑大问题是:中断服务函数void Int0() interrupt 0中的那个条件语句
if(presskeynum==3)
       presskeynum=0;
else key();
我们来看看逻辑:你的想法——按下k4,产生中断,然后去扫描独立按键,产生不同现象。——想法对,程序逻辑错了!!!!!
你想啊,按下k4产生中断后,到扫描独立按键,程序要多少时间?你的操作要用多少时间?——你的程序是连续执行的。
所以,没有任何反应,很正常——时间上搞不及嘛。——是不是大大的逻辑问题?!

所以,我修改为这样:中断服务函数中的 else key();语句删除,将 key()放在主循环中
while(1)//注意,你程序中这里有分号,一定一定要删除
{
    key();
}

我在我的板子上,已经调试成功!

第二:小问题——你的外部中断服务函数中,没有清除中断标志——只能按一次k4产生一次中断,以后就不会再有新的外部中断产生了——外部中断服务函数最后一条语句,一定要加上清除中断标志语句IE0=0;

好了,程序功能实现了。
你再好好想想嘛!
回复

使用道具 举报

地板
ID:316425 发表于 2018-5-7 09:57 | 只看该作者
HC6800-ES-V2.0 发表于 2018-5-7 09:19
程序的逻辑有大问题,还有小问题!!!!!
第一:逻辑大问题是:中断服务函数void Int0() interrupt 0中 ...

非常感谢,主要是刚学这,不太懂
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表