第一种方法;
#include"reg51.h"
unsigned int i=0,j=1,h=0;
sbit aj1=P3^0;
sbit aj2=P3^1;
sbit led=P2^0;
void timer()
{
TMOD=0x01;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
EA=1;
ET1=1;
TR1=1;
}
void delay(unsigned int n)
{ unsigned int k,u;
for(k=0;n<5;k++){
for(u=0;u<120;u++)
;
}
}
void x()//P3^0
{
IT0=1;
EX0=1;
EA=1;
aj1=1;
}
void y()//P3^1
{
IT0=1;
EX1=1;
EA=1;
aj2=1;
}
int main()
{
x();/*interrupt 0*/
y();/*interrupt 1*/
timer();
while(1);
}
void time1()interrupt 3
{
if(j<=0) {j=1;}
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==(100*j))
{ i=0;led=~led; }
}
void timer2() interrupt 0
{
if(aj1==0)
{j=j+1;
delay(5);
}
}
void timer3() interrupt 2
{
if(aj2==0)
{j=j-1;}
delay(5);
}
第二种方法;
#include"reg51.h"
unsigned int w=1,flag=0,fla=0,i,j;
char s[]={0x3f,0x06,0x5B,0x4f,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
sbit aj1=P3^2;
sbit aj2=P3^3;
sbit led=P3^4;
void scan1()
{if(aj1==0&&flag==0){flag=1;}
if(aj1==1&&flag==1){w++;flag=0;}
}
void scan2()
{if(aj2==0&&fla==0){fla=1;}
if(aj2==1&&fla==1){w--;fla=0;}
}
void timer()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
ET0=1;
TR0=1;
}
void display()
{
P0=s[w];
if(w==10){w=1;}
if(w==0){w=9;}
}
int main()
{
while(1)
{
scan1();
scan2();
display();
j=100*w;
for(i=1;i!=(j+1);i++)
{ timer();
}
i=1;
}
}
void time()interrupt 1
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
if(j==i)
{ led=~led; i=i-1;}
}
第一种方法;anj2所控制的数码管能正常显示,但是控制led闪烁却有时失灵(特别是在快速点击按键时);anj1一旦按下数码管的数值立刻变为1,且led只能闪烁一秒钟。
第二种第一种方法;数码管上 的数字能够准确地被两个按键控制,但是led却一直亮没有延时;我认为第一种方法可能时延时函数出现了问题,于是就用另一种方法(添加标志位)将延时函数替换掉,但是此时两个按键所控制的定时器却又失灵。无奈只能将两个按键的定时器去掉,直接用函数来判断两个按键是否发生了变化。但是此时数码管上 的数字能够准确地被两个按键控制,但是led却一直亮没有延时