- #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;
- }
- }
- }
復制代碼 |