📄 main.c
字号:
#include<reg52.h>
#include"LED_N.H"
#include"KEY.H"
#include"beeper.h"
#define NORMAL 0 //预定义三种工作模式
#define HOUR_STATE 1
#define MINUTE_STATE 2
void initial(); //函数声明
void SetTime();
void ModeJudge();
unsigned char second; //变量声明
unsigned char minute;
unsigned char hour;
unsigned int div;
unsigned char menu_state;
unsigned char SecondMask;
unsigned char MinuteMask;
unsigned char HourMask;
unsigned char m=0;
/*
函数名:SYS_Init();
入口参数:无
出口参数:无
说明: 定义T0工作方式1,约5ms产生一次中断
T1工作方式2,约200us产生一次中断
系统初始状态为NORMAL
初始时间为 08:55:00
*/
void SYS_Init()
{
TMOD=0x21;
TL0=(65536-5000)%256; //5ms
TH0=(65536-5000)/256;
TH1=TL1=56;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
PT0=0;
PT1=1;
hour=8;
minute=55;
second=0;
menu_state=NORMAL;
}
main()
{
SYS_Init();
while(1)
{
if(div>2304)
{
switch(menu_state)
{
case NORMAL: SecondMask=SECOND_BLINK;break; //正常模式时,第四位数码管中间的位段闪烁
case HOUR_STATE: HourMask =HOUR_BLINK; break; //调小时时,三、四位数码管闪烁
case MINUTE_STATE:MinuteMask=MINIT_BLINK; break; //调分钟时,一、二位数码管闪烁
default: break;
}
}
else
{
SecondMask=NO_BLINK2;
HourMask=MinuteMask=NO_BLINK;
}
if(second>=60) //正常模式时,时间计算
{
second=0;
minute++;
if(minute>=60)
{
minute=0;
hour++;
if(hour>=12)
hour=0;
}
}
if(m>2) //15ms执行一次的程序
{
m=0;
ModeJudge(); //判断模式改变
SetTime(); //设定时间
SplitNumber(hour*100+minute); //将时间送入缓存
}
};
}
void timer0() interrupt 1 // T0中断程序
{
TR0=0;
TH0=(65536-5000)/256; //5ms
TL0=(65536-5000)%256;
m++;
Display_Scan(SecondMask,MinuteMask,HourMask); //将时间显示在数码管上
TR0=1;
}
void timer1() interrupt 3 //T1中断程序
{
div++;
if(div>4607)
{
div=0;
second++; //时间记够1s,second加一
}
}
/*
函数名:SetTime();
入口参数:无
出口参数:无
说明:在NORMAL下,不做处理
在HOUR_MODE下,按 KEY2 和 KEY3 对小时加减
在MINUTE_MODE下,按 KEY2 和 KEY3 对分钟加减
*/
void SetTime()
{
if(KEY2_JUDGE()!=NO_PRESS)
{
switch(menu_state)
{
case NORMAL:break;
case HOUR_STATE:hour++;if(hour>=12)hour=11;div=0;break;
case MINUTE_STATE:minute++;if(minute>=60)minute=59;second=0;div=0;break;
default: break;
}
}
if(KEY3_JUDGE()!=NO_PRESS)
{
switch(menu_state)
{
case NORMAL:break;
case HOUR_STATE:hour--;if(hour<=1)hour=1;div=0;break;
case MINUTE_STATE:if(minute<=0)minute=1;minute--;second=0;div=0;break;
default: break;
}
}
}
/*
函数名称:ModeJudge();
入口参数:无
出口参数:无
说明:按 KEY1,改变工作模式
*/
void ModeJudge()
{
if( KEY1_JUDGE()==SHORT_PRESS)
{
menu_state++;
if(menu_state>2)menu_state=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -