📄 main.c
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit P1_0 =P1^0;
sbit P1_1 =P1^1;
sbit P1_2 =P1^2;
sbit P1_3 =P1^3;
sbit P1_7 =P1^7;
sbit P1_6 =P1^6;
typedef struct
{ uchar hour;
uchar minute;
uchar second;
}time;
time now={0,0,0};
time dingshi={0,0,0};
uchar code num_tab1[]={0x80,0x40,0x20,0x10,0x08,0x04};
uchar code num_tab2[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极显示
uchar state=0;
uchar count=100;
uchar flag=0; //调整时间/定时的标志
uchar recount=0;
uchar recount1=0;
void delay(uint time1) //延时子程序
{
int i;
int k;
for(i=0;i<time1;i++)
for(k=0;k<100;k++);
}
void display(time disnum) //显示子程序
{
int hour_shi,hour_ge,min_shi,min_ge,sec_shi,sec_ge,i;
int num[6]={0,0,0,0,0,0};
hour_shi=disnum.hour/10;
hour_ge=disnum.hour%10;
min_shi=disnum.minute/10;
min_ge=disnum.minute%10;
sec_shi=disnum.second/10;
sec_ge=disnum.second%10;
num[0]=hour_shi;
num[1]=hour_ge;
num[2]=min_shi;
num[3]=min_ge;
num[4]=sec_shi;
num[5]=sec_ge;
for(i=0;i<6;i++)
{
P2=num_tab1[i];
P0=num_tab2[num[i]];
delay(1);
}
}
void display_1(uchar wei,uchar k) //显示子程序1
{
uchar wei1,wei2;
wei1=wei/10;
wei2=wei%10;
P2=num_tab1[k];
P0=num_tab2[wei1];
delay(1);
P2=num_tab1[k+1];
P0=num_tab2[wei2];
delay(1);
}
void interrupt_init(void)
{
EA=0;
TMOD=0x01;
TH0=0xd8;
TL0=0xf0;
IT0=1;
ET0=1;
EX0=1;
EA=1;
TR0=1;
}
void interrup0(void) interrupt 0 using 3
{
uchar i=0;
delay(1);
if(P1_0==0) //调时
{
if(flag==1) //定时的调节
{
state++;
if(state==9)
{ state=0;}
}
else
{
TR0=0;
state++;
if(state==4)
{
state=0;
TR0=1;
}
}
}
if(P1_1==0) //加
{
switch(state)
{
case 0: break;
case 1: {
now.hour++;
if(now.hour==24)
now.hour=0;
break;
}
case 2: {
now.minute++;
if(now.minute==60)
now.minute=0;
break;
}
case 3: {
now.second++;
if(now.second==60)
now.second=0;
break;
}
case 4: break;
case 5: {
dingshi.hour++;
if(dingshi.hour==60)
dingshi.hour=0;
break;
}
case 6: {
dingshi.minute++;
if(dingshi.minute==60)
now.minute=0;
break;
}
case 7: {
dingshi.second++;
if(dingshi.second==60)
dingshi.second=0;
break;
}
case 8: break;
}
}
if(P1_2==0) //减
{
switch(state)
{
case 0: break;
case 1: {
if(now.hour==0)
now.hour=23;
else
now.hour--;
break;
}
case 2: {
if(now.minute==0)
now.minute=59;
else
now.minute--;
break;
}
case 3: {
if(now.second==0)
now.second=59;
else
now.second--;
break;
}
case 4: break;
case 5: {
if(dingshi.hour==0)
dingshi.hour=23;
else
dingshi.hour--;
break;
}
case 6: {
if(dingshi.minute==0)
now.minute=59;
else
dingshi.minute--;
break;
}
case 7: {
if(dingshi.second==0)
dingshi.second=59;
else
dingshi.second--;
break;
}
case 8: break;
}
}
if(P1_3==0) // 定时/取消定时
{
if(flag==0) // 定时
{
flag=1;
state=4;
}
else //取消定时
{
flag=0;
state=0;
dingshi.hour=0;
dingshi.minute=0;
dingshi.second=0;
}
}
}
void interrup1(void) interrupt 1 using 3
{
TR0=0;
TH0=0xd8;
TL0=0xf0;
TR0=1;
if(count==0)
{
count=100;
now.second++;
if(now.second==60)
{
now.minute++;
now.second=0;
if(now.minute==60)
{
recount=(now.hour+1)*2; //整点提示
now.hour++;
now.minute=0;
if(now.hour==24)
{
now.hour=0;
}
}
}
if(flag==1 )
{
if(dingshi.hour==now.hour && dingshi.minute==now.minute && dingshi.second==now.second )
recount1=18;
}
if(recount!=0)
{
P1_7=~P1_7;
recount--;
}
else
{ P1_7=0;}
if(recount1!=0)
{
P1_6=~P1_6;
recount1--;
}
else
{ P1_6=0;}
}
else
{
count--;
}
}
void main(void)
{
uchar j=0;
flag=0;
interrupt_init(); //中断初始化
P1_6=0;
P1_7=0;
while(1)
{
switch(state)
{
case 0: display(now);break;
case 1: display_1(now.hour,0);break;
case 2: display_1(now.minute,2);break;
case 3: display_1(now.second,4);break;
case 4: display(dingshi);break; //显示定时初值00:00:00
case 5: display_1(dingshi.hour,0);break;
case 6: display_1(dingshi.minute,2);break;
case 7: display_1(dingshi.second,4);break;
case 8: display(dingshi);break; //显示定时时间
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -