当前位置:文档之家› 电子时钟数码管显示

电子时钟数码管显示

/********************************************************** ***///电子时钟数码管显示,具有暂停,清零,调整时,分,秒的功能2014年8月17日/********************************************************** */#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6;sbit wela=P2^7;//sbit s0=P3^2; //清零键sbit speak=P1^2; //蜂鸣器//sbit s2=P3^0; //矩阵键盘//sbit s3=P3^1;//sbit s4=P3^4; //暂停sbit s1=P3^2; //功能键sbit s2=P3^5;// 闹钟设定sbit s3=P3^3; //加sbit s4=P3^4; //减//sbit juzhen=P3^4;bit sflag,setflag,setcflag,cflag,k1,k2,k3,k4;uchar code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //显示数字0~9unsigned char code weima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; //unsigned char code weima[]={0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//unsigned char code weima[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb}; uchar tempdata[8];uchar miao,fen,shi,cmiao,cfen,cshi;uchar count,ncount,s1num,cnum,state,normal;//-------------------------ms级延时函数-----------------------------------------// void delayms(uint z){uint x,y;for(x=z;x>0;x--)for(y=123;y>0;y--);}//-----------------------------蜂鸣器发声--------------------------------------------------//void buzzer(){speak=0;delayms(100);speak=1;}//---------------------闹铃声---------------------------------------------------------//void clock(){uchar i;if((shi==cnum)&&(fen==cfen)&&(miao==cmiao)){for(i=0;i<50;i++){buzzer();delayms(100);}}}//---------------------------------------定时器0初始化------------------------//void inittime0(){TMOD=0x01;EA=1;ET0=1;TR0=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;}//-------------------定时器0中断------------------------------------------------------------//void zdtime0()interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256; //定时50mscount++;ncount++;if(ncount==10){ncount=0;if(setflag==1) //每隔0.5s翻转{sflag=!sflag;}if(setcflag==1) //闹钟闪烁{cflag=!cflag;}}if(count==20) //满一秒加一{count=0;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}}}//-----------------------------数码管显示------------------------------------------------------------//void display(uchar djw,uchar num){uchar i,j;for(i=0;i<num;i++){P0=0;dula=1;dula=0;P0=weima[i+djw];wela=1;wela=0;P0=tempdata[i];dula=1;dula=0;delayms(2); //延时2ms}}//--------------------------------键盘扫描函数---------------------------------------------------------//void keyscan(){if(state==normal){if(k1==1){s1=0;s1num++;if(s1num>=4){setflag=0;s1num=0;sflag=1;}}//------------------------------------------------------------------------------------//if(k2==1){s2=0;setcflag=1;cflag=1;sflag=0;cnum++;if(cnum>=4){cnum=0;cflag=0;sflag=1;}}//-----------------------------------------------------------------------------------//if(k3==1){s3=0;switch(s1num){case 1:{miao++;if(miao==60){miao=0;}}break;case 2:{fen++;if(fen==60){fen=0;}}break;case 3:{shi++;if(shi==24){shi=0;}}break;default : break; }//----------------------------------------------------------------------------------------------------------//switch(cnum) //闹钟设置时加,分加,秒加{case 1:{cmiao++;if(cmiao==60){cmiao=0;}}break;case 2:{cfen++;if(cfen==60){cfen=0;}}break;case 3:{cshi++;if(cshi==24){cshi=0;}}break;default : break;}//---------------------------------------------------------------------------------------------------------//}//---------------------------------------------------------------------------------// if(k4==1) //减键{switch(s1num) {case 1:{miao--;if(miao==-1)miao=59;}break;case 2:{fen--;if(fen==-1)fen=59;}break;case 3:{shi--;if(shi==-1)shi=23;}break;default : break;}//---------------------------------------------------------------------------------------------------//switch(cnum) //时减,分减,秒减{case 1:{cmiao--;if(cmiao==-1)cmiao=59;}break;case 2:{cfen--;if(cfen==-1)cfen=59;}break;case 3:{cshi--;if(cshi==-1)cshi=23;}break;default : break;}}}}void fuzhi(){if(state==normal){if(sflag==1){tempdata[7]=duanma[shi/10];tempdata[6]=duanma[shi%10];tempdata[5]=0x40;tempdata[4]=duanma[fen/10]; tempdata[3]=duanma[fen%10]; tempdata[2]=0x40;tempdata[1]=duanma[miao/10]; tempdata[0]=duanma[miao%10]; }if(cflag==1){tempdata[7]=duanma[cshi/10];tempdata[6]=duanma[cshi%10];tempdata[5]=0x40;tempdata[4]=duanma[cfen/10]; tempdata[3]=duanma[cfen%10]; tempdata[2]=0x40;tempdata[1]=duanma[cmiao/10]; tempdata[0]=duanma[cmiao%10]; }tempdata[2]=0x40;tempdata[5]=0x40;if (sflag==0)switch(s1num){case 1:{tempdata[0]=0;tempdata[1]=0;} break;case 2:{tempdata[3]=0;tempdata[4]=0;} break;case 3:{tempdata[7]=0;tempdata[6]=0;} break;default : break;}if (cflag==0){switch(cnum){case 1:{tempdata[0]=0;tempdata[1]=0;} break;case 2:{tempdata[3]=0;tempdata[4]=0;} break;case 3:{tempdata[7]=0;tempdata[6]=0;} break;default : break;}}}}void jian(){if(s1==0){delayms(5);if(s1==0){while(s1==0);k1=1;}}if(s2==0){delayms(5);if(s2==0){while(s2==0);k2=1;}}if(s3==0){delayms(5);if(s3==0){while(s3==0);k3=1;}}if(s4==0){delayms(5);if(s4==0){while(s4==0);k4=1;}}void model(){switch(state){case normal:{} break;}}//-------------------------------主函数---------------------------------------------------------//void main(){inittime0();//定时器0初始化s2=0;sflag=1;state=normal;while(1){// clock();keyscan();fuzhi();display(0,8);}}。

相关主题