- #include<reg52.h>
- #include<intrins.h>
- sbit ADDR0=P1^0;
- sbit ADDR1=P1^1;
- sbit ADDR2=P1^2;
- sbit ADDR3=P1^3;
- sbit ENLED=P1^4;
- sbit BUZZ = P1^6; //蜂鸣器控制引脚
- unsigned char code LEDwei[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
- };
- unsigned char code KeyCode[]={0xff,0xe7,0xd7,0xb7,0x77,0xeb,0xdb,0xbb,0x7b,
- 0xed,0xdd,0xbd,0x7d,0xee,0xde,0xbe,0x7e
- }; //矩阵键盘按键编码
- unsigned char scan0=0xfe;
- unsigned char count[]={0,0,0,0,0,0};
- unsigned char byte=5;
- unsigned char number[5];
- unsigned char key;
- unsigned char n;
- unsigned int cnt;
- unsigned char flag=1;
- bit f0;
- void delay_ms(unsigned int cnt)
- {
- unsigned char i;
- while(cnt--)
- {
- for(i=0;i<=110;i++);
- }
- }
- void Scankeyboard();
- void countDown();
- void main()
- {
- ADDR3=1;
- ENLED=0;
- TMOD=0x01;
- TH0=0xfc;
- TL0=0x67;
- EA=1;
- TR0=1;
- ET0=1;
- while(1)
- {
- Scankeyboard();
- countDown();
-
- }
- }
- void time0()interrupt 1
- {
- unsigned char i;
- cnt++;
- TH0=0xfc;
- TL0=0x67;
- P0=0xff;
- switch(i)
- {
- case 0:ADDR0=0; ADDR1=0; ADDR2=0; i++; if(byte>=1) P0=LEDwei[count[0]];break;
- case 1:ADDR0=1; ADDR1=0; ADDR2=0; i++; if(byte>=2) P0=LEDwei[count[1]];break;
- case 2:ADDR0=0; ADDR1=1; ADDR2=0; i++; if(byte>=3) P0=LEDwei[count[2]];break;
- case 3:ADDR0=1; ADDR1=1; ADDR2=0; i++; if(byte>=4) P0=LEDwei[count[3]];break;
- case 4:ADDR0=0; ADDR1=0; ADDR2=1; i++; if(byte>=5) P0=LEDwei[count[4]];break;
- case 5:ADDR0=1; ADDR1=0; ADDR2=1; i=0; P0=LEDwei[count[5]];break;
- default:break;
- }
- }
- void countDown()
- {
- if(flag==3)
- {
- if(byte==1&count[0]>9) BUZZ=~BUZZ;
- if(byte==2&count[1]>9) BUZZ=~BUZZ;
- if(byte==3&count[2]>9) BUZZ=~BUZZ;
- if(byte==4&count[3]>9) BUZZ=~BUZZ;
- if(byte==5&count[4]>9) BUZZ=~BUZZ;
- if(cnt==1000&f0==0)
- {
- cnt=0;
- count[0]--; //个位
- if(count[0]>9)
- { f0=1;
- if(byte>1)
- {
- f0=0;
- count[0]=9;
- count[1]--; //十位
- if(count[1]>9)
- {
- f0=1;
- if(byte>2)
- {
- f0=0;
- count[1]=9;
- count[2]--; //百位
- if(count[2]>9)
- {
- f0=1;
- if(byte>3)
- {
- f0=0;
- count[2]=9;
- count[3]--; //千位
- if(count[3]>9)
- {
- f0=1;
- if(byte>4)
- {
- f0=0;
- count[3]=9;
- count[4]--; //万位
- if(count[4]>9)
- {
- f0=1;
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- void Scankeyboard()
- {
- unsigned char scan,keyboard;
- unsigned char i;
- P2=scan0;
- scan=P2;
- if(scan!=scan0)
- {
- delay_ms(2);
- if(scan!=scan0)
- {
- while(P2!=scan0);
- keyboard=scan;
- for(i=1;i<17;i++)
- {
- if(keyboard==KeyCode[i])
- key=i;
- }
- if(flag==2)
- {
- if(n>byte)
- n=byte;
- if(key>=1&key<=3) //1~3
- {
- number[n++]=key;
- }
- if(key>=5&key<=7) //4~6
- {
- number[n++]=key-1;
- }
- if(key>=9&key<=11) //7~9
- {
- number[n++]=key-2;
- }
- if(keyboard==KeyCode[13]) //0
- {
- number[n++]=0;
- }
- count[n-1]=number[n-1];
- }
- if(flag==1)
- {
- if(key>=1&key<=3) //1~3
- {
- key=key;
- byte=key; //设置倒计时的位数
- count[5]=byte;
- // flag=2;
- }
- if(key==5|key==6) //4~5
- {
- key=key-1;
- byte=key; //设置倒计时的位数
- count[5]=byte;
- //flag=2;
- }
- }
- if(flag==3&key==15) //重新设定倒计时
- {
- flag=1;f0=0;
- count[0]=0;
- count[1]=0;
- count[2]=0;
- count[3]=0;
- count[4]=0;
- count[5]=0;
- byte=5;
- }
- else if(flag==1&key==15)
- flag=2;
- else if(flag==2&key==15)
- flag=3;
- }
- }
- else
- {
- scan0=_crol_(scan0,1);
- if(scan0==0xef)
- {
- scan0=0xfe;
- }
- }
- }
复制代码 |