一个51单片机问题:scankey写在外部中断1中没有用,放到主函数中才有用,这个为什么?
就是如果把scankey写到外部中断1中P3.3对应的那个按键按了没用,只有把scankey写在主函数里才有用啊,求解释!!#include<reg52.h>#defin...
就是如果把scankey写到外部中断1中P3.3对应的那个按键按了没用,只有把scankey写在主函数里才有用啊,求解释!!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code wei[]={
0x00,0x01,0x02,0x03,
0x04,0x05,0x06,0x07};
sbit key=P3^2;
sbit key1=P3^3;
uint t=0;
uchar a,b,c;
void delay(uchar);
void keyscan();
void scankey();
void init();
void display();
void main()
{
P3=0xff;
init();
while(1)
{
display();
}
}
void delay(uchar n)
{
uint x,y;
for(x=0;x<n;x++)
for(y=0;y<110;y++);
}
void init()
{
TMOD=0x01;
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
a=0;b=0;c=0;
}
void keyscan()
{
uchar dang;
dang=TR0;
if(key==0)
{
delay(5);
if(key==0)
{
switch(dang)
{
case 0:TR0=1;break;
case 1:TR0=0;break;
}
}
while(!key);
delay(5);
while(!key);
}
else TR0=1;
}
void scankey()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
TR0=0;
a=0;
b=0;
c=0;
}
while(!key1);
delay(5);
while(!key1);
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
t=0;
TR0=1;
}
}
void tingzhi()interrupt 0
{
keyscan();
}
void timer0()interrupt 1
{
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
t++;
}
void ql()interrupt 2
{
scankey();
}
void display()
{
if(t==1)
{ t=0;
a++; }
if(a>9)
{ a=0;
b++; }
if(b>9)
{ b=0;
c++; }
if(c>9) c=0;
P1=7;
P2=table[a];
delay(5);
P1=6;
P2=table[b];
delay(5);
P1=5;
P2=table[c];
delay(15);
} 展开
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uchar code wei[]={
0x00,0x01,0x02,0x03,
0x04,0x05,0x06,0x07};
sbit key=P3^2;
sbit key1=P3^3;
uint t=0;
uchar a,b,c;
void delay(uchar);
void keyscan();
void scankey();
void init();
void display();
void main()
{
P3=0xff;
init();
while(1)
{
display();
}
}
void delay(uchar n)
{
uint x,y;
for(x=0;x<n;x++)
for(y=0;y<110;y++);
}
void init()
{
TMOD=0x01;
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
EA=1;
ET0=1;
TR0=1;
EX0=1;
a=0;b=0;c=0;
}
void keyscan()
{
uchar dang;
dang=TR0;
if(key==0)
{
delay(5);
if(key==0)
{
switch(dang)
{
case 0:TR0=1;break;
case 1:TR0=0;break;
}
}
while(!key);
delay(5);
while(!key);
}
else TR0=1;
}
void scankey()
{
if(key1==0)
{
delay(5);
if(key1==0)
{
TR0=0;
a=0;
b=0;
c=0;
}
while(!key1);
delay(5);
while(!key1);
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
t=0;
TR0=1;
}
}
void tingzhi()interrupt 0
{
keyscan();
}
void timer0()interrupt 1
{
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
t++;
}
void ql()interrupt 2
{
scankey();
}
void display()
{
if(t==1)
{ t=0;
a++; }
if(a>9)
{ a=0;
b++; }
if(b>9)
{ b=0;
c++; }
if(c>9) c=0;
P1=7;
P2=table[a];
delay(5);
P1=6;
P2=table[b];
delay(5);
P1=5;
P2=table[c];
delay(15);
} 展开
1个回答
展开全部
你这程序,嗯,有点乱,还不习惯单片机编程吧。
具体就补给你改了,给点意见:
1:就你的提问,你说放在interrupt 1里面,单看你的程序 Int1是定时中断。你是要说放Int2里面吧。如果你的Int2配置是正确的,应该能够正确执行。但对于你这个程序,这不是重点。
2:嵌入式编程的一个最基本的原则是,中断里面不要有太多的操作,特别是肯定是不要有你写的这种 while(!....)循环。你想,你的程序中,按下按键不放的话,那不是整个系统全部当死了?所以,按键的判断你要是一定需要用中断的话,这样做:
interrupt n
{
if(key down)
set a flag
}
再在主程序总:
if flag is set
{
进行按键消抖等运算(消抖可利用定时中断)
}
,另外按键也可以不用中断,在主程序中循环扫描判断。可以到网上找找例子看看。建议你到周立功的网站去,上面有不少例子。
3:
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
向这种运算,你要考虑能用移位运算或位运算的尽量用,时间短啊。
TH0 = (0xffff-0xdc00)>>8;
TL0 = (0xffff-0xdc00)&0xff; //或者直接TL0 = (0xffff-0xdc00)
具体就补给你改了,给点意见:
1:就你的提问,你说放在interrupt 1里面,单看你的程序 Int1是定时中断。你是要说放Int2里面吧。如果你的Int2配置是正确的,应该能够正确执行。但对于你这个程序,这不是重点。
2:嵌入式编程的一个最基本的原则是,中断里面不要有太多的操作,特别是肯定是不要有你写的这种 while(!....)循环。你想,你的程序中,按下按键不放的话,那不是整个系统全部当死了?所以,按键的判断你要是一定需要用中断的话,这样做:
interrupt n
{
if(key down)
set a flag
}
再在主程序总:
if flag is set
{
进行按键消抖等运算(消抖可利用定时中断)
}
,另外按键也可以不用中断,在主程序中循环扫描判断。可以到网上找找例子看看。建议你到周立功的网站去,上面有不少例子。
3:
TH0=(65535-56320)/256;
TL0=(65535-56320)%256;
向这种运算,你要考虑能用移位运算或位运算的尽量用,时间短啊。
TH0 = (0xffff-0xdc00)>>8;
TL0 = (0xffff-0xdc00)&0xff; //或者直接TL0 = (0xffff-0xdc00)
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询