#include <REGX52.H>
#include "Key.h"
#include "Seg.h"
//变量声明区
unsigned char Key_Val,Key_Down,Key_Old;//按键扫描专用变量
unsigned char Key_Slow_Down;//按键减速专用变量 10ms
unsigned int Seg_Slow_Down;//按键扫描专用变量 500ms
unsigned char Seg_Pos;//数码管扫描变量
unsigned char Seg_Buf[6]={1,2,3,4,5,6};//数码管显示数据存放数组
unsigned char mode;//0时钟显示界面,1时钟设置界面,2闹钟设置界面
unsigned char Clock_Disp[3]={23,59,55};
unsigned int t1s;
unsigned char Seg_Point[6]={0,1,0,1,0,1};
unsigned char Clock_Set[3];
unsigned char Clock_Set_Index;//0指小时,1指分钟,2指秒
unsigned int Timer_500ms;
bit Seg_Flag;
unsigned char Alarm[]={0,0,0};
unsigned char Alarm_Set[3];//闹钟的设置数组不需要赋初值
bit af=1;
unsigned char led;
bit Alarm_Enable_Flag;
//按键处理函数
void Key_Proc()
{
if(Key_Slow_Down)return ;
Key_Slow_Down=1;//按键减速程序
Key_Val=Key_Read();//读取按键的键码值
Key_Down=Key_Val&(Key_Val^Key_Old);//捕捉下降沿
Key_Old=Key_Val;//辅助扫描
//按下按键2之后,Key_Down==2
//按下按键1不松手,Key_Old==1,一旦松手Key_Old==0
if(Key_Down!=0)Alarm_Enable_Flag=0;
switch(Key_Down)
{
case 1://按下 S1 后系统切换到时钟设置界面
Clock_Set_Index=0;
Clock_Set[0]=Clock_Disp[0];
Clock_Set[1]=Clock_Disp[1];
Clock_Set[2]=Clock_Disp[2];mode=1;break;
case 2://按下 S2 后系统切换到闹钟设置界面
Clock_Set_Index=0;
Alarm_Set[0]=Alarm[0];
Alarm_Set[1]=Alarm[1];
Alarm_Set[2]=Alarm[2];mode =2;break;
case 3://按下 S3 后可在时分秒之间切换选中
if(mode==1)
{
if(++Clock_Set_Index==3)Clock_Set_Index=0;
}break;
case 4://按下 S4 后可开启/关闭闹钟功能
af^=1;
break;
case 5://S5 为参数+按键,按下 S5 后可增加选中参数,若增加到上限值则变为下限值
if(mode==1)//时钟设置界面
{
Clock_Set[Clock_Set_Index]++;//用数组去写可以把它归类起来
if(Clock_Set_Index==0)//时
{
if(Clock_Set[Clock_Set_Index]==24)
{
Clock_Set[Clock_Set_Index]=0;
}
}
else//分秒
{
if(Clock_Set[Clock_Set_Index]==60)
{
Clock_Set[Clock_Set_Index]=0;
}
}
}
if(mode==2)//闹钟设置界面
{
Alarm_Set[Clock_Set_Index]++;
if(Clock_Set_Index==0)
{
if(Alarm_Set[Clock_Set_Index]==24)
{
Alarm_Set[Clock_Set_Index]=0;
}
}
else
{
if(Alarm_Set[Clock_Set_Index]==60)
{
Alarm_Set[Clock_Set_Index]=0;
}
}
}
break;
case 6:// S6 为参数-按键,按下 S6 后可减小选中参数,若减小到下限值则变为上限值
if(mode==1)//时钟设置界面
{
Clock_Set[Clock_Set_Index]--;//用数组去写可以把它归类起来
if(Clock_Set_Index==0)
{
if(Clock_Set[Clock_Set_Index]==255)
{
Clock_Set[Clock_Set_Index]=23;
}
}
else
{
if(Clock_Set[Clock_Set_Index]==255)
{
Clock_Set[Clock_Set_Index]=59;
}
}
}
if(mode==2)//闹钟设置界面
{
Alarm_Set[Clock_Set_Index]--;//用数组去写可以把它归类起来
if(Clock_Set_Index==0)
{
if(Alarm_Set[Clock_Set_Index]==255)
{
Alarm_Set[Clock_Set_Index]=23;
}
}
else
{
if(Alarm_Set[Clock_Set_Index]==255)
{
Alarm_Set[Clock_Set_Index]=59;
}
}
}
break;
case 7://把显示数组给设置数组
//S7 为确认按键,按下 S7 后保存当前修改的参数值,返回时钟显示界面
if(mode==1)
{
Clock_Disp[0]=Clock_Set[0];
Clock_Disp[1]=Clock_Set[1];
Clock_Disp[2]=Clock_Set[2];
}
if(mode==2)
{
Alarm[0]=Alarm_Set[0];
Alarm[1]=Alarm_Set[1];
Alarm[2]=Alarm_Set[2];
}
//返回时钟显示界面
mode=0;
break;
case 8://S7 为确认按键,按下 S7 后保存当前修改的参数值,返回时钟显示界面
mode=0;
break;
}
}
//信息处理函数,显示信息
void Seg_Proc()
{
//要在哪里用for循环,就在这个函数的第一行设置变量
//unsigned char i;//不要定义在全局变量,要定义局部变量
//全局变量不会刷新数据
if(Seg_Slow_Down)return ;
Seg_Slow_Down=1;//数码管减速程序
switch(mode)
{
case 0://有联系的变量,设置成数组
Seg_Buf[0]=Clock_Disp[0]/10%10;
Seg_Buf[1]=Clock_Disp[0]/1%10;
Seg_Buf[2]=Clock_Disp[1]/10%10;
Seg_Buf[3]=Clock_Disp[1]/1%10;
Seg_Buf[4]=Clock_Disp[2]/10%10;
Seg_Buf[5]=Clock_Disp[2]/1%10;
break;
case 1:
Seg_Buf[0]= Clock_Set[0]/10%10;
Seg_Buf[1]= Clock_Set[0]/1%10;
Seg_Buf[2]= Clock_Set[1]/10%10;
Seg_Buf[3]= Clock_Set[1]/1%10;
Seg_Buf[4]= Clock_Set[2]/10%10;
Seg_Buf[5]= Clock_Set[2]/1%10;
switch(Clock_Set_Index)
{
case 0:
Seg_Buf[0]=Seg_Flag?Clock_Set[0]/10%10:10;
Seg_Buf[1]=Seg_Flag?Clock_Set[0]%10:10;
break;
case 1:
Seg_Buf[2]=Seg_Flag?Clock_Set[1]/10%10:10;
Seg_Buf[3]=Seg_Flag?Clock_Set[1]%10:10;
break;
case 2:
Seg_Buf[4]=Seg_Flag?Clock_Set[2]/10%10:10;
Seg_Buf[5]=Seg_Flag?Clock_Set[2]%10:10;
break;
}
break;
case 2:
Seg_Buf[0]= Alarm_Set[0]/10%10;
Seg_Buf[1]= Alarm_Set[0]/1%10;
Seg_Buf[2]= Alarm_Set[1]/10%10;
Seg_Buf[3]= Alarm_Set[1]/1%10;
Seg_Buf[4]= Alarm_Set[2]/10%10;
Seg_Buf[5]= Alarm_Set[2]/1%10;
switch(Clock_Set_Index)//指针可以共用
{
case 0:
Seg_Buf[0]=Seg_Flag?Alarm_Set[0]/10%10:10;
Seg_Buf[1]=Seg_Flag?Alarm_Set[0]%10:10;
break;
case 1:
Seg_Buf[2]=Seg_Flag?Alarm_Set[1]/10%10:10;
Seg_Buf[3]=Seg_Flag?Alarm_Set[1]%10:10;
break;
case 2:
Seg_Buf[4]=Seg_Flag?Alarm_Set[2]/10%10:10;
Seg_Buf[5]=Seg_Flag?Alarm_Set[2]%10:10;
break;
}
break;
}
}
//其他显示函数
void Led_Proc()//闹钟
{
if(af==1)
{
if(Clock_Disp[0]==Alarm[0]&&Clock_Disp[1]==Alarm[1]&&Clock_Disp[2]==Alarm[2])//到了闹钟的时间
Alarm_Enable_Flag=1;
if(Alarm_Enable_Flag==1)
{
P2_3=0;
P1=led;
}
else
{
P2_3=1;
P1=0xff;
}
}
else
{
P2_3=1;
P1=0xff;
}
}
//定时器0初始化函数
void Timer0Init(void) //1毫秒@12.000MHz
{
//AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
//定时器0中断服务函数,名字可以随便取
void Timer0Server() interrupt 1
{
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
if(++Key_Slow_Down==10)Key_Slow_Down=0;
if(++Seg_Slow_Down==500)Seg_Slow_Down=0;
if(++Seg_Pos==6)Seg_Pos=0;
Seg_Disp(Seg_Pos,Seg_Buf[Seg_Pos],Seg_Point[Seg_Pos]);
if(++t1s==1000)
{
t1s=0;
Clock_Disp[2]++;
if(Clock_Disp[2]==60)
{
Clock_Disp[2]=0;
Clock_Disp[1]++;
if(Clock_Disp[1]==60)
{
Clock_Disp[1]=0;
Clock_Disp[0]++;
if(Clock_Disp[0]==24)
{
Clock_Disp[0]=0;
}
}
}
}
if(++Timer_500ms==500)
{
Timer_500ms=0;
Seg_Flag^=1;
if(Clock_Disp[0]>=12)//后4个灯闪烁
{
led^=0xf0;
}
else//第4位闪烁
{
led^=0x0f;
}
}
}
//main函数
void main()
{
Timer0Init();
while(1)
{
Key_Proc();
Seg_Proc();
Led_Proc();
}
}//85