- #include<reg52.h>
- #define uint unsigned int
- #define uchar unsigned char
- sbit wei=P2^0;
- sbit duan=P2^1;
- sbit k1=P1^0;
- sbit k2=P1^1;
- uchar table[]={0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x40};
- uchar num,num1,num2,shi,fen,miao,m,s;
- // 定义
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- // 延时函数
- void display_shi(uchar shi)
- {
- duan=1;
- P0=table[shi/10];
- duan=0;
- wei=1;
- P0=0xfe;
- wei=0;
- delay(1);
- P0=0;
- duan=1;
- P0=table[shi%10];
- duan=0;
- wei=1;
- P0=0xfd;
- wei=0;
- delay(1);
- P0=0;
- }
- // 显示小时
- void display_fen(uchar fen)
- {
- duan=1;
- P0=table[fen/10];
- duan=0;
- wei=1;
- P0=0xf7;
- wei=0;
- delay(1);
- P0=0;
- duan=1;
- P0=table[fen%10];
- duan=0;
- wei=1;
- P0=0xef;
- wei=0;
- delay(1);
- P0=0;
- }
- // 显示分钟
- void display_miao(uchar miao)
- {
- duan=1;
- P0=table[miao/10];
- duan=0;
- wei=1;
- P0=0xbf;
- wei=0;
- delay(1);
- P0=0;
- duan=1;
- P0=table[miao%10];
- duan=0;
- wei=1;
- P0=0x7f;
- wei=0;
- delay(1);
- P0=0;
- }
- // 显示秒数
- void display_sf()
- {
- duan=1;
- P0=table[10];
- duan=0;
- wei=1;
- P0=0xfb;
- wei=0;
- delay(1);
- P0=0;
- }
- // 时与分间的横线
- void display_fm()
- {
- duan=1;
- P0=table[10];
- duan=0;
- wei=1;
- P0=0xdf;
- wei=0;
- delay(1);
- P0=0;
- }
- // 分与秒间的横线
- void display_shi0()
- {
- duan=1;
- P0=0;
- duan=0;
- wei=1;
- P0=0x3f;
- wei=0;
- delay(1);
- P0=0;
- }
- // 小时位置不显示
- void display_fen0()
- {
- duan=1;
- P0=0;
- duan=0;
- wei=1;
- P0=0xe7;
- wei=0;
- delay(1);
- P0=0;
- }
- // 分钟位置不显示
- void display_miao0()
- {
- duan=1;
- P0=0;
- duan=0;
- wei=1;
- P0=0xfc;
- wei=0;
- delay(1);
- P0=0;
- }
- // 秒位置不显示
- void display_1()
- {
- display_shi(shi);
- display_sf();
- display_fen(fen);
- display_fm();
- display_miao(miao);
- }
- // 正常显示
- void display_2()
- {
- if(m==1&&num2%2!=0)
- {
- display_shi(shi);
- display_sf();
- display_fen(fen);
- display_fm();
- display_miao0();
- }
- if(m==2&&num2%2!=0)
- {
- display_shi(shi);
- display_sf();
- display_fen0();
- display_fm();
- display_miao(miao);
- }
- if(m==3&&num2%2!=0)
- {
- display_shi0();
- display_sf();
- display_fen(fen);
- display_fm();
- display_miao(miao);
- }
- while(num2%2==0)
- display_1();
- }
- // 设计时显示函数
- void fun()
- {
- if(miao==60)
- {
- miao=0;
- fen++;
- }
- if(fen==60)
- {
- fen=0;
- shi++;
- }
- if(shi==24)
- shi=0;
- }
- // 进位函数
- void init()
- {
- shi=0;
- fen=0;
- miao=0;
- m=0;
- s=0;
- num=0;
- num1=0;
- num2=0;
- TMOD=0x01;
- TH0=(65536-46074)/256; // 11.05768M.
- TL0=(65536-46074)%256;
- TH1=(65536-56074)/256;
- TL1=(65536-56074)%256;
- EA=1; // 打开中断允许
- ET0=1;
- ET1=1; // 开起计数器0
- EX0=1;
- TR0=1; // 开起定时器0
- }
- // 初始化函数
- void keyboard()
- {
- if(k1==0)
- delay(5);
- if(k1==0)
- { TR0=0;
- TR1=1;
- m++;
- if(m==4)
- {
- m=0;
- TR1=0;
- TR0=1;
- }
- while(!k1)display_1();
- }
- if(m!=0)
- {
- if(k2==0)
- {
- delay(5);
- s=1;
- if(m==1&&s!=0)
- {
- miao++;
- s=0;
- fun();
- }
- if(m==2&&s!=0)
- {
- fen++;
- s=0;
- fun();
- }
- if(m==3&&s!=0)
- {
- shi++;
- s=0;
- fun();
- }
- while(!k2)display_1();
- }
- }
- }
- // 键盘处理函数
- void main()
- {
- init();
- while(1)
- {
- keyboard();
- if(num==20)
- {
- num=0;
- miao++;
- fun();
- }
- if(m!=0)
- display_2();
- else
- display_1();
- }
- }
- // 主函数
- void time_0() interrupt 1
- {
- TH0=(65536-46074)/256;
- TL0=(65536-46074)%256;
- num++;
- }
- // 定时器1,非设计时使用
- void time_1() interrupt 3
- {
- TH1=(65536-56074)/256;
- TL1=(65536-56074)%256;
- num1++;
- if(num1==20)
- {
- num1=0;
- num2++;
- }
- }
- // 定时器2,设计时使用
-
-
- 这个程序虽比师哥的还差点,但是我会好好努力的!!
复制代码
|