微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机外部中断按键失灵程序如下

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;
                        }
}

是你的外部中断信号高电平 时间太短吧。

你的程序是要实现什么功能呀?
我看显示时num总是=0,然后你的qian,bei,shi,ge也都是0,然后显示也都是0.
我搞不懂了都。

同学,暂且不论你的显示部分是否正确,你的程序有下面这些问题:
你发帖的标题上‘外部中断’按键失灵,也做了中断初始化的工作,但是你定义的按键引脚为P2.0, 并用轮询方式判断按键是否按下和释放;
你的程序结构,在num为10000时,先将num清零,然后再显示num的值,此时num==0,所以你显示的数字肯定一直是0,和其他程序段没有关系,看上去就是按键没有起作用一样;
定时器没有初始化就使用;
在定时器中断里面使用指令周期延时程序,占用系统时间,这样使用中断,中断就没有多大意义了;

是按键按下没有反应,还是定时中断没有进入中断?
你的外部中断中断处理程序在哪呢?

首先检测一下按键按下电平是否发生变化,然后再测试是否进入到中断的处理函数

用中断的话,不用延时函数吧

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top