刚学没几天看不太懂
#include<reg52.h> #defineuint unsigned int #defineuchar unsigned char sbitkey1=P2^0; //定义"启动/暂停"按钮 sbitkey2=P2^1; //定义"复位"按钮 sbitkey3=P2^2; //定义"模式"按钮 sbitkey4=P2^3; //定义"查看"按钮 sbitwei1=P2^4; //定义位选 sbitwei2=P2^5; sbitwei3=P2^6; sbitwei4=P2^7; bitflag_start,flag_mode,flag_5sec; uchartemp,temp1,aa,aa1,shi,ge,shifen,baifen,num,i,j; uchartime_data1[11],time_data2[11]; ucharcode table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; //不带小数点共阴极数码管编码 ucharcode tabledp[]={ 0xbf,0x86,0xdb,0xcf, 0xe6,0xed,0xfd,0x87, 0xff,0xef,0xf7,0xfc, 0xb9,0xde,0xf9,0xf1}; //带小数点共阴极数码管编码 voiddisplay(uchar shi,uchar ge,uchar shifen,uchar baifen); //声明显示子函数 voiddelay(uint z); //声明延时子函数 voidinit(); //声明初始化函数 voidkey(); //声明键扫描函数 voiddisplay_process(); //声明显示处理函数 voidmain() { init(); //调用初始化子程序 while(1) { key(); display_process(); display(shi,ge,shifen,baifen); //调用显示子函数 } } voiddelay(uint z) //延时子函数 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } voiddisplay(uchar shi,uchar ge,uchar shifen,uchar baifen) //显示子程序 { P0=table[shi]; //使用动态扫描的方法实现数码管显示 wei1=0; delay(1); wei1=1; P0=tabledp[ge]; wei2=0; delay(1); wei2=1; P0=table[shifen];//使用动态扫描的方法实现数码管显示 wei3=0; delay(1); wei3=1; P0=table[baifen]; wei4=0; delay(1); wei4=1; } voidinit() //初始化子程序 { temp=0; TMOD=0x01; //使用定时器T0的方式1 TH0=(65536-10000)/256; TL0=(65536-10000)%256; //定时50ms中断一次 EA=1; //中断总允许 ET0=1; //允许定时器T0中断 } voidkey() { if(key1==0) //检测"启动"按钮是否按下 { delay(5); //延时去抖动 if(key1==0) //再次检测"启动"按钮是否按下 { while(!key1); //松手检测 flag_start=~flag_start; if(flag_mode==0) { if(flag_start==1) TR0=1; //启动定时器开始工作 else TR0=0; } else { if(flag_start==1) TR0=1; else TR0=0; } } } if(key2==0) //检测"停止"按钮是否按下 { delay(5); if(key2==0) { while(!key2); if(flag_mode==0||i!=0) { shi=0; //关闭定时器 ge=0; shifen=0; baifen=0; aa=0; temp=0; TR0=0; i=0; num=0; for(j=0;j<=10;j++) { time_data1[j]=0; time_data2[j]=0; } } else { num++; if(num==11) num=1; aa1=aa; temp1=temp; time_data1[num]=aa1; time_data2[num]=temp1; flag_5sec=0; } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); flag_mode=~flag_mode; } } if(key4==0) { delay(5); if(key4==0) { while(!key4); i++; TR0=0; if(i==11) i=1; } } } voiddisplay_process() { shifen=aa%100/10; baifen=aa%10; shi=temp%100/10; ge=temp%10; if(flag_mode==1&&num!=0&&flag_5sec==0) { shi=time_data2[num]/10; ge=time_data2[num]%10; shifen=time_data1[num]/10; baifen=time_data1[num]%10; if(temp-time_data2[num]==2) flag_5sec=~flag_5sec; } if(i!=0) { shi=time_data2/10; ge=time_data2%10; shifen=time_data1/10; baifen=time_data1%10; } } voidtimer0() interrupt 1 { TH0=(65536-10000)/256; //重新赋初值 TL0=(65536-10000)%256; aa++; //中断一次变量aa的值加1 if(aa==100) //中断100次后,定时时间为100*10ms=1000ms=1s,将变量temp的值加1 { aa=0; temp++; if(temp==100) //秒表到达100s后回零 temp=0; } }
|