第八届——电子钟
#include "sys.h"
#include "seg.h"
#include "key.h"
#include "ds18b20.h"
#include "ds1302.h"
extern bit set=0;
extern u8 yi,er,san,si,wu,liu,qi,ba;
extern u8 alarm_set=0;
extern u8 clock_set=0;
extern bit clock_show=1;
extern bit alarm_show=0;
u8 temperature;
u8 alarm[7];
bit led=0;
bit led_shanshuo=0;
bit led_flag=0;
bit wendu_flag=0;
bit wendu_show=0;
void Timer0Init(void) //2毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x9A; //设置定时初值
TH0 = 0xA9; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
}
void main()
{
All_Init();
Timer0Init();
Init_1302();
while(1)
{
LedShow();
keydriver();
Time_Get();
if(wendu_flag==1)
{
wendu_flag=0;
temperature=Temp_Get();
}
if((time[2]==alarm[2])&&(time[1]==alarm[1])&&(time[0]==alarm[0]))
{
if(led_flag==0)
{
led=1;
}
}
if(clock_show==1&&wendu_show==0)
{
if(set==0)
{
yi=time[2]/10;er=time[2]%10;san=10;
si=time[1]/10;wu=time[1]%10;liu=10;
qi=time[0]/10;ba=time[0]%10;
}
else if(set==1)
{
if(clock_set==0)
{
if(time[0]%2==0)
{
yi=time[2]/10;er=time[2]%10;san=10;
si=time[1]/10;wu=time[1]%10;liu=10;
qi=time[0]/10;ba=time[0]%10;
}
else if(time[0]%2!=0)
{
yi=11;er=11;san=10;
si=time[1]/10;wu=time[1]%10;liu=10;
qi=time[0]/10;ba=time[0]%10;
}
}
else if(clock_set==1)
{
if(time[0]%2==0)
{
yi=time[2]/10;er=time[2]%10;san=10;
si=time[1]/10;wu=time[1]%10;liu=10;
qi=time[0]/10;ba=time[0]%10;
}
else if(time[0]%2!=0)
{
yi=time[2]/10;er=time[2]%10;san=10;
si=11;wu=11;liu=10;
qi=time[0]/10;ba=time[0]%10;
}
}
else if(clock_set==2)
{
if(time[0]%2==0)
{
yi=time[2]/10;er=time[2]%10;san=10;
si=time[1]/10;wu=time[1]%10;liu=10;
qi=time[0]/10;ba=time[0]%10;
}
else if(time[0]%2!=0)
{
yi=time[2]/10;er=time[2]%10;san=10;
si=time[1]/10;wu=time[1]%10;liu=10;
qi=11;ba=11;
}
}
}
}
else if(alarm_show==1&&wendu_show==0)
{
if(alarm_set==1)
{
if(time[0]%2==0)
{
yi=alarm[2]/10;er=alarm[2]%10;san=10;
si=alarm[1]/10;wu=alarm[1]%10;liu=10;
qi=alarm[0]/10;ba=alarm[0]%10;
}
else if(time[0]%2!=0)
{
yi=11;er=11;san=10;
si=alarm[1]/10;wu=alarm[1]%10;liu=10;
qi=alarm[0]/10;ba=alarm[0]%10;
}
}
if(alarm_set==2)
{
if(time[0]%2==0)
{
yi=alarm[2]/10;er=alarm[2]%10;san=10;
si=alarm[1]/10;wu=alarm[1]%10;liu=10;
qi=alarm[0]/10;ba=alarm[0]%10;
}
else if(time[0]%2!=0)
{
yi=alarm[2]/10;er=alarm[2]/10;san=10;
si=11;wu=11;liu=10;
qi=alarm[0]/10;ba=alarm[0]%10;
}
}
if(alarm_set==3)
{
if(time[0]%2==0)
{
yi=alarm[2]/10;er=alarm[2]%10;san=10;
si=alarm[1]/10;wu=alarm[1]%10;liu=10;
qi=alarm[0]/10;ba=alarm[0]%10;
}
else if(time[0]%2!=0)
{
yi=alarm[2]/10;er=alarm[2]/10;san=10;
si=alarm[1]/10;wu=alarm[1]/10;liu=10;
qi=11;ba=11;
}
}
}
else if(wendu_show==1)
{
yi=11;er=11;san=11;si=11;wu=11;
liu=temperature/10;qi=temperature%10;ba=12;
}
}
}
void Timer0() interrupt 1
{
static u16 led_count=0,lednum_count=0;
static u8 wendu_count=0;
wendu_count++;
if(wendu_count==100)
{
wendu_count=0;
wendu_flag=1;
}
else if(led==1)
{
led_count++;
lednum_count++;
if(led_count==100)
{
led_count=0;
if(led_shanshuo==0)
{
led_shanshuo=1;
P2=(P2&0X1F)|0X80;
P0=0XFE;
P2&=0X1F;
}
else if(led_shanshuo==1)
{
led_shanshuo=0;
P2=(P2&0X1F)|0X80;
P0=0XFF;
P2&=0X1F;
}
}
if(lednum_count==2500)
{
lednum_count=0;
led_flag=1;
led=0;
P2=(P2&0X1F)|0X80;
P0=0XFF;
P2&=0X1F;
}
}
LedScan();
keyscan();
}
/*KEY*/
#include <key.h>
#include <ds1302.h>
#include "seg.h"
extern u8 yi,er,san,si,wu,liu,qi,ba;
extern u8 clock_set; //时钟设定时分秒标志位
extern u8 alarm_set; //闹钟设定时分秒标志位
extern bit clock_show; //时钟显示界面标志
extern bit alarm_show; //闹钟显示界面标志
extern bit wendu_show;
extern bit led; //闹钟提示灯
extern bit led_flag; //灯亮了五秒标志位
extern bit set; //时钟设置界面标志位
u8 time_init[7]; //时钟时间数组及初始时间数组
extern u8 alarm[7]; //闹钟时间数组
u8 keysta[4]={1,1,1,1};
u8 keycodemap[4]={1,2,3,4};
u8 keydowntime[]={0,0,0,0};
void keydriver()
{
u8 i;
static u8 backup[]={1,1,1,1};
static u8 timestr[]={1000,1000,1000,1000};
for(i=0;i<4;i++)
{
if(keysta[i]!=backup[i])
{
if(backup[i]!=0)
{
keyaction(keycodemap[i]);
}
backup[i]=keysta[i];
}
else if(keydowntime[i]>timestr[i])
{
if(i==3)
{
keyaction(keycodemap[i]);
timestr[i]+=4;
}
}
}
}
void keyscan()
{
u8 i;
static u8 keybuff[]={0xff,0xff,0xff,0xff};
keybuff[0]=(keybuff[0]<<1)|S7;
keybuff[1]=(keybuff[1]<<1)|S6;
keybuff[2]=(keybuff[2]<<1)|S5;
keybuff[3]=(keybuff[3]<<1)|S4;
for(i=0;i<4;i++)
{
if(keybuff[i]==0xff)
{
keysta[i]=1;
keydowntime[i]=0;
if(i==3)
{
wendu_show=0;
}
}
else if(keybuff[i]==0x00)
{
keysta[i]=0;
keydowntime[i]+=200;
}
else{}
}
}
void keyaction(u8 keycode)
{
if(keycode==1)
{
if(led==1) //判断闹钟时间是否到了,到了随机按下按键即停止小灯闪烁
{
led=0;
led_flag=1;
P2=(P2&0x1f)|0x80;
P0=0XFF;
P2&=0X1F;
}
else if(clock_show==1)
{
if(set==0) //如果在非设置界面 切换到设置界面
{
set=1;
}
else if(set==1)
{
if(clock_set==0) //当前设置在时,按一下在分
{
clock_set=1;
}
else if(clock_set==1) //当前设置在分,按一下在秒
{
clock_set=2;
}
else if(clock_set==2)
{
clock_set=0;
set=0; //最后回到非设置界面
}
}
}
}
if (keycode==2)
{
if(led==1) //判断闹钟时间是否到了,到了随机按下按键即停止小灯闪烁
{
led=0;
led_flag=1;
P2=(P2&0x1f)|0x