AT89S51单片机的P1口接有1个7段LED数码管,初始显示0。外部中断输入引脚INTO接有一

AT89S51单片机的P1口接有1个7段LED数码管,初始显示0。外部中断输入引脚INTO接有一一个开关按钮,该脚平时为高电平。每当按钮开关按下1次时,则产生1个负跳变的外中断请求,并使数码管显示增1,当按下第10次时,数码管从9再变为0。
程序为:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code seg[]={0xa4,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

void delay( )
{
uchar i,j;
for(i=0;i<255;i--)
for(j=0;j<255;j--);

}

void main(void)
{
uint i=0;

while(1)
{
EA=1;
EX0=1;
IT0=1;

P1=seg[i];

}
}

void int0() interrupt 0 using 1
{ uint i;
i++;

if(i==10)
i=0;
}

能帮我看看哪里错了吗?

P3.2的按键作为外部中断了,实现计数功能,所以,那个延时子程序没有用了。

关键问题是,凡是中断程序中所用的变量,要定义为全局变量。修改的程序如下。

#include<reg51.h>

#define uint unsigned int

#define uchar unsigned char

uchar code seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//你0的段码错误了

uchar i=0; //凡是中断程序用到的变量,一律定义为全局变量,而且不用定义成 unsigned int 型的变量。

/*

void delay()//延时子程序没有用,注释掉

{

uchar i,j;

for(i=0;i<255;i--)

for(j=0;j<255;j--);

}

*/

void main(void)

{

//uint i;//删掉

while(1)

{

EA=1;

EX0=1;

IT0=1;

P1=seg[i];

}

}

void int0() interrupt 0 using 1

{ //uint i;//删掉

i++;

if(i==10)

i=0;

}

仿真结果如下

追问

如果从0-9然后再从9-0,后面要怎么写?

追答

那中断程序要分成两段,一段为加法,0~9计数,另一段减法计数,9~0。

追问

好的,谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-05-05
把变量i作为全局变量
相似回答