📄 time.c
字号:
#include <AT89X51.h>
unsigned char tc; //软件延时单元
bit flag1=0; //秒标志
unsigned char data dispbit,dispbuf[4],m[5]; //显示位,显示缓冲区
code unsigned char ds=0x14; //软件延时系数__20
unsigned char second,minute,hour,b=0,a; //秒,分,时
void delay (unsigned int count); //延时函数
void display(void); //显示函数
void key(void); //键处理函数
void sx(void); //送显示函数
void main(void) //主函数
{
unsigned char i;
TMOD=0x01; //定时器初始化
TH0=0x4C;
TL0=0x00;
IE=0x82; //开放定时器0中断
tc=ds; //软件延时初值
TR0=1; //启动定时器
P1_0=0;
do{
key(); //键处理
sx();
for(i=0;i<4;i++)
display(); //显示
if(flag1==1) //有秒标志
{
flag1=0; //秒标志清零
P1_0=0; //LED亮
second++; //秒加一
if (second==60)
{
second=0;
minute++; //分加一
if (minute==60)
{
hour++; //时加一
minute=0;
if (hour==24) hour=0;
}
}
sx(); //送显示
}
}while(1);
}
void timer0(void) interrupt 1 //定时器0中断服务函数
{
TH0=0x4C; //再送定时初值
tc--; //软件延时计数
if(tc==0x0a) P1_0=1; //LED灭
if (tc==0) //中断20次
{
tc=ds; //再设软件延时初值
flag1=1; //建秒标志
}
}
void display(void) //显示函数
{
code unsigned char design[32]={0x5F,0x44,0x3D,0x6D,0x66,0x6B,0x7B,0x45,
0x7F,0x6F,0x00,0x77,0x7A,0x1B,0x7C,0x3B,0x33,
0xDF,0xC4,0xBD,0xED,0xE6,0xEB,0xFB,0xC5,
0xEF,0x76,0x1A,0x37,0x00,0x20,0x6E};
//字型码表
unsigned char i;
dispbit=0x08; //字位初值
for(i=0;i<4;i++) //扫描4位数码显示器
{
P0=design[dispbuf[i]]; //转换字型并输出
P2=dispbit; //输出字位
dispbit=dispbit+dispbit; //字位左移
delay (1); //延时
}
}
void key(void)
{
unsigned char keycode,k1,m[5];
k1=~(P3)&0x30; //读键
if ( k1 != 0) //有键按下
{
IE=0x00; //关中断
delay (30); //延时
keycode=~(P3)&0x30; //读键码
do //等待键释放
{
k1=~(P3)&0x30;
}
while (k1!=0);
switch (keycode)
{
case 0x10: //P3.4键,分加一
{
// minute++;
// if (minute==60) minute=0;
m[a]++;
if(m[1]==3)
m[1]=0;
if(m[2]==10)
m[2]=0;
if(m[3]==6)
m[3]=0;
m[4]=m[4]%10;
minute=m[3]*10+m[4];
hour=m[1]*10+m[2];
if (hour>23)
{ hour=0;
m[2]=0;
m[1]=0;}
if (minute==60)
minute=0;
};
break;
case 0x20: //P3.5键,时加一
{ a=a+1;
if(a==5)
a=0;
// hour++;
/* if (hour==24)
hour=0;
if (minute==60)
minute=0;*/
};
}
sx(); //送显示
IE=0x82; //开中断
}
}
void delay (unsigned int count)//延时函数
{
unsigned int i,j;
for (i=0;i<count;i++)
for (j=0;j<120;j++);
}
void sx (void) //送显示函数
{
dispbuf[3]=minute%10; //分个位
dispbuf[2]=minute/10; //分十位
dispbuf[1]=hour%10; //时个位
dispbuf[0]=hour/10; //时十位
b++;
if(b<5)
dispbuf[a-1]=10 ;
if(b==10)
b=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -