k1啟動/暫停,k2~k4 3路獨立倒計時,數碼管16進制顯示 t x x x,P1.0~P1.2低電平輸出,全部到0恢復初始狀態。
無標題.jpg (168.96 KB, 下載次數: 74)
下載附件
2020-7-24 22:17 上傳
- #include <reg51.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define duan P0
- sbit k1=P2^4;
- sbit k2=P2^5;
- sbit k3=P2^6;
- sbit k4=P2^7;
- sbit OUT1=P1^0;
- sbit OUT2=P1^1;
- sbit OUT3=P1^2;
- uchar code table[]={//共陽數碼管段碼"0~f-."
- 0xc0,0xf9,0xa4,0xb0,
- 0x99,0x92,0x82,0xf8,
- 0x80,0x90,0x88,0x83,
- 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
- uchar data dis_buf[4];
- uchar a,b,c,d;
- uint count;
- bit sign;
- bit flag;
- uint num=0,num1=0,num2=0,num3=0;
- void delay(uint t)
- {
- uint i,j;
- for(i=t;i>0;i--)
- for(j=112;j>0;j--);
- }
- void InitTimer0(void)
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0xB0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void display()
- {
- if(flag)
- dis_buf[0]=0x87;
- else
- dis_buf[0]=0xbf;
- dis_buf[1]=table[b];
- dis_buf[2]=table[c];
- dis_buf[3]=table[d];
- P2&=0xf0;//位清0
- P2|=0x01<<num;
- duan=dis_buf[num];//送段碼
- num++;
- num%=4;
- }
- void main()
- {
- InitTimer0();
- while(1)
- {
- if(!k1 || !k2 || !k3 || !k4)
- {
- count++;//消抖計數
- if(count>=10 && sign==0)
- {
- sign=1;//鎖定鍵態
- if(!k1){flag=~flag;}
- if(!k2){b=b+5;if(b>15)b=0;}
- if(!k3){c=c+5;if(c>15)c=0;}
- if(!k4){d=d+5;if(d>15)d=0;}
- }
- }
- else{count=0;sign=0;}
- if(b!=0)OUT1=0;else OUT1=1;
- if(c!=0)OUT2=0;else OUT2=1;
- if(d!=0)OUT3=0;else OUT3=1;
- display();
- delay(1);//控制主循環周期約1ms
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0x3C;
- TL0 = 0xB0;
- if(flag)
- {
- if(b!=0)
- {
- num1++;
- if(num1>=1200)
- {
- num1=0;
- b--;
- }
- }
- if(c!=0)
- {
- num2++;
- if(num2>=1200)
- {
- num2=0;
- c--;
- }
- }
- if(d!=0)
- {
- num3++;
- if(num3>=1200)
- {
- num3=0;
- d--;
- }
- }
- if(b==0&&c==0&&d==0)
- flag=0;
- }
- }
復制代碼
|