标题:
利用单片机中断方式控制按键次数不同时亮灯不同,但按键后灯都不亮。哪里错了?
[打印本页]
作者:
一人心0511
时间:
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();
}
}
作者:
一人心0511
时间:
2018-5-6 17:37
刚发现k4的引脚写错了,应该是P3^2,并不是这的错
作者:
HC6800-ES-V2.0
时间:
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;
好了,程序功能实现了。
你再好好想想嘛!
作者:
一人心0511
时间:
2018-5-7 09:57
HC6800-ES-V2.0 发表于 2018-5-7 09:19
程序的逻辑有大问题,还有小问题!!!!!
第一:逻辑大问题是:中断服务函数void Int0() interrupt 0中 ...
非常感谢,主要是刚学这,不太懂
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1