求解at89s51外部中断
搞了好几天都搞不懂,理论知识都知道,就想看用键盘怎样实现外部中断,这是我写的程序,中断根本看不出来。
[code=C/C++][/code]
#include<at89x52.h>
#include<intrins.h>
#define SIGNAL P3_5 // 键盘初始信号
#define KEY6 P3_2 // KEY6口就是INT0口
#define KEY2 P3_3
sbit a=P2^0;
sbit b=P2^1;
sbit c=P2^2;
sbit u8=P2^3;
sbit u9=P2^4;
sbit u10=P2^6;
unsigned char code tab[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char code tab1[]={0xe4,0xe3,0xe2,0xe1};
void syd();
void delay(unsigned int t)//延时程序
{
unsigned int m;
unsigned int n;
for(m=0;m<t;m++)
for(n=0;n<120;n++);
}
void int0() interrupt 0 // 也可不判断是否为KEY6按下,因为引发此中断的就是KEY6键
{
if(KEY6 == 0)
{
delay(10); // 延时消除按键抖动
if (KEY6 == 0) // 确定有键按下
{
syd();
}
while (!KEY6) ; // 等待KEY1松开
delay(10); // 延时消除松键抖动
}
}
void int1() interrupt 2
{
if(KEY2 == 0)
{
delay(10); // 延时消除按键抖动
if (KEY2 == 0) // 确定有键按下
{
syd();
}
while (!KEY2) ; // 等待KEY1松开
delay(10); // 延时消除松键抖动
}
}
void syd()
{
unsigned char x;
u8=0;
u9=0;
u10=0;
a=0;
b=0;
c=0;
P1=0x01;
u10=1;
x=0x01;
P1=x;
while(1)
{
x=_crol_(x,1);
P1=x;
delay(20);
}
}
void main(void)
{
unsigned int i;
unsigned int k;
EA = 1; // 开总中断
EX0 = 1; // 开外中断0
IT0 = 0; // 外中断0低电平触发方式
EX1 = 1;
IT1 = 0;
while(1)
{
for(k=1;k<17;k++)
{
for(i=0;i<4;i++) //4位
{
P1=tab[k+i-1];
P2=tab1[i];
delay(500);
}
}
}
}
[解决办法]
LZ 你的程序框架 有严重问题
中断里面不应该有 delay这种延时函数,占用大量的中断处理时间
而且还有 这种等待按键释放的这种 阻塞语句
这些都是 中断的大忌啊
[解决办法]
IT0 = 0; // 外中断0低电平触发方式
将外部中断改成下降沿或上升沿触发中断试试(IT0 = 1,好像是这么设置的),然后将中断里的消抖动程序都去掉,进中断直接:
void int0() interrupt 0 // 也可不判断是否为KEY6按下,因为引发此中断的就是KEY6键
{
syd();
}