|
由于程序過于麻煩在這里就不給注釋了——反正程序是對的本人已在開發板上已做過實驗了。
實驗效果:1,在無指令的情況下 數碼管以一秒加一的速度開始0~99計時,到99自動彈回0重新計時。
2,按下key1數碼管清零;之后松開key1又開始計時。
3,按下key2計時暫停在當前的那位,要使其繼續計時必須按下key4,才可以解除暫停。
4,按下key3自動加10計時也就是說每按下一次指示器加10;比如由20變為30,(按下key3之后必須按下key4才會加10否則只會暫停在當前 那位,因為總中斷再被關閉后在我寫的這個程序上只有按下key4才會被從新打開)
5,按下key5自動減10原理和key3差不多,但要注意的是只是在當前的那位減10而不會出現倒計時!(這里不需要在按下key5后按key4才能啟動,直接按下key5就可以減10)
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar aa,bb,ge,shi,bai;
uchar code shuzi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^4;
sbit key5=P1^5;
void time(uchar k)
{
uchar x,y;
for(x=100;x>0;x--)
for(y=k;y>0;y--);
}
void dsq0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
bb++;
if(bb==100)
{
bb=0;
}
bai=bb/10;
shi=bb%10/10;
ge=bb%10;
}
}
void keyscan()
{
if(key1==0)
{
time(5);
if(key1==0)
{
bb=0;
}
}
if(key1==1)
{
time(5);
if(key1==1)
{
}
}
if(key2==0)
{
time(5);
if(key2==0)
{
EA=0;
}
}
if(key2==1)
{
time(5);
if(key2==1)
{
}
}
if(key3==0)
{
time(5);
if(key3==0)
{
EA=0;
bb++;
if(bb==99)
{
bb=0;
}
}
}
if(key3==1)
{
time(5);
if(key3==1)
{
}
}
if(key4==0)
{
time(5);
if(key4==0)
{
EA=1;
}
}
if(key4==0)
{
time(5);
if(key4==0)
{
}
}
if(key5==0)
{
time(5);
if(key5==0)
{
bb--;
if(bb==0)
{
bb=100;
}
}
}
if(key5==0)
{
time(5);
if(key5==0)
{
}
}
}
void init()
{
P0=0;
P2=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
IT0=0;
}
void display( bai,shi,ge)
{
P0=shuzi[bai];
P2=0xfd;
time(1);
P0=0x00;
P2=0x00;
P0=shuzi[shi];
P2=0xfe;
time(1);
P0=0x00;
P2=0x00;
P0=shuzi[ge];
P2=0xfb;
time(1);
P0=0x00;
P2=0x00;
}
void main()
{
init();
while(1)
{
keyscan();
display(bai,shi,ge);
}
}
設計者:薛羽豪
|
|