|
//****************頭文件及宏定義*******************************
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
//****************軟件延時(shí)程序*********************************
void delay(uint ii)
{ while(--ii); }
//****************定義數(shù)碼管驅(qū)動(dòng)碼******************************
uchar duan[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,
0XBF,0XFF,0X7F}; //段選,0 1 2 3 4 5 6 7 8 9 - 滅 .
uchar wei[]={0X01,0X02,0X04,0X08,0X10,0X20,0X40,0X80};//位選,共陽,從右至左
//****************定義變量**************************************
uchar t=0,sec=0,min=0,hour=0; //正常走時(shí)時(shí)間變量
uchar sec1=0,min1=0,hour1=0; //時(shí)間設(shè)定值變量
uchar sec2=0,min2=0,hour2=0; //鬧鐘設(shè)定值變量
uchar alarm_en=0; //鬧鐘開關(guān)變量
uchar alarm_flag=0; //鬧鐘定時(shí)到達(dá)標(biāo)志變量
uchar p3=0,moshi=0,mov=0; //P3口查詢,模式值,調(diào)整位
//顯示緩沖區(qū),依次為正常、調(diào)時(shí)、鬧鐘設(shè)定、調(diào)整位帶點(diǎn)標(biāo)記
uchar temp[8],temp1[8],temp2[8],temp3[8];
//****************函數(shù)聲明*************************************
void initialize(void); //初始化
void show(void); //正常走時(shí)顯示
void show1(void); //時(shí)間設(shè)定顯示
void show2(void); //鬧鐘設(shè)定顯示
void show3(void); //調(diào)整位標(biāo)記
void show4(void); //鬧鐘開關(guān)標(biāo)記
void keyscan(void); //鍵盤掃描
void add(void); //調(diào)時(shí)調(diào)鬧鐘加數(shù)程序
void confirm(void); //調(diào)時(shí)確認(rèn),鬧鐘開關(guān)
void alarm_judge(void); //鬧鐘定時(shí)到達(dá)判定
void beep(void); //鬧鐘響鈴程序
//******************主函數(shù)***************************
void main()
{
initialize();
while(1)
{
keyscan();
alarm_judge();
switch(moshi)
{
case 0:show(); show4();break; //顯示正常走時(shí)
case 1:show1();show3();break; //顯示設(shè)置時(shí)間
case 2:show2();show3();break; //顯示鬧鐘時(shí)間
}
if(alarm_flag==1 && alarm_en==1) //定時(shí)時(shí)間到達(dá)且鬧鐘打開
{ beep(); }
}
}
//*****************定時(shí)器初始化**************************
void initialize(void)
{
TMOD = 0x01;
TH0 = 0X3C;
TL0 = 0XB0; //50ms
ET0 = 1;
EA = 1;
TR0 = 1;
P1=0X7F; //初始化時(shí)關(guān)掉蜂鳴器
alarm_flag=alarm_en=0;
}
//*****************定時(shí)器T0中斷服務(wù)程序****************
void Timer0(void) interrupt 1
{
TL0 = 0XB0;
TH0 = 0X3C;
t++;
if(t==20) // (50ms*20=1s)
{ t=0; sec++; }
if(sec==60) // 秒為60,則清零,分加1
{ sec=0; min++; }
if(min==60) // 分為60,則清零,時(shí)加1
{ min=0; hour++;}
if(hour==24) // 時(shí)為24,則清零
{ hour=0;}
if(sec1==60)
{ sec1=0; min1++; }
if(min1==60)
{ min1=0; hour1++;}
if(hour1==24)
{ hour1=0;}
if(sec2==60)
{ sec2=0; min2++; }
if(min2==60)
{ min2=0; hour2++;}
if(hour2==24)
{ hour2=0;}
}
//******************正常時(shí)間顯示程序*******************
void show(void)
{
uchar i=0;
temp[0]=sec%10;
temp[1]=sec/10;
temp[2]=10;
temp[3]=min%10;
temp[4]=min/10;
temp[5]=10;
temp[6]=hour%10;
temp[7]=hour/10;
for(i=0;i<8;i++)
{
P2=wei[i];
P0=duan[temp[i]];
delay(100);
}
}
//******************調(diào)時(shí)模式顯示程序*******************
void show1(void)
{
uchar i=0;
temp1[0]=sec1%10;
temp1[1]=sec1/10;
temp1[2]=10;
temp1[3]=min1%10;
temp1[4]=min1/10;
temp1[5]=11;
temp1[6]=hour1%10;
temp1[7]=hour1/10;
for(i=0;i<8;i++)
{
P2=wei[i];
P0=duan[temp1[i]];
delay(100);
}
}
//******************鬧鐘設(shè)定模式顯示程序*******************
void show2(void)
{
uchar i=0;
temp2[0]=sec2%10;
temp2[1]=sec2/10;
temp2[2]=11;
temp2[3]=min2%10;
temp2[4]=min2/10;
temp2[5]=10;
temp2[6]=hour2%10;
temp2[7]=hour2/10;
for(i=0;i<8;i++)
{
P2=wei[i];
P0=duan[temp2[i]];
delay(100);
}
}
//******************調(diào)整位標(biāo)記顯示程序*******************
void show3(void)
{
uchar movv=0;
switch(mov)
{
case 0:movv=0; break;
case 1:movv=3; break;
case 2:movv=6; break;
}
P2=wei[movv];
P0=duan[12];
delay(100);
}
//*********************鬧鐘開閉顯示程序*******************
void show4(void)
{
if(alarm_en==1)
{
P2=wei[2]+wei[5];
P0=duan[12];
delay(100);
}
}
//******************鍵盤掃描程序***********************
void keyscan(void)
{
P3=0XFF;
p3=P3;
if(p3==0XFF) return;
if(p3==0XFE) //key_mode鍵
{
delay(10);
if(p3==0XFE)
{
moshi++;
if(moshi>=3) moshi=0;
}
while(p3==0XFE) // key_mode鍵按下到彈起期間
{
p3=P3;
switch(moshi)
{
case 0:show(); break; //顯示正常走時(shí)
case 1:show1();break; //顯示設(shè)置時(shí)間
case 2:show2();break; //顯示鬧鐘時(shí)間
}
}
}
if(p3==0XFD) //key_add鍵
{
delay(10);
if(p3==0XFD)
{
add();
}
while(p3==0XFD) // key_add鍵按下到彈起期間
{
p3=P3;
switch(moshi)
{
case 0:show(); break; //顯示正常走時(shí)
case 1:show1();break; //顯示設(shè)置時(shí)間
case 2:show2();break; //顯示鬧鐘時(shí)間
}
}
}
if(p3==0XFB) //key_move鍵
{
delay(10);
if(p3==0XFB)
{
mov++;
if(mov>=3) mov=0;
}
while(p3==0XFB) // key_move鍵按下到彈起期間
{
p3=P3;
switch(moshi)
{
case 0:show(); break; //顯示正常走時(shí)
case 1:show1();break; //顯示設(shè)置時(shí)間
case 2:show2();break; //顯示鬧鐘時(shí)間
}
}
}
if(p3==0XF7) //key_confirm鍵
{
delay(10);
if(p3==0XF7)
{
confirm();
}
while(p3==0XF7) // key_confirm鍵按下到彈起期間
{
p3=P3;
switch(moshi)
{
case 0:show(); break; //顯示正常走時(shí)
case 1:show1();break; //顯示設(shè)置時(shí)間
case 2:show2();break; //顯示鬧鐘時(shí)間
}
}
}
}
//******************調(diào)時(shí)調(diào)腦鐘增數(shù)程序***********************
void add(void)
{
//模式1,調(diào)時(shí)模式,調(diào)時(shí)增數(shù)
if(moshi==1 && mov==0)
{sec1++;}
if(moshi==1 && mov==1)
{min1++;}
if(moshi==1 && mov==2)
{hour1++;}
//模式2,鬧鐘設(shè)定模式,鬧鐘增數(shù)
if(moshi==2 && mov==0)
{sec2++;}
if(moshi==2 && mov==1)
{min2++;}
if(moshi==2 && mov==2)
{hour2++;}
}
//******************確認(rèn)鍵服務(wù)函數(shù)***************************
void confirm(void)
{
if(moshi==1) //模式1,調(diào)時(shí)環(huán)境下校正時(shí)間
{
t=TF0=0;
sec=sec1;
min=min1;
hour=hour1;
sec1=min1=hour1=0;
}
alarm_en++; //開閉鬧鐘
if(alarm_en>1) alarm_en=0;
}
//******************鬧鐘判斷函數(shù)******************************
void alarm_judge(void)
{
if(hour==hour2 && min==min2 && sec==sec2 ) //定時(shí)到達(dá)設(shè)定標(biāo)志
{ alarm_flag=1; }
if(hour==hour2 && min==min2+1) //常規(guī)響鈴一分鐘
{ alarm_flag=0; }
}
//******************鬧鐘響鈴函數(shù)******************************
void beep(void)
{
P1=!P1;
}
|
評(píng)分
-
查看全部評(píng)分
|