#include<reg51.h>
sbit key_1=P1^0 ; //秒、分、時間的切換鍵
sbit key_2=P1^1 ; //加1
sbit key_3=P1^2 ; //減1
sbit key_4=P1^3 ; //ok
sbit speaker_= P3^1;
unsigned char code table1[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //筆段碼
unsigned char code table2[ ]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; //位選碼
unsigned char count1=0 ;
/****************************************************/
unsigned char hour = 12, min = 0,sec = 0; //時鐘賦初值
/******************T0__50mS中斷程序*******************/
void T0_1s(void) interrupt 1 // 50mS中斷程序
{
static unsigned char count = 0;
TR0 = 0;
TH0 = (65536 - 50000 ) / 256; //設置T0初始值為:15536
TL0 = (65536 - 50000 ) % 256; //記數為50000次//50000*1us=50ms*20=1s
TR0 = 1;
count++;
if(count == 20) //中斷服務程序
{ //定時1s時間到(需要中斷20次)
count = 0;
sec++;
if(sec==60) //1分鐘時間到
{
sec=0;
min++;
if(min==60) //1小時時間到
{
min=0;
hour++;
if(hour==24) //24小時時間到
{
sec =0;
min =0;
hour=0;
}
}
}
}
}
/**************************************************************/
void delay_5ms() //動態掃描顯示--軟件延時
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<50;j++) //50
;
}
void delay_500ms() //500ms延時
{
unsigned char a,b;
for(a=500;a>0;a--)
for(b=110;b>0;b--) //500
;
}
/*****************************************************************/
void disp_led()
{
/****************顯示時鐘 ******************************/
P0=table1[hour/10]; //顯示小時十位數
P2=table2[0];
delay_5ms();
P0=0xff; //共陽空字形
P0=table1[hour%10]; //顯示小時個位數
P2=table2[1];
delay_5ms();
P0=0xff;
P0=0xbf; //顯示分隔符'-'
P2=table2[2];
delay_5ms();
P0=0xff;
P0=table1[min/10]; //顯示分鐘十位數
P2=table2[3];
delay_5ms();
P0=0xff;
P0=table1[min%10]; //顯示分鐘個位數
P2=table2[4];
delay_5ms();
P0=0xff;
P0=0xbf; //顯示分隔符'-'
P2=table2[5];
delay_5ms();
P0=0xff;
P0=table1[sec/10]; //顯示秒十位數
P2=table2[6];
delay_5ms();
P0=0xff;
P0=table1[sec%10]; //顯示秒個位數
P2=table2[7];
delay_5ms();
P0=0xff;
}
/*******************鬧鐘程序****************************/
void clock()
{ unsigned int i;
if(hour==12 && min==0 && sec==30)
{ speaker_=0;
for(i=0;i<500;i++) //15秒蜂鳴器
{
disp_led();
}
speaker_=1;
}
}
/*********************蜂鳴器按鍵聲*****************************/
void speak()
{ unsigned char m;
speaker_=0;
for(m=0;m<3;m++)
{
disp_led();
}
speaker_=1;
}
/********************按鍵掃描程序***************************/
void delay_10ms() //鍵盤去抖動--軟件延時
{
unsigned char i,j;
for(i=0;i<20;i++)
for(j=0;j<40;j++)
;
}
/*******************調時鐘按鍵掃描*******************************/
void key_scan() //鍵盤掃描子程序
{
if(key_1==0) //檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_1==0) //再次確認否有鍵按下
{ { speak();
count1++; //切換次數
TR0=0; //關計時
// ET0=0;
}
if(count1==4)
{ count1=0; //到4次后重新記
TR0=1; //開計時
ET0=1;
}
}
while(key_1==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(count1==1)
{ if(key_2==0) //調整秒鐘加//檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_2==0) //再次確認否有鍵按下
{ speak(); //按鍵聲
sec++;
if(sec==60) sec=0;
}
while(key_2==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(key_3==0) //調整秒鐘減//檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_3==0) //再次確認否有鍵按下
{ speak();
sec--;
if(sec==-1) sec=59;
}
while(key_3==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(key_4==0)// ok鍵//
{
delay_10ms();
if(key_4==0)
{count1= 0;TR0=1;}
}
}
if(count1==2)
{
if(key_2==0) //調整分鐘加//檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_2==0) //再次確認否有鍵按下
{ speak();
min++;
if(min==60) min=0;
}
while(key_2==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(key_3==0) //調整分鐘減//檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_3==0) //再次確認否有鍵按下
{ speak();
min--;
if(min==-1) min=59;
}
while(key_3==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(key_4==0)//調時結束鍵//
{
delay_10ms();
if(key_4==0)
{
count1 = 0; TR0=1; }
}
}
if(count1==3)
{ if(key_2==0) //調整小時加//檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_2==0) //再次確認否有鍵按下
{ speak();
hour++;
if(hour==24)
{ hour=0;
min=0;
sec=0;
}
}
while(key_2==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(key_3==0) //調整小時減//檢測是否有鍵按下
{
delay_10ms(); //去抖動延時
if(key_3==0) //再次確認否有鍵按下
{ speak();
hour--;
if(hour==-1) hour=23;
}
while(key_3==0) disp_led(); //等待按鍵釋放,并且調用顯示程序
}
if(key_4==0)//調時結束鍵//
{
delay_10ms();
if(key_4==0)
{
count1 = 0; TR0=1; }
}
}
}
/*********************主函數***********************/
void main()
{
TMOD = 0x01;
TH0 = (65536 - 50000 ) / 256; //設置T0初始值
TL0 = (65536 - 50000 ) % 256;
ET0 = 1; //開中斷
EA = 1; //開CPU
TR0 = 1; //開定時
while(1)
{
disp_led(); //時鐘顯示
key_scan(); //時鐘掃描
// clock(); //鬧鐘
}
}
|