51单片机外部中断按键失灵程序如下
时间:10-02
整理:3721RD
点击:
#include<reg52.h>
#include<intrins.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define PosPort P1 //位选
#define SegPort P0 //段选
sbit key1=P2^0;
void Delayms (uint16 ms);
void Display();
uint8 code Segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint16 qian,bai,shi,ge;
uint16 num=0;
uint8 flag,i;
void key(void);
void Init(void);
void main()
{
Init();
while(1)
{
key();
if(!flag)
num++;
if(num==10000)
num=0;
qian=num/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
for(i=5;i>0;i--)
{
Display();
}
}
}
/******************************************
延时函数
********************************************/
void Delayms(uint16 ms)
{
uint16 i,j;
for(i=ms;i>0;i--)
for(j=100;j>0;j--);
}
void Init(void)
{
EA=1; //开启总中断
EX1=1; //打开外部中断
IT1=1; //外部中断1触发方式选择位
PX1=1;
}
/************************************************
显示函数
************************************************/
void Display()
{
uint8 temp;
temp=0x7f;
PosPort=temp;
SegPort=Segment[qian];
Delayms(1);
temp=_cror_(temp,1);
PosPort=temp;
SegPort=Segment[bai];
Delayms(1);
temp=_cror_(temp,1);
PosPort=temp;
SegPort=Segment[shi];
Delayms(1);
temp=_cror_(temp,1);
PosPort=temp;
SegPort=Segment[ge];
Delayms(1);
}
void timer1_isr(void) interrupt 2
{
Delayms(5);
flag=~flag;
}
void key(void)
{
if(key1==0)
Delayms(10);
if(key1==0)
while(!key1)
{
num=0;
}
}
#include<intrins.h>
#define uint8 unsigned char
#define uint16 unsigned int
#define PosPort P1 //位选
#define SegPort P0 //段选
sbit key1=P2^0;
void Delayms (uint16 ms);
void Display();
uint8 code Segment[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint16 qian,bai,shi,ge;
uint16 num=0;
uint8 flag,i;
void key(void);
void Init(void);
void main()
{
Init();
while(1)
{
key();
if(!flag)
num++;
if(num==10000)
num=0;
qian=num/1000;
bai=num%1000/100;
shi=num%100/10;
ge=num%10;
for(i=5;i>0;i--)
{
Display();
}
}
}
/******************************************
延时函数
********************************************/
void Delayms(uint16 ms)
{
uint16 i,j;
for(i=ms;i>0;i--)
for(j=100;j>0;j--);
}
void Init(void)
{
EA=1; //开启总中断
EX1=1; //打开外部中断
IT1=1; //外部中断1触发方式选择位
PX1=1;
}
/************************************************
显示函数
************************************************/
void Display()
{
uint8 temp;
temp=0x7f;
PosPort=temp;
SegPort=Segment[qian];
Delayms(1);
temp=_cror_(temp,1);
PosPort=temp;
SegPort=Segment[bai];
Delayms(1);
temp=_cror_(temp,1);
PosPort=temp;
SegPort=Segment[shi];
Delayms(1);
temp=_cror_(temp,1);
PosPort=temp;
SegPort=Segment[ge];
Delayms(1);
}
void timer1_isr(void) interrupt 2
{
Delayms(5);
flag=~flag;
}
void key(void)
{
if(key1==0)
Delayms(10);
if(key1==0)
while(!key1)
{
num=0;
}
}
是你的外部中断信号高电平 时间太短吧。
你的程序是要实现什么功能呀?
我看显示时num总是=0,然后你的qian,bei,shi,ge也都是0,然后显示也都是0.
我搞不懂了都。
同学,暂且不论你的显示部分是否正确,你的程序有下面这些问题:
你发帖的标题上‘外部中断’按键失灵,也做了中断初始化的工作,但是你定义的按键引脚为P2.0, 并用轮询方式判断按键是否按下和释放;
你的程序结构,在num为10000时,先将num清零,然后再显示num的值,此时num==0,所以你显示的数字肯定一直是0,和其他程序段没有关系,看上去就是按键没有起作用一样;
定时器没有初始化就使用;
在定时器中断里面使用指令周期延时程序,占用系统时间,这样使用中断,中断就没有多大意义了;
是按键按下没有反应,还是定时中断没有进入中断?
你的外部中断中断处理程序在哪呢?
首先检测一下按键按下电平是否发生变化,然后再测试是否进入到中断的处理函数
用中断的话,不用延时函数吧