#include"reg52.h"
#define shuma P0
#define uchar unsigned char
#define uint unsigned int
uchar table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar count=0;
uchar sec=0;
uchar min=25;
uchar hou=14;
uchar Nhou=14,Nmin=26; /*****闹钟时间*****/
uchar key_num,flag;
sbit smg_a=P1^0;
sbit smg_d=P1^1;
sbit smg_g=P1^2;
sbit smg_h=P1^3;
sbit keystop=P3^3;
sbit keycon=P3^4;//控制启动和停止定时器
sbit key_set=P3^5;//多功能键调时模式选择
sbit key_up=P3^6;
sbit key_down=P3^7;
sbit SPK = P1^5;//闹钟蜂鸣器
void init();
void keyscan();
void didi();
void display(uchar shi,uchar fen);
void naozhong();
/**********延时子程序**********/
void delay10ms(void)
{
uchar i,j;
for(i=20;i>0;i--)
for(j=248;j>0;j--);
}
void delay_ms(uint ms)
{
uint i,j;
for (i=ms;i>0;i--)
for(j=124;j>0;j--);
}
void delay(void)
{
uchar i=10;
while(i--);
}
void main(void)
{
init(); //调用初始化程序
while(1)
{
keyscan();
if(count==20)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hou++;
if(hou==24)
{
hou=0;
}
}
}
}
display(hou,min);
naozhong();
}
}
/********按键处理子程序******************/
void keyscan() //时间调节子程序
{
if(keycon==0)
{
delay10ms(); //去抖动
if(keycon==0)
{
while(!keycon)
TR0=~TR0;//按键启动和停止计数器T0
}
}
if(key_set==0)
{
delay10ms();
if(key_set==0)
{
while(!key_set);
SPK=0;
delay_ms(15);
SPK=1;
key_num++;
if(key_num==3)
{
key_num=0;
//TR0=1;
}
}
}
if(key_num!=0)
{
if(key_up==0) //+键检测
{
delay10ms();
if(key_up==0)
{
while(!key_up);
SPK=0;
delay_ms(15);
SPK=1;
if(key_num==1)
{
min++; //分钟加一
if(min==60)
min=0;
}
if(key_num==2)
{
hou++; //时钟加一
if(hou==24)
hou=0;
}
}
}
if(key_down==0)//-键检测
{
delay10ms();
if(key_down==0)
{
while(!key_down);
SPK=0;
delay_ms(15);
SPK=1;
if(key_num==1)
{
min--;
if(min==-1)
min=59;
}
if(key_num==2)
{
hou--;
if(hou==-1)
hou=23;
}
}
}
}
}
//*******闹钟功能(到点了蜂鸣器响)*************//
void naozhong()//闹钟功能
{
if(hou==Nhou&&min==Nmin)
{
flag=1;
}
if(flag==1)
{
didi();
}
}
void didi()
{
SPK=0;
delay_ms(10);
}
/*****初始化子程序******/
void init()
{
key_set=key_up=key_down=1;
count=0;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
/*****定时器0中断函数*****/
void timer() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
/******显示子程序*******/
void display(uchar hou,uchar min)
{
smg_a=0;
shuma=table[hou/10];
delay();
shuma=0xff;
smg_a=1;
smg_d=0;
shuma=table[hou%10];
if(count>=10)//小数点半秒交替显示
shuma&=0x7f;
delay();
shuma=0xff;
smg_d=1;
smg_g=0;
shuma=table[min/10];
delay();
shuma=0xff;
smg_g=1;
smg_h=0;
shuma=table[min%10];
delay();
shuma=0xff;
smg_h=1;
}