1、/****************************************************************************** 实现秒表功能说明:用5键控制。启动。停止.暂停.继续.清零 按S2 启动 只有在清零或没有开始得情况下才有效 按S3 停止 只有在启动得情况下才有效 按S4 暂停 只有在启动得情况下才有效 按S5 继续 只有在暂停得情况下才有效 按S6 清零 只有在停止得情况下才有效 采用中断控制方式. *********************************************************
2、********************/ #include〈reg52、h〉 #include〈intrins、h〉 #define uchar unsigned char #define uint unsigned int char cent=0; char second=0; char minite=0; bit s2=0; bit s3=0; bit s4=0; bit s5=0; bit s6=0; /*共阳数码管字型码*/ /*0,1,2,3,4,5,6,7,8,9,p、,灭*/ char code dis_code[]={0xc0
3、0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x0c,0xff,0xbf}; /*P点显示代码序号*/ char data find_code[]={0,0,12,0,0,12,0,0}; /********************************************************/ //函数名: void Delay1ms(uint count) //功能: 延时时间为1ms //输入参数:count,1ms计数 //说明:总共延时时间为1ms乘以count,crystal=12Mhz /*
4、*******************************************************/ /* 延迟函数 */ void Delay1ms(uint count) { uint j; while(count—-!=0) { for(j=0;j〈80;j++); } } /************************************************************************/ /*显示函数*/ /******************************
5、***************************************/ void disp() { char i,j=0xfe; char k; for(i=0;i〈8;i++) { P2=j; k=find_code[i]; P0=dis_code[k]; Delay1ms(1); j=_crol_(j,1);ﻩ } ﻩ P0=0xff; } /**********************************************************
6、************** * 函数原型:keychuli(); * 功 能:处理与键盘相连得P1口得内容,作为键值。 ************************************************************************/ uchar keychuli() { uchar k; k=P1; //P1口内容送K k=~k; //取反
7、 return(k); //返回键值 } /************************************************************************ * 函数原型:key(); * 功 能:键盘扫描函数,函数返回值即键值. ************************************************************************/ uchar key() { uchar keyzhi,keyzhii;
8、 //电子钟键盘按键键值临时存放 keyzhi=keychuli(); //调P1口处理函数 if(keyzhi!=0) //有键动作延时去抖动,否则函数返回 ﻩ { ﻩ disp(); disp(); ﻩ keyzhi=keychuli(); //再次调P1口处理函数 ﻩ if(keyzhi!=0) //真正有键按下,取键值并暂存 ﻩ { ﻩﻩ keyzhii=keyzhi; ﻩ while(keyz
9、hi!=0) //判按键就是否释放,没有释放延时去抖动等待释放 { ﻩﻩ disp(); ﻩ disp(); keyzhi=keychuli(); ﻩ } ﻩﻩ keyzhi=keyzhii; //按键释放后恢复按键键值 } } return(keyzhi); //返回按键键值 } void zxxq()ﻩ /*更新显示区*/ { find_code[0]=cent%10;
10、 ﻩ find_code[1]=cent/10; find_code[2]=12; find_code[3]=second%10; find_code[4]=second/10; find_code[5]=12; find_code[6]=minite%10; find_code[7]=minite/10;ﻩ } /*中断函数*/ TTCO () interrupt 1 using 1 { ﻩTH0=(65536-7000)/256; //赋初值 TL0=(65536—7000)%256;
11、 ﻩcent++; ﻩ if(cent==100) ﻩ ﻩ{ ﻩ cent=0; second++; ﻩﻩ ﻩﻩif(second==60) ﻩﻩﻩﻩﻩ { ﻩ ﻩﻩﻩ second=0; ﻩﻩﻩﻩ minite++; ﻩﻩ ﻩ ﻩif(minite==60) ﻩﻩ ﻩﻩﻩ{ ﻩ ﻩﻩ ﻩﻩﻩminite=0; ﻩﻩﻩﻩﻩ ﻩ ﻩ ﻩ ﻩ } ﻩﻩﻩ } ﻩﻩ} ﻩzxxq(); } /*主函数*/ void main() {ﻩ char kz;ﻩ EA=
12、1; ﻩ ET0=1; TMOD=0X01; ﻩ TH0=(65536—7000)/256; TL0=(65536—7000)%256; ﻩ find_code[0]=11; find_code[1]=11; find_code[2]=11; find_code[3]=11; find_code[4]=11; find_code[5]=11; find_code[6]=11; ﻩ find_code[7]=10; ﻩ disp(); whil
13、e(1) { kz=key();ﻩ switch(kz) ﻩ { ﻩ ﻩ case 0x00:disp();break; ﻩ /*判断键值后 直接调用循环显示函数*/ case 0x01: ﻩ // 启动 在开始或清零下 ﻩﻩ if(s3==0&&s4==0) ﻩ ﻩ { ﻩﻩ ﻩﻩ TR0=1; ﻩ ﻩ zxxq(); ﻩﻩﻩ disp(); ﻩ ﻩ } ﻩ break ; ﻩ
14、case 0x02: ﻩﻩﻩﻩ //停止 在启动下 ﻩ ﻩ if(s4==0) ﻩ { ﻩﻩ ﻩﻩ s3=1; ﻩﻩ ﻩ TR0=0; ﻩﻩﻩ ﻩ zxxq(); ﻩ ﻩ disp(); ﻩ ﻩﻩﻩ } ﻩﻩ ﻩﻩ break;ﻩﻩ ﻩﻩﻩ case 0x04: // 暂停 在启动下 if(s3==0) ﻩﻩ ﻩﻩ { ﻩ ﻩ s4=1; ﻩﻩ TR0=0; ﻩ
15、 zxxq();ﻩ ﻩ ﻩﻩﻩ disp(); ﻩ ﻩ } ﻩﻩﻩ break; case 0x08: // 继续 在暂停下 ﻩ if(s4&&s3==0) ﻩ ﻩ { ﻩﻩﻩﻩ s4=0; ﻩﻩﻩ ﻩ TR0=1; ﻩ zxxq(); ﻩﻩﻩﻩﻩ disp(); ﻩﻩ ﻩ } ﻩ break; ﻩ ﻩ ﻩ case 0x10: ﻩﻩ // 清零 在停止下 ﻩ ﻩ if(s3&&!s4) ﻩﻩ ﻩﻩ { ﻩﻩﻩ ﻩ s3=0; ﻩ ﻩ s4=0; ﻩ ﻩﻩ TR0=0; ﻩﻩﻩ ﻩﻩ cent=0; second=0; minite=0; ﻩ ﻩﻩ zxxq(); ﻩ ﻩ disp(); ﻩ ﻩ ﻩ } ﻩ break; ﻩ ﻩﻩﻩ ﻩ ﻩ ﻩﻩﻩ ﻩ ﻩﻩ }ﻩ ﻩﻩﻩﻩ } }






