#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define LS P0 //段选
sbit LED=P2^0; //设置状态,0-LED指示灯亮
sbit LSA=P2^2; //位选
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit KEY_Set=P3^1; //设置键,0-按下
sbit KEY_Move=P3^0; //移位键,0-按下
sbit KEY_Add=P3^2; //数加键,0-按下
sbit KEY_Reduce=P3^3; //数减键,0-按下
bit Flash=1;
uchar Setflag=1; //设置标志位 0-设置状态,1-非设置状态
uchar Moveflag=2; //移位标志位 0-分针,1-时针,2-无效
uchar Addflag=1; //数加标志位 0-数加,1-无效
uchar Reduceflag=1; //数减标志位 0-数减,1-无效
static uchar shi=0,fen=0,miao=0; //时/分/秒-高低八位
uchar code DIG_CODE[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//显示0~9的值
uchar T=0; //计算定时器循环次数
void Delay(uchar t)
{
unsigned char a,b;
for(;t>0;t--)
for(b=13;b>0;b--)
for(a=20;a>0;a--);
}
void Init()
{
TMOD=0x11; //定时器0中断方式1,定时器1中断方式1
//50ms
TH0=(65536-50000)/256; //赋初值
TL0=(65536-50000)%256;
EA=1; //总中断打开
ET0=1; //中断 定时器0打开
IT0=1; //下降沿有效
TR0=1; //定时器0启动
//50ms时间到,跳转到中断程序中
}
void Timer0() interrupt 1
{
TH0=(65536-50000)/256; //定时T*50ms--T=20--1s
TL0=(65536-50000)%256;
T++;
}
// void Timer1() interrupt 1
//{
// switch(Moveflag)
// {
// case 0: break; //miao
// case 1: break; //shi
// case 2: break; //feng
// }
//}
void Clock()
{
if(Setflag==1) //时钟状态
{
TR1=1;
if(T==20)
{
T=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
}
}
}
}
else //设置状态
{
TR1=0;
if(Moveflag==0) //移位键有效-秒针
{
if(Addflag==0) //数加键有效,数加
{
miao++;
if(miao==60)
{
miao=0;
}
Addflag=1;
}
if(Reduceflag==0) //数减键有效,数减
{
miao--;
if(miao==-1)
{
miao=59;
}
Reduceflag=1;
}
}
if(Moveflag==1) //移位键有效-分针
{
if(Addflag==0) //数加键有效,数加
{
fen++;
if(fen==60)
{
fen=0;
}
Addflag=1;
}
if(Reduceflag==0) //数减键有效,数减
{
fen--;
if(fen==-1)
{
fen=59;
}
Reduceflag=1;
}
}
if(Moveflag==2) //移位键有效-时针
{
if(Addflag==0) //数加键有效,数加
{
shi++;
if(shi==24)
{
shi=0;
}
Addflag=1;
}
if(Reduceflag==0) //数减键有效,数减
{
shi--;
if(shi==-1)
{
shi=23;
}
Reduceflag=1;
}
}
}
}
void Key_Scan()
{
static uchar SaveSet=1; //保存设置键状态 0-按下,1-弹起
static uchar SaveMove=1; //保存移位键状态 0-按下,1-弹起
static uchar SaveAdd=1; //保存数加键状态 0-按下,1-弹起
static uchar SaveReduce=1; //保存数减键状态 0-按下,1-弹起
uchar Set=1; //当前设置按键状态 弹起
uchar Move=1; //当前设置按键状态 弹起
uchar Add=1; //当前设置按键状态 弹起
uchar Reduce=1; //当前设置按键状态 弹起
//获取各按键状态
if(KEY_Set==0) //设置键按下
{
Delay(1);
if(KEY_Set==0)
{
Set=0;
}
else
{
Set=1;
}
}
else
{
Set=1;
}
if(KEY_Move==0) //移位键按下
{
Delay(1);
if(KEY_Move==0)
{
Move=0;
}
else
{
Move=1;
}
}
else
{
Move=1;
}
if(KEY_Add==0) //数加键按下
{
Delay(1);
if(KEY_Add==0)
{
Add=0;
}
else
{
Add=1;
}
}
else
{
Add=1;
}
if(KEY_Reduce==0) //数减键按下
{
Delay(1);
if(KEY_Reduce==0)
{
Reduce=0;
}
else
{
Reduce=1;
}
}
else
{
Reduce=1;
}
//按键按下状态处理
if(SaveSet!=Set) //设置键状态变化
{
if(Set==0) //当前设置键按下
{
if(Setflag==1) //不在设置状态
{
LED=0; //指示灯亮
Setflag=0; //置为设置状态
Moveflag=0; //移位键有效-分针
TR0=0; //定时器停止
}
else
{
LED=1; //指示灯灭
Setflag=1; //退出设置状态
Moveflag=2; //移位键无效
TR0=1; //定时器启动
T=0;
}
}
}
if(SaveMove!=Move) //移位键状态变化
{
if(Setflag==0)
{
if(Move==0)
{
Moveflag++;
if(Moveflag==3) Moveflag=0;
}
}
}
if(SaveAdd!=Add) //数加键状态变化
{
if(Setflag==0)
{
if(Add==0)
{
Addflag=0;
}
}
}
if(SaveReduce!=Reduce)
{
if(Setflag==0)
{
if(Reduce==0)
{
Reduceflag=0;
}
}
}
SaveSet=Set; //保存设置键状态
SaveMove=Move; //保存移位键状态
SaveAdd=Add; //保存数加键状态
SaveReduce=Reduce; //保存数减键状态
}
void Display()
{
Clock();
LSA=0;LSB=0;LSC=0; LS=DIG_CODE[miao%10]; Delay(1); LS=0x00;//秒针低位-加 消隐
LSA=1;LSB=0;LSC=0; LS=DIG_CODE[miao/10]; Delay(1); LS=0x00;//秒针高位-加 消隐
LSA=0;LSB=1;LSC=0; LS=0x40; Delay(1);
LSA=1;LSB=1;LSC=0; LS=DIG_CODE[fen%10]; Delay(1); LS=0x00;//分针低位-加 消隐
LSA=0;LSB=0;LSC=1; LS=DIG_CODE[fen/10]; Delay(1); LS=0x00;//分针高位-加 消隐
LSA=1;LSB=0;LSC=1; LS=0x40; Delay(1);
LSA=0;LSB=1;LSC=1; LS=DIG_CODE[shi%10]; Delay(1); LS=0x00;//时针低位-加 消隐
LSA=1;LSB=1;LSC=1; LS=DIG_CODE[shi/10]; Delay(1); LS=0x00;//时针高位-加 消隐
}
main()
{
Init(); //执行初始化
while(1)
{
Key_Scan();
Display();
}
}
|