实现功能:6个按键分别实现秒、分、时的调节(其中秒加按键按下加10s,秒减按键按下减1s),P3.6口的按键按下则不能调节时钟,再按下可调节时钟;此代码提供一个时钟设计的简单思路
仿真电路图
#include"AT89X51.h"
#define SMG P0//数码管段选口
#define WE P2//数码管位选口
sbit T_up= P3^0;//时钟按键
sbit T_down = P3^1;
sbit Fen_up = P3^2;
sbit Fen_down= P3^3;
sbit Shi_up= P3^4;
sbit Shi_down = P3^5;
sbit key_lock=P3^6;
sbit LED=P1^0;
unsigned char key_flag = 0;//按键标志位
unsigned char m=0;
unsigned char count = 0;
unsigned long int S_Number = 0;
unsigned char shi=0,fen=0,miao=0;
unsigned char gsmg_code[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};//0~9与-
void display()//数码管显示函数
{
switch(m) //位选,选择点亮的数码管,
{
case(1):
WE=0xFE; SMG=gsmg_code[shi/10];break;//显示第7位(左边第一位)
case(2):
WE=0xFD;SMG=gsmg_code[shi%10]; break;//显示第6位
case(3):
WE=0xFB;SMG=gsmg_code[10]; break;//显示第5位
case(4):
WE=0xF7;SMG=gsmg_code[fen/10]; break;//显示第4位
case(5):
WE=0xEF; SMG=gsmg_code[fen%10];break;//显示第3位
case(6):
WE=0xDF;SMG=gsmg_code[10];break;//显示第2位
case(7):
WE=0xBF;SMG=gsmg_code[miao/10]; break;//显示第1位
case(8):
WE=0x7F;SMG=gsmg_code[miao%10]; break;//显示第0位
case(9):
m=0;break;
}
}
void t_5ms(void) interrupt 1
{
TH0 = (65536-5000)/256;//5ms
TL0 = (65536-5000)%256;
count++;
m++;
if(200==count)
{
count = 0;
S_Number++;
if(S_Number>=86400)//24*60*60=86400
{
S_Number = 0;
}
shi = S_Number/3600;
fen = S_Number%3600/60;
miao = S_Number%60;
}
display();
if(key_lock==0)//按键锁定,按下不能调节时间
{
while(key_lock==0);
key_flag=~key_flag;
}
}
void key_accommodation_time()//按键调节时间函数
{
if(0==key_flag)//**************秒钟
{
if(T_up==0)
{
while(T_up==0);
S_Number=S_Number+9;
}
else if(T_down==0)
{
while(T_down==0);
S_Number=S_Number-2;
}
}
else
{
if(S_Number>60)
S_Number=S_Number-60;
}
if(0==key_flag)//***************分钟
{
if(Fen_up==0)
{
while(Fen_up==0);
S_Number=S_Number+60;
}
else if(Fen_down==0)
{
while(Fen_down==0);
S_Number=S_Number-60;
}
}
else
{
if(S_Number>60)
S_Number=S_Number-60;
}
if(0==key_flag)//***************时钟
{
if(Shi_up==0)
{
while(Shi_up==0);
S_Number=S_Number+3600;
}
else if(Shi_down==0)
{
while(Shi_down==0);
S_Number=S_Number-3600;
}
}
else
{
if(S_Number>3600)
S_Number=S_Number-3600;
}
}
void main()
{
TMOD = 0X01;
TH0 = (65536-5000)/256;
TL0 = (65536-5000)%256;
TR0 = 1;
ET0 = 1;
EA = 1;
while(1)
{
key_accommodation_time();
}
}