📄 clock.c
字号:
#include "reg52.h"
#define THCO 0xee
#define TLCO 0x0
unsigned char code Duan[]={0x3F, 0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
//共阴极数码管,0-9段码表
unsigned char Data_Buffer[4]={0,0,0,0};
//四个数码管显示数值,数组变量定义
unsigned char Hour=0,Min=0,Sec=0;
bit flag=0;//1分时间到标志
sbit P10=P1^0; //四个数码管的位码口定义
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit K_Mode=P2^0; //按键定义
sbit K_UP=P2^1;
sbit K_DN=P2^2;
sbit LED1=P2^3; //四个指示灯
sbit LED2=P2^4;
void main()
{
TMOD=0x11; //定时器0初始化
TH0=THCO;
TL0=TLCO;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(flag==1)
{
flag=0;
Data_Buffer[0]=Hour/10;
Data_Buffer[1]=Hour%10;
Data_Buffer[2]=Min/10;
Data_Buffer[3]=Min%10;
}
}
}
void timer0() interrupt 1
{
static unsigned char Bit=0; //静态变量,退出程序后,值保留
static unsigned char count=0,K_count=0;
static unsigned char Mode=0;
//MODE, 0:实时时钟;1:修改小时;2:修改分钟
TH0=THCO;
TL0=TLCO;
count++;
if(count>=200) //秒计时,定时器定时5ms,计200次为一秒
{
count=0;
Sec++;
if(Sec>=60)
{
Sec=0;
Min++; flag=1; //更新数码管显示
if(Min>=60) //时间计时
{
Min=0; Hour++;
if(Hour>=24)Hour=0;
}
}
}
Bit++;
if(Bit>=4)Bit=0;
P1|=0x0f; //先关位码
P0=Duan[Data_Buffer[Bit]]; //开段码
if(count<100&&Bit==1)P0|=0x80;//0.5S中间小数点亮,之后灭,不断循环
switch(Bit) //送位码
{
case 0: P10=0;break;
case 1: P11=0;break;
case 2: P12=0;break;
case 3: P13=0;break;
}
if(K_Mode==0||K_UP==0||K_DN==0) //有键按下
{
K_count++;
if(K_count>=30) //消抖处理
{
K_count=0;
flag=1;
if(K_Mode==0) //修改Mode,
{
Mode++;
if(Mode>=3)Mode=0;
if(Mode==0){LED1=1;LED2=1;}//实时时间
else if(Mode==1)LED1=0; //修改小时
else if(Mode==2){LED1=1;LED2=0;}//修改分钟
}
else if(K_UP==0)
{
if(Mode==1) //小时加
{ Hour++; if(Hour>=24)Hour=0; }
else if(Mode==2)//分钟加
{ Min++; if(Min>=60)Min=0; }
}
else if(K_DN==0)
{
if(Mode==1) //小时减
{
if(Hour==0)Hour=23;
else Hour--;
}
else if(Mode==2) //分钟减
{
if(Min==0)Min=59;
else Min--;
}
}
}
}
else K_count=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -