|
#include
#define uchar unsigned char
#define ON 0
#define OFF 1
sbit buzz=P2^1;
sbit key_1=P1^0;
sbit key_2=P1^1;
sbit key_3=P1^2;
sbit key_4=P1^3;
uchar display_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90},
display_sel[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f},
display_bit[8];
char time_hour,time_min,time_sec,time_count;
char alarm_hour,alarm_min,alarm_sec;
uchar mode=1;
uchar station;
uchar disp_flash,disp_bit;
unsigned int time_flash;
bit int_time_on,alarm_time_on;
void delay2ms()
// 延时子程序
{
unsigned char i,ms=2;
while(ms--)
{
for(i = 0; i < 120; i++);
}
}
/*********************************
初始化
*********************************/
void initial()
{
EA=1;
ET0=1;
ET1=1;
TMOD=0X11;
TH0=0X3C; //50ms
TL0=0XB0;
TH1=0Xfc; //1ms
TL1=0X18;
TR0=1;
TR1=1;
buzz=OFF;
}
/*********************************
键盘扫描模块
**********************************/
void key_block()
{
if(!key_1) //模式切换
{
delay2ms();
if(!key_1)
{
mode++;
if(mode==3) mode=1;
while(!key_1);
}
}
if(!key_2) //调整时间位切换
{
delay2ms();
if(!key_2)
{
station++;
if(station!=0)
TR0=0;
if(station==4)
{
station=0;
TR0=1;
}
while(!key_2);
}
}
if(!key_3) //加功能识别
{
delay2ms();
if(!key_3)
{
if(mode==1)
{
switch(station)
{
case 1:time_sec++;
if(time_sec==60) time_sec=0;
break;
case 2:time_min++;
if(time_min==60) time_min=0;
break;
case 3:time_hour++;
if(time_hour==24) time_hour=0;
break;
default:break;
}
}
else if(mode==2)
{
switch(station)
{
case 1:alarm_sec++;
if(alarm_sec==60) alarm_sec=0;
break;
case 2:alarm_min++;
if(alarm_min==60) alarm_min=0;
break;
case 3:alarm_hour++;
if(alarm_hour==24) alarm_hour=0;
break;
default:break;
}
}
while(!key_3);
}
}
if(!key_4) //减功能识别
{
delay2ms();
if(!key_4)
{
if(mode==1)
{
switch(station)
{
case 1:time_sec--;
if(time_sec<0) time_sec=59;
break;
case 2:time_min--;
if(time_min<0) time_min=59;
break;
case 3:time_hour--;
if(time_hour<0) time_hour=23;
break;
default:break;
}
}
else if(mode==2)
{
switch(station)
{
case 1:alarm_sec--;
if(alarm_sec<0) alarm_sec=59;
break;
case 2:alarm_min--;
if(alarm_min<0) alarm_min=59;
break;
case 3:alarm_hour--;
if(alarm_hour<0) alarm_hour=23;
break;
default:break;
}
}
while(!key_4);
}
}
}
/*********************************
显示部分
**********************************/
void display(uchar hour,uchar min,uchar sec)
{
display_bit[7]=display_code[sec%10];
display_bit[6]=display_code[sec/10];
display_bit[5]=0xbf;
display_bit[4]=display_code[min%10];
display_bit[3]=display_code[min/10];
display_bit[2]=0xbf;
display_bit[1]=display_code[hour%10];
display_bit[0]=display_code[hour/10];
}
void time_disp() interrupt 3 using 1 //1ms
{
TH1=0Xfc; //1ms
TL1=0X18;
time_flash++;
if(time_flash==500)
{
time_flash=0;
disp_flash++;
if(disp_flash==2)
disp_flash=0;
}
disp_bit++;
if(disp_bit==8) disp_bit=0;
P3=0xff;
P0=display_bit[disp_bit];
if(station)
{
if(!disp_flash)
P3=display_sel[disp_bit];
else P3=0xff;
}
else P3=display_sel[disp_bit];
}
/*********************************
定时模块
**********************************/
void time0() interrupt 1 using 0
{
TH0=0X3C; //50ms
TL0=0XB0;
time_count++;
if(time_count==20)
{
time_count=0;
time_sec++;
if(time_sec==60)
{
time_sec=0;
time_min++;
if(time_min==60)
{
time_min=0;
time_hour++;
if(time_hour==24) time_hour=0;
}
}
}
}
/*********************************
整点报时和闹钟模块
**********************************/
void time_report()
{
if((time_hour-time_sec)>0) //闹钟鸣叫的次数与小时相等
int_time_on=1;
else int_time_on=0;
if((alarm_hour==time_hour)&&(alarm_min==time_min)&&(alarm_sec==time_sec)) //
当设置的闹钟时间与当前时间相等时,启动闹钟,鸣叫1min
alarm_time_on=0;
if(time_min-alarm_min==1)
alarm_time_on=0;
if(int_time_on||alarm_time_on)
{
if(!disp_flash)
buzz=ON;
else
buzz=OFF;
}
}
void main()
{
initial();
while(1)
{
key_block();
switch(mode)
{
case 1:display(time_hour,time_min,time_sec);
break;
case 2:display(alarm_hour,alarm_min,alarm_sec);
break;
default:break;
}
time_report();
}
}
//为什么整点报时与闹钟模块达不到我想要的效果,想了一个晚上还是想不通.....是初始设置有问题么?
|
|