/*
menunum说明:
0:主界面-时间显示
1:日期显示
2:alarm
3: 倒计时设置
4:倒计时启用
5:秒表功能
6:存储1
7:存储2
8:存储3
menustate说明:
0:显示状态
1:设置右边部分(秒、日)
2:设置中间部分(分、月)
3:设置左边部分(时、年)
4:确认闪烁状态
*/
#include "menu.h"
#include "PCF8563.h"
#include <reg2051.h>
#define TOTALMENU 9
#define TOTALSTATE 5
sbit BEEP=P3^7;
extern unsigned char alarm_state;
extern unsigned char alarm[3];
unsigned char cd_time[3]={0,0,0};
unsigned char cu_time[3]={0,0,0};
extern unsigned char second;
extern unsigned char s100ms;
unsigned char alarm_ask_ring=0;//1-ask ring 0-no
unsigned char counter_ask_ring=0;
unsigned char cd_state=0;//倒计时状态
unsigned char cu_state=0;//秒表状态 0-停止 1-计时 2-停止 3-清零确认
void menu(unsigned char getkey,unsigned char wei[],unsigned char timeinfo[])
{
unsigned char disp[8];//0~1:left 3~4 mid 6~7 right
static unsigned char menunum;
static unsigned char menustate;
static unsigned char ring_pause=0;//0-ring 1-stop ring
static unsigned char settime[3];//三部分 时分秒 年月日
static unsigned char counter[3][3]={{0,0,0},{0,0,0},{0,0,0}};
static unsigned char flash;//闪烁计数器
// unsigned char write_data;
switch (getkey)
{
case 0:
{
// if((timeinfo[2] & 0x7f)==(alarm[1]&0x7f) && (timeinfo[1] & 0x7f)==(alarm[0]&0x7f) && (alarm[2]&0xf)==0x01) //检测闹钟时间
// {
// if(!ring_pause)
// alarm_state=1;
// else
// alarm_state=0;
// }
// else
// {
// ring_pause=0;
// alarm_state=0;
// }
if((timeinfo[2] & 0x7f)==(alarm[1]&0x7f) && (timeinfo[1] & 0x7f)==(alarm[0]&0x7f) && (alarm[2]&0xf)==0x01) //检测闹钟时间
alarm_ask_ring=1;
else
alarm_ask_ring=0;
if(alarm_ask_ring || counter_ask_ring) //请求响铃
{
if(!ring_pause)
alarm_state=1;
else
alarm_state=0;
}
else
{
ring_pause=0;
alarm_state=0;
}
countdown(cd_time,second,cd_state); //倒计时后台
countup(cu_time,s100ms,cu_state);
break;
}
case 1: //key1 clicked
{
if(alarm_state==1)
{
ring_pause=1;//stop ring
counter_ask_ring=0;
}
else
switch(menustate)
{
case 0:
{
if(menunum==5)
{
if(cu_state==0 || cu_state==2)menunum++,cu_state=0;
if(cu_state==1)
if(counter[0][0]==0)
{
counter[0][0]=cu_time[0];
counter[0][1]=cu_time[1];
counter[0][2]=cu_time[2];
}
else if(counter[1][0]==0)
{
counter[1][0]=cu_time[0];
counter[1][1]=cu_time[1];
counter[1][2]=cu_time[2];
}
else if(counter[2][0]==0)
{
counter[2][0]=cu_time[0];
counter[2][1]=cu_time[1];
counter[2][2]=cu_time[2];
}
}
else
menunum++;
if(menunum==3 && cd_state)//倒计时计时状态不能修改时间
menunum++;
if(cd_time[0]==0 && cd_time[1]==0 && cd_time[2]==0 && menunum==4)
menunum++;
if(menunum==6 && counter[0][0]==0)
{
menunum=0;
break;
}
if(menunum==7 && counter[1][0]==0)
{
menunum=0;
break;
}
if(menunum==8 && counter[2][0]==0)
{
menunum=0;
break;
}
if(menunum>TOTALMENU-1) menunum=0;
break;
}
case 1:
{
settime[0]++;
if(settime[0]>31 && menunum==1) //日超过31
settime[0]=1;
if(settime[0]>59 && (menunum==0 || menunum==3)) //秒超过59
settime[0]=0;
if(settime[0]>1 && menunum==2) //alarm 2state 1-on 0-off
settime[0]=0;
if(menunum==5)
{
if(cu_state==0)
{
menunum++;
}
}
break;
}
case 2:
{
settime[1]++;
if(settime[1]>12 && menunum==1) //mon超过12
settime[1]=1;
if(settime[1]>59 && (menunum==0 || menunum==2 || menunum==3)) //min超过59
settime[1]=0;
break;
}
case 3:
{
settime[2]++;
if(settime[2]>99 && menunum==1) //year超过99
settime[2]=0;
if(settime[2]>23 && (menunum==0 || menunum==2 || menunum==3)) //h超过23
settime[2]=0;
break;
}
case 4:
{
if(menunum==0)
{
// write_data=((settime[0]/10)<<4)|(settime[0]%10);
writeData(0x2,((settime[0]/10)<<4)|(settime[0]%10));
// write_data=((settime[1]/10)<<4)|(settime[1]%10);
writeData(0x3,((settime[1]/10)<<4)|(settime[1]%10));
// write_data=((settime[2]/10)<<4)|(settime[2]%10);
writeData(0x4,((settime[2]/10)<<4)|(settime[2]%10));
}
else if(menunum==1)
{
writeData(0x5,((settime[0]/10)<<4)|(settime[0]%10));
writeData(0x7,((settime[1]/10)<<4)|(settime[1]%10));
writeData(0x8,((settime[2]/10)<<4)|(settime[2]%10));
}
else if(menunum==2)
{
writeData(0x9,((settime[1]/10)<<4)|(settime[1]%10));
writeData(0xA,((settime[2]/10)<<4)|(settime[2]%10));
writeData(0xB,((0)<<4)|(settime[0]%2));
alarm[0]=((settime[1]/10)<<4)|(settime[1]%10);
alarm[1]=((settime[2]/10)<<4)|(settime[2]%10);
alarm[2]=(settime[0]%2);
}
else if(menunum==3)
{
cd_time[0]=settime[0];
cd_time[1]=settime[1];
cd_time[2]=settime[2];
if(!(cd_time[0]==0 && cd_time[1]==0 && cd_time[2]==0))
menunum=4; //倒计时不全为0时自动跳转
}
else if(menunum==5)
{
cu_time[0]=0;
cu_time[1]=0;
cu_time[2]=0;
counter[0][0]=0;
counter[0][1]=0;
counter[0][2]=0;
counter[1][0]=0;
counter[1][1]=0;
counter[1][2]=0;
counter[2][0]=0;
counter[2][1]=0;
counter[2][2]=0;
cu_state=0;
}
menustate=0;
}
default:
break;
}
break;
}
case 2: //key2 clkicked
{
if(menunum==4) //处于倒计时功能界面
{
cd_state=!cd_state;
}
if(menunum==0 || menunum==1 || menunum==2 || menunum==3)
{
if(menustate<TOTALSTATE-1) menustate++;
else menustate=0;
}
if(menunum==5)
{
cu_state++;
if(cu_state>3) cu_state=0;
if(cu_state==3) menustate=4;
else menustate=0;
}
flash = 0;//闪烁计数清零
break;
}
default:
{
break;
}
}
switch (menustate)
{
case 0: //非设置状态
{
switch (menunum)
{
case 0: //将时间信息提取出来
{
settime[2]=((timeinfo[2]>>4)&0x0f)*10+(timeinfo[2]&0x0f);
settime[1]=((timeinfo[1]>>4)&0x0f)*10+(timeinfo[1]&0x0f);
settime[0]=((timeinfo[0]>>4)&0x07)*10+(timeinfo[0]&0x0f);
// ArrayPass_word(disp,(timeinfo[2]>>4)&0x0f,(timeinfo[2])&0x0f,0xf,(timeinfo[1]>>4)&0x0f,(timeinfo[1])&0x0f,0xf,(timeinfo[0]>>4)&0x07,timeinfo[0]&0x0f);
break;
}
case 1: //将日期信息提取出来
{
settime[2]=((timeinfo[6]>>4)&0x0f)*10+(timeinfo[6]&0x0f);
settime[1]=((timeinfo[5]>>4)&0x0f)*10+(timeinfo[5]&0x0f);
settime[0]=((timeinfo[3]>>4)&0x0f)*10+(timeinfo[3]&0x0f);
// ArrayPass_word(disp,(timeinfo[6]>>4)&0x0f,(timeinfo[6])&0x0f,0xf,(timeinfo[5]>>4)&0x0f,(timeinfo[5])&0x0f,0xf,(timeinfo[3]>>4)&0x0f,(timeinfo[3])&0x0f);
break;
}
case 2:
{
settime[2]=((alarm[1]>>4)&0x07)*10+(alarm[1]&0x0f);
settime[1]=((alarm[0]>>4)&0x07)*10+(alarm[0]&0x0f);
settime[0]=((alarm[2]>>4)&0x07)*10+(alarm[2]&0x0f);
// ArrayPass_word(disp,(alarm[1]>>4)&0x07,(alarm[1])&0x0f,0xf,(alarm[0]>>4)&0x07,(alarm[0])&0x07,0xf,(alarm[2]>>4)&0x07,(alarm[2])&0x0f);
break;
}
case 3:
case 4:
{
settime[2]=cd_time[2];
settime[1]=cd_time[1];
settime[0]=cd_time[0];
// countdown(cd_time,second,cd_state);
// ArrayPass_word(disp,((cd_time[2]/10)),(cd_time[2]%10),0xf,((cd_time[1]/10)),(cd_time[1]%10),0xf,((cd_time[0]/10)),(cd_time[0]%10));
break;