#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #include sbit duan=P2^2;//定义锁存使能端口 段锁存 sbit wei=P2^3;// 位锁存 sbit key1 = P1^1; sbit key2 = P1^2; sbit key3 = P1^3; sbit key4 = P1^4; unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code weima[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char temp[8]; //存储显示值的全局变量 char hour; minute; second, num, t, i; void delay(unsigned int t); //函数声明 void Display(unsigned char FirstBit,unsigned char Num); void initial(); void delay20ms(); void keyscan(); void caifen(); void display(); /*------------------------------------------------ 主函数 ------------------------------------------------*/ main() { initial(); while(1) { keyscan(); caifen(); display(); } } void initial() { TMOD = 0x01; TH0 = (65536 - 2000)/256; TL0 = (65536 - 2000)%256; EA = 1; TR0 = 1; ET0 = 1; hour = 23; minute = 59; second = 57; } void time0(void) interrupt 1 { TH0 = (65536 - 2000)/256; TL0 = (65536 - 2000)%256; num ++; if (num == 500) { num = 0; second ++; if (second == 60) { second = 0; minute ++; if (minute == 60) { minute = 0; hour ++; if (hour == 24) { hour = 0; } } } } } void keyscan() { if(key1 == 0) { delay20ms(); while(key1 == 0); TR0 = 0; t ++; } switch(t) { case 1: if(key2 == 0) { delay20ms(); if(key2 == 0) { while(key2 == 0); hour ++; if(hour == 24) { hour = 0; } } } if(key3 == 0) { delay20ms(); if(key3 == 0) { while(key3 == 0); hour --; if(hour == -1) { hour =23; } } } break; case 2: if(key2 == 0) { delay20ms(); if(key2 == 0) { while(key2 == 0); minute ++; if(minute == 60) { minute = 0; } } } if(key3 == 0) { delay20ms(); if(key3 == 0) { while(key3 == 0); minute --; if(minute == -1) { minute = 59; } } } break; case 3: TR0 = 1; t = 0; break; default: break; } } void caifen() { temp[0]=duanma[hour/10]; //时 //数据的转换,因我们采用数码管0~9的显示,将数据分开 temp[1]=duanma[hour%10]; temp[2]=0x40; //加入"-" temp[3]=duanma[minute/10];//分 temp[4]=duanma[minute%10]; temp[5]=0x40; temp[6]=duanma[second/10];//秒 temp[7]=duanma[second%10]; } void display() { for (i = 0; i < 8; i ++) { wei=1; //位锁存 P0=weima[i]; //取位码 wei=0; duan=1; //段锁存 P0=temp[i]; //取显示数据,段码 duan=0; delay(310); } } void delay20ms(void) //误差 20us { unsigned char a,b; for(b=215;b>0;b--) for(a=45;a>0;a--); _nop_; //if Keil,require use intrins.h _nop_; //if Keil,require use intrins.h } void delay(unsigned int i) { while (i --); }