#include"clock.h"
#include"utils.h"
#include"digital_seg.h"
mytime NOW,ALARM,*pn=&NOW,*pa=&ALARM;
s_watch STIME,*ps=&STIME;
uchar clock_state,flash_clk,stop_watch,flash_place; //一系列标志位:电子钟状态、闪烁信号、秒表开启标志
uchar th0,tl0,th1,tl1; //定时器预置数变量
uint clk,key_code; //最小时钟信号、按键号
extern uchar place_code[];
//*************************************************************************************************
void init_clock(){
set_mytime(pn,0,0,0);
set_s_watch(ps,0,0,0);
clock_state=flash_clk=stop_watch=0;
key_code=0;
EA=1; //开总中断
ET0=1; //开定时器T0中断
ET1=1; //开定时器T1中断
EX0=1; //开外部中断0允许
IT0=1; //外部中断0下降沿触发
TMOD|=0X11; //T0、T1均工作于工作状态1
buzzer=1; //蜂鸣器赋初值
alarm_light=1; //闹钟指示灯赋初值
th0=(uint)(65536-(10000*11.0592/12))/256; //T0定时10ms,用来计时
tl0=(uint)(65536-(10000*11.0592/12))%256;
// th0=0xdb;
// tl0=0xff;
th1=(uint)(65536-(1517.45*11.0592/12))/256; //T1准备控制蜂鸣器发声“mi”
tl1=(uint)(65536-(1517.45*11.0592/12))%256;
TH0=th0;
TL0=tl0;
TH1=th1;
TL1=tl1;
TR0=1; //开定时器T0
clk=0;
}
//*************************************************************************************************
void set_mytime(mytime *t,int h,m,s){ //自定义结构mytime、s_warch的赋值函数
t->hour=h;
t->min=m;
t->sec=s;
}
void set_s_watch(s_watch *t,int m,s,ds){
t->min=m;
t->sec=s;
t->dsec=ds;
}
//*************************************************************************************************
void display_time(mytime mt){ //时间显示程序
mytime t;
t=mt;
//-----1-----
if(flash_place==1 && flash_clk==1){
DIG=~place_code[1];SEG=0xff;
}
else
display(t.sec%10,1); //秒显示
delay(2);
//-----2-----
if(flash_place==2 && flash_clk==1){
DIG=~place_code[2];SEG=0xff;
}
else
display(t.sec/10,2);
delay(2);
//-----3-----
DIG=~place_code[3]; //分、秒分隔符“-”
if(flash_clk==0) //该分隔符每0.5秒闪一次
SEG=0xbf;
else
SEG=0xff;
delay(2);
//-----4-----
if(flash_place==4 && flash_clk==1){
DIG=~place_code[4];SEG=0xff;
}
else
display(t.min%10,4); //分显示
delay(2);
//-----5-----
if(flash_place==5 && flash_clk==1){
DIG=~place_code[5];SEG=0xff;
}
else
display(t.min/10,5);
delay(2);
//-----6-----
DIG=~place_code[6]; //时、分 分隔符“-”
SEG=0xbf;
delay(2);
//-----7-----
if(flash_place==7 && flash_clk==1){
DIG=~place_code[7];SEG=0xff;
}
else
display(t.hour%10,7); //时显示
delay(2);
//-----8-----
if(flash_place==8 && flash_clk==1){
DIG=~place_code[8];SEG=0xff;
}
else
display(t.hour/10,8);
delay(2);
}
//*************************************************************************************************
void show_ctr(){ //显示函数,在主函数中扫描
switch(clock_state){
case 0: flash_place=0; led0=0;led1=1;led2=1;led3=1;
display_time(NOW); //正常时间显示
break;
case 1: flash_place=0; led0=1;led1=0;led2=1;led3=1;
display_time(STIME); //秒表状态
break;
case 2: led0=1;led1=1;led2=0;led3=1;
display_time(ALARM); //闹钟设置状态
break;
case 3: led0=1;led1=1;led2=1;led3=0;
display_time(NOW); //调表状态
break;
}
if(alarm_light==0){
if(d_time(ALARM,NOW)>=0 && d_time(ALARM,NOW)<5)TR1=1; //到时间时打开定时器1响铃5s
else if(d_time(ALARM,NOW)>=5){
TR1=0;
alarm_light=1;
}
}
}
void button_ctr(){ //按键总控制
uint key;
if(key_code!=0){
key=key_code;
}
if(key==1){
clock_state++;
if(clock_state>=4)clock_state=0;
key=0;
}
switch(clock_state){
case 0: //正常时间显示
break;
case 1: //秒表状态
if(key==4){
stop_watch=!stop_watch;
key=0;
}
if(stop_watch==0){
if(key==3){
set_s_watch(ps,0,0,0);
key=0;
}
}
break;
case 2: //闹钟设置状态
if(key==2){
flash_place++; //SET键设置要调整哪一位
if(flash_place==3 || flash_place==6)flash_place++; //跳过两个分隔符
if(flash_place==9)flash_place=0;
key=0;
}
if(key==3){ //ADD键调整闪烁的那一位数
switch(flash_place){
case 1: ALARM.sec++; if(ALARM.sec>=60)ALARM.sec=0;
break;
case 2: ALARM.sec+=10; if(ALARM.sec>=60)ALARM.sec=0;
break;
case 4: ALARM.min++; if(ALARM.min>=60)ALARM.min=0;
break;
case 5: ALARM.min+=10; if(ALARM.min>=60)ALARM.min=0;
break;
case 7: ALARM.hour++; if(ALARM.hour>=24)ALARM.hour=0;
break;
case 8: ALARM.hour+=10; if(ALARM.hour>=24)ALARM.hour=0;
break;
}
key=0;
}
if(key==4){ //ENSURE键确认
alarm_light=!alarm_light;
key=0;
}
break;
case 3: //调表状态
if(key==2){
flash_place++; //SET键设置要调整哪一位
if(flash_place==3 || flash_place==6)flash_place++; //跳过两个分隔符
if(flash_place==9)flash_place=0;
key=0;
}
if(key==3){ //ADD键调整闪烁的那一位数
switch(flash_place){
case 1: NOW.sec++; if(NOW.sec>=60)NOW.sec=0;
break;
case 2: NOW.sec+=10; if(NOW.sec>=60)NOW.sec=0;
break;
case 4: NOW.min++; if(NOW.min>=60)NOW.min=0;
break;
case 5: NOW.min+=10; if(NOW.min>=60)NOW.min=0;
break;
case 7: NOW.hour++; if(NOW.hour>=24)NOW.hour=0;
break;
case 8: NOW.hour+=10; if(NOW.hour>=24)NOW.hour=0;
break;
}
key=0;
}
if(key==4){ //ENSURE键确认
flash_place=0;
clock_state=0;
key=0;
}
break;
}
}
int d_time(mytime last_t,mytime this_t){ //计算两个时间点之间的时间差(单位为秒)
int h,m,s; //为确定蜂鸣器响的时间做准备
h=this_t.hour-last_t.hour;
m=this_t.min-last_t.min;
s=this_t.sec-last_t.sec;
return h*3600+m*60+s;
}
//*************************************************************************************************
void ex0() interrupt 0{ //外部中断0(按键扫描、控制)
key_search();
button_ctr();
}
void key_search(){ //按键扫描函数
uchar key=P1|0xf0; //由于外部中断是边沿触发
key_code=0; //所以不用判断按键是否抬起
if(key!=0xff){
delay(5);
key=P1|0xf0;
if(key!=0xff){
switch(key){
case 0xfe: key_code=1;break;
case 0xfd: key_code=2;break;
case 0xfb: key_code=3;break;
case 0xf7: key_code=4;break;
}
}
}
}
//*************************************************************************************************
void t0() interrupt 1{ //定时器中断0(时钟、秒表)
TH0=th0;
TL0=tl0;
//--------------------------------------------------------------------flashing
clk++;
if(clk%50==0)
flash_clk=!flash_clk; //分、秒分隔符“-”闪烁效果标志位
//--------------------------------------------------------------------clock
if(clk==100){
clk=0;
NOW.sec++;
}
if(NOW.sec>=60){
NOW.sec=0;
NOW.min++;
}
if(NOW.min>=60){
NOW.min=0;
NOW.hour++;
}
if(NOW.hour>=24)
NOW.hour=0;
//-------------------------------------------------------------------second watch
if(stop_watch==1){
STIME.dsec++;
if(STIME.dsec==100){
STIME.dsec=0;
STIME.sec++;
}
if(STIME.sec>=60){
STIME.sec=0;
STIME.min++;
}
if(STIME.min>=60)
STIME.min=0;
}
}
//**********************************************************************************
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
电子钟.rar (30个子文件)
电子钟
main.OBJ 2KB
clock.OBJ 20KB
clock.Uv2 2KB
digital_seg.OBJ 2KB
digital_seg.__i 41B
clock.Opt 1KB
main.c 844B
utils.OBJ 2KB
电子钟.DSN 123KB
clock.M51 22KB
clock.hex 7KB
电子钟.PWI 792B
main.LST 2KB
clock.c 8KB
digital_seg.c 2KB
clock.lnp 89B
utils.c 521B
clock.LST 22KB
clock.h 775B
STARTUP.A51 6KB
clock_Opt.Bak 2KB
clock_Uv2.Bak 2KB
utils.LST 2KB
utils.h 284B
digital_seg.LST 5KB
clock 22KB
clock.plg 178B
Last Loaded 电子钟.DBK 123KB
clock.__i 35B
digital_seg.h 509B
共 30 条
- 1
RedstormEve
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页