- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit beer=P1^5;
- //按键加减时分秒
- sbit jk1=P3^0;
- sbit jk2=P3^1;
- sbit jk3=P3^2;
- sbit jk4=P3^3;
- //--定义使用的IO--,也就是译码器的3个输入端//
- #define GPIO_DIG P0
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- //显示时间,初始状态
- uint h=00;
- uint min=00;
- uint miao=00;
- uint hx=13;
- uint minx=0;
- uint miaox=0;
- //计数器计时
- uint jishu1=0;
- uint jishu2=0;
- uint jishu3=0;
- uint bzb=0;
- uint moshi=0 ;//时间设置
- uint moshin=0;//闹钟设置
- //共阴极/*0,1,2,3,4,5,6,7,8,9,*/
- uchar code SEG7[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x50,0x78,};
- uchar gang=0x40;
- //显示缓冲
- uchar num[]={0,0,0,0,0,0,0,0};
-
- //延时函数ms
- void _delay_ms(uint i)
- {
- uchar j;
- for(;i>0;i--)
- {
- for(j=0;j<120;j++);
- }
- }
- //延时函数us
- void _delay_us(uchar i)
- {
- for(;i>0;i--){;}
- }
- //使用数码管显示
- void display()
- {
- unsigned char i;
- unsigned int j;
- for(i=0;i<8;i++)
- {
- switch(i) //位选,选择点亮的数码管,
- {
- case(7):
- LSA=0;LSB=0;LSC=0; break;//显示第0位
- case(6):
- LSA=1;LSB=0;LSC=0; break;//显示第1位
- case(5):
- LSA=0;LSB=1;LSC=0; break;//显示第2位
- case(4):
- LSA=1;LSB=1;LSC=0; break;//显示第3位
- case(3):
- LSA=0;LSB=0;LSC=1; break;//显示第4位
- case(2):
- LSA=1;LSB=0;LSC=1; break;//显示第5位
- case(1):
- LSA=0;LSB=1;LSC=1; break;//显示第6位
- case(0):
- LSA=1;LSB=1;LSC=1; break;//显示第7位
- }
- GPIO_DIG=num[i];//发送段码
- j=70; //扫描间隔时间设定
- while(j--);
- GPIO_DIG=0x00;//消隐
- }
- }
- void beerc()//闹钟响
- {
- beer=1; _delay_ms(30);_delay_us(30);beer=0;
- }
- //显示数据处理
- void shuju()
- {
- if((moshi==0)&&(moshin==0))
- {
- //载入数码管显示当前时间
- num[0]=SEG7[h%100/10];
- num[1]=SEG7[h%10]&0x7f;
- num[2]=0x40;//显示横杆 美观作用
- num[3]=SEG7[min%100/10];
- num[4]=SEG7[min%10]&0x7f;
- num[5]=0x40;
- num[6]=SEG7[miao%100/10];
- num[7]=SEG7[miao%10];
- }
- if(moshi==1)
- {
- //载入数码管显示设置时
- if(jishu2<10)num[0]=SEG7[h%100/10]; else num[0]=0;
- if(jishu2<10)num[1]=SEG7[h%10]; else num[1]=0;
- num[2]=0x40;
- num[3]=SEG7[min%100/10];
- num[4]=SEG7[min%10]&0x7f;
- num[5]=0x40;
- num[6]=SEG7[miao%100/10];
- num[7]=SEG7[miao%10];
- }
- if(moshi==2)
- {
- //载入数码管显示设置分
- num[0]=SEG7[h%100/10];
- num[1]=SEG7[h%10]&0x7f;
- num[2]=0x40;
- if(jishu2<10)num[3]=SEG7[min%100/10]; else num[3]=0;
- if(jishu2<10)num[4]=SEG7[min%10]; else num[4]=0;
- num[5]=0x40;
- num[6]=SEG7[miao%100/10];
- num[7]=SEG7[miao%10];
- }
- if(moshi==3)
- {
- //载入数码管显示设置秒
- num[0]=SEG7[h%100/10];
- num[1]=SEG7[h%10]&0x7f;
- num[2]=0x40;
- num[3]=SEG7[min%100/10];
- num[4]=SEG7[min%10]&0x7f;
- num[5]=0x40;
- if(jishu2<10)num[6]=SEG7[miao%100/10];else num[6]=0;
- if(jishu2<10)num[7]=SEG7[miao%10]; else num[7]=0;
- }
- if(moshin==1)
- {
- //载入数码管显示设置时
- if(jishu2<10)num[0]=SEG7[hx%100/10]; else num[0]=0;
- if(jishu2<10)num[1]=SEG7[hx%10]; else num[1]=0;
- num[2]=0x40;
- num[3]=SEG7[minx%100/10];
- num[4]=SEG7[minx%10];
- num[5]=0x00;
- num[6]=0x00;
- num[7]=0x00;
- beer=0;
- }
- if(moshin==2)
- {
- //载入数码管显示设置分
- num[0]=SEG7[hx%100/10];
- num[1]=SEG7[hx%10]&0x7f;
- num[2]=0x40;
- if(jishu2<10)num[3]=SEG7[minx%100/10]; else num[3]=0;
- if(jishu2<10)num[4]=SEG7[minx%10]&0x7f; else num[4]=0;
- num[5]=0x00;
- num[6]=0x00;
- num[7]=0x00;
- beer=0;
-
- }
- }
- //按键处理函数
- void key()
- {
- //切换
- if((jk1==0)&&(moshin==0)){moshi=(moshi+1)%4;beerc();while(jk1==0);}
- if(moshi==1)
- {
- //判断加小时按键是否按下
- if(jk2==0){if(h<23)h=h+1;else h=0; while(jk2==0);}
- //判断减小时按键是否按下
- if(jk3==0){if(h> 0)h=h-1;else h=23;while(jk3==0);}
- }
- if(moshi==2)
- {
- //判断加分钟按键是否按下
- if(jk2==0){if(min<59)min=min+1;else min=0; while(jk2==0);}
- //判断减分钟按键是否按下
- if(jk3==0){if(min> 0)min=min-1;else min=59;while(jk3==0);}
- }
- if(moshi==3)
- {
- //判断加秒钟按键是否按下
- if(jk2==0){if(miao<59)miao=miao+1;else miao=0; while(jk2==0);}
- //判断减秒钟按键是否按下
- if(jk3==0){if(miao> 0)miao=miao-1;else miao=59;while(jk3==0);}
- }
- //切换
- if((jk4==0)&&(moshi==0)){moshin=(moshin+1)%3;beerc();while(jk4==0);}
- //------------------------------
- if(moshin==1)
- {
- //判断加小时按键是否按下
- if(jk2==0){if(hx<23)hx=hx+1;else hx=0; while(jk2==0);}
- //判断减小时按键是否按下
- if(jk3==0){if(hx> 0)hx=hx-1;else hx=23;while(jk3==0);}
- }
- if(moshin==2)
- {
- //判断加分钟按键是否按下
- if(jk2==0){if(minx<59)minx=minx+1;else minx=0; while(jk2==0);}
- //判断减分钟按键是否按下
- if(jk3==0){if(minx> 0)minx=minx-1;else minx=59;while(jk3==0);}
- }
- }
- //主函数-
- void main(void)
- {
- P1=0X0F;
- //-------定时器0配置
- TMOD=0x01;
- //使能定时器0 ,打开中断
- ET0=1;
- //定时器的初值
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- //启动启定时器0
- TR0=1;
- //开总中断
- EA=1;
- beer=0;
- while(1)
- {
- shuju(); //显示数据处理
- display(); //显示子函数
- key(); //-按键处理
- }
- }
- //定时器中断计时
- void Time0() interrupt 1
- {
- //重装初值50ms;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- //时间缓冲+1;
- if((moshi==0))jishu1=jishu1+1;
- if(jishu1>=20) //判断是否到达一秒
- {
- jishu1=0;
- miao++;
- //判断到达60s
- if(miao>59)
- {//分钟加1
- min++;
- miao=0;
- //判断到达60分
- if(min>59)
- {//小时加1
- h=h+1;
- min=0;
- }
- if(h==24)h=0;
- }
- if((h==hx)&&(min==minx)&&(miao==miaox)) bzb=1;
- }
- if((moshi>0)||(moshin>0))jishu2=(jishu2+1)%20;
- //闹钟
- if((bzb==1))
- {
- jishu3=jishu3+1;
- beer=!beer;
- if(jishu3>200)
- {
- jishu3=0;bzb=0;beer=0;
- }
- }
- }
复制代码 |