|
#include<reg51.h> #define SEG P2 #define SCANP P1 sbit PB0=P1^7; sbit led=P0^7; #define count_M1 50000 #define TH_M1 (65636-count_M1)/256 #define TL_M1 (65636-count_M1)%256 int count_T0=0; #define count_M2 250 #define TH_M2 (256-count_M2) #define TL_M2 (256-count_M2) char count_T1=0; char code TAB[10]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98}; char disp[2]= {0xc0,0xc0}; char seconds=0; char scan=0; char flag=0; void debouncer(void); void delay(int x); main() { IE=0x8f; TCON=0x00; TMOD=0x21; TH0=TH_M1; TL0=TL_M1; TR0=0; TH1=TH_M2; TL1=TL_M2; TR1=0; while(1) { if(PB0==0&&flag==0) { debouncer(); led=0; TR0=1; TR1=1; TR0=0; flag=1; while(PB0==0); debouncer(); } if(PB0==0&&flag==1) { debouncer(); TR0=1; flag=2; while(PB0==0); debouncer(); } if(PB0==0&&flag==2) { debouncer(); led=0; TR0=0; flag=3; while(PB0==0); debouncer(); } if(PB0==0&&flag==3) { debouncer(); seconds=0; disp[0]=disp[1]=0xc0; TR0=0; flag=1; while(PB0==0); debouncer(); } } } void T0_1s(void)interrupt 1 { TH0=TH_M1; TL0=TL_M1; if(++count_T0==16) //为了消除误差将20改为16 { count_T0=0; led=~led; seconds++; if(seconds==99) seconds=0; } disp[1]=TAB[seconds/10]; disp[0]=TAB[seconds%10]; } void T1_8ms(void) interrupt 3 { if(++count_T1==32) { count_T1=0; if(++scan==3) scan=1; SEG=0xff; SCANP=~scan; SEG=disp[scan-1]; } } void debouncer(void) { int i; for(i=0; i<2400; i++); } |
| 不好意思源码发错了现在补上,并且加上了 led 提示灯 |