您好,欢迎访问三七文档
本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!C程序:#includereg51.hunsignedcharled[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00};//用一维数组定义-9、横杠、全灭unsignedcharnum[12]={2,0,0,9,3,5,0,7,0,1,2,0};unsignedchara[8];unsignedcharsecond=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1;unsignedcharminute1=0,hour1=0;unsignedcharb[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//扫描unsignedchark=0;unsignedinttemp;//记录毫秒为秒的变量unsignedcharM,S_flag;//M是模式,更新时间的种模式加上正常模式S_flag闪烁标志sbitK0=P3^7;//K0是闹钟起停标志位sbitK1=P3^0;sbitK2=P3^1;sbitK3=P3^2;sbitBEEP=P3^3;voiddelay(unsignedn)//0.2毫秒{intx,y;for(x=0;xn;x++)for(y=0;y24;y++);}voidinit1(){S_flag=0;//闪烁标志位TMOD=0x10;//定时器以方式定时TH1=0xfc;TL1=0x18;EA=1;//打开总中断ET1=1;//允许定时器中断TR1=1;//开启定时器(开始定时计数)}voidinit0(){TMOD=0x01;//定时器以方式定时TH0=0xff;TL0=0xff;EA=1;//打开总中断ET0=1;//允许定时器中断TR0=0;//关闭定时器(关闭定时计数)}voiddisplay_led()//流动显示学号{intx;charl,a,m;for(a=0;a21;a++){x=a-8;for(l=0;l6;l++){for(m=0;m8;m++){P2=b[m];if(x=0&&x12)P1=led[num[x]];elseP1=led[11];delay(10);x++;}x-=8;}}}voiddisplay()//显示时钟及显示调节位{switch(M){case0:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case1:{if(S_flag==1){a[0]=led[hour/10];a[1]=led[hour%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case2:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute/10];a[4]=led[minute%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case3:{if(S_flag==1){a[0]=led[year/10];a[1]=led[year%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}break;case4:{a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];if(S_flag==1){a[3]=led[mon/10];a[4]=led[mon%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}break;case5:{a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];if(S_flag==1){a[6]=led[day/10];a[7]=led[day%10];}else{a[6]=led[11];a[7]=led[11];}}break;case6:{if(S_flag==1){a[0]=led[hour1/10];a[1]=led[hour1%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute1/10];a[4]=led[minute1%10];a[5]=led[10];a[6]=led[11];a[7]=led[11];}break;case7:{a[0]=led[hour1/10];a[1]=led[hour1%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute1/10];a[4]=led[minute1%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[11];a[7]=led[11];}}}voidkey_prc()//时钟和闹钟调节{if(K1==0){delay(10);//延时去抖if(K1==0)//按K1进行模式切换{M++;if(M==8)M=0;}while(!K1);//等待按键释放}if(M!=0){switch(M){case1://模式--调时{if(K2==0){delay(10);//延时去抖if(K2==0)//加键按下{if(hour23)hour++;elsehour=0;}while(!K2);//等待按键释放}if(K3==0){delay(10);if(K3==0){if(hour0)hour--;elsehour=23;}while(!K3);}}break;case2://模式--调分{if(K2==0){delay(10);if(K2==0){if(minute59)minute++;elseminute=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(minute0)minute--;elseminute=59;}while(!K3);}}break;case3://模式--调年{if(K2==0){delay(10);if(K2==0){if(year99)year++;elseyear=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(year0)year--;elseyear=99;}while(!K3);}}break;case4://模式--调月{if(K2==0){delay(10);if(K2==0){if(mon12)mon++;elsemon=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(mon1)mon--;elsemon=12;}while(!K3);}if(year%4==0&&mon==2)day1=29;//闰年2月为29天if(year%4!=0&&mon==2)day1=28;//非闰年2月为28天if(mon==4|mon==6|mon==9|mon==11)day1=30;if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31;}break;case5://模式--调日{if(K2==0){delay(10);if(K2==0){if(dayday1)day++;else{day=1;}}while(!K2);}if(K3==0){delay(10);if(K3==0){if(day1)day--;else{day=day1;}}while(!K3);}}break;case6://模式--闹钟调时{if(K2==0){delay(10);if(K2==0){if(hour123)hour1++;elsehour1=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(hour10)hour1--;elsehour1=23;}while(!K3);}}break;case7://模式--闹钟调分{if(K2==0){delay(10);if(K2==0){if(minute159)minute1++;elseminute1=0;}while(!K2);}if(K3==0){delay(10);//延时去抖if(K3==0)//减键按下{if(minute10)minute1--;elseminute1=59;}while(!K3);}}break;}}}voiddisplay_rq()//年月日显示{if(K2==0){delay(10);if(K2==0){a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}while(!K2);//等待按键释放}}voidkey_prc2()//秒表模式转换{if(M==0){if(K3==0){delay(10);//延时去抖if(K3==0)//按K3进行模式切换{N++;if(N==2)N=0;}while(!K3);//等待按键释放}}}voiddisplay_sec()//秒表显示{if(N==1){a[0]=led[min_m/10];a[1]=led[min_m%10];a[2]=led[10];a[3]=led[sec_m/10];a[4]=led[sec_m%10];a[5]=led[10];a[6]=led[hsec/10];a[7]=led[hsec%10];if(K2==0){delay(10);//延时去抖if(K2==0)//加键按下{TR0=!TR0;}while(!K2);//等待按键释放}}}voidres_sec()//秒表复位{if(K1==0){delay(10);if(K1==0){min_m=0;sec_m=0;hsec=0;M=0;}while(!K1);}}voidmain()//主程序{display_led();init0();init1();while(1){key_prc();key_prc2();if(N==1){display_sec();res_sec();}else{display_rq();display();}}}voidtime1()interrupt3//定时器中断函数{if(year%4==0&&mon==2)
本文标题:8位数码管显示时钟
链接地址:https://www.777doc.com/doc-2224638 .html