#关于数字时钟51单片机的问题,在社区里看到的文章 有人能帮我解释一下每一行的意思吗,两个部分的代码拼接起来的可能有些是没定义c
c语言
```c
#include<reg52.h>
sbit k1 = p3^3;//控制开关终止与开始
sbit k2 = P3^0;//控制模式
sbit k3 = P3^1;//控制加
sbit k4 = P3^2;//控制减
sbit LED = P1^7;
unsigned char kz1,kz2,kz3,kz4,kz5,w,k,nz,h;
unsigned char ss = 2, sg = 3, fs = 5, fg = 9, ms = 5, mg = 5;
char SMG[12] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00} ;
char are[] = {0Xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0X7f};
void zhongduan();
void keykongzhi();
void naoshizhong();
void LedDriver();
void delay_us(unsigned int i)
//蜂鸣器的延时函数其参数为us(10000)=0.12s
/*250hz的周期1/250 所以一个高电平1/500 要发出250hz 需要us(166.667)*/
{
unsigned int k;
for (k =0;k<i;k++);
}
while(k1==1)//这里实现每个按键按下会响
//频率为250hz
{beep=1
delay_us(166);
beep=0;
delay_us(166);
}
while(k2==1)
{beep=1
delay_us(166);
beep=0;
delay_us(166);
}
while(k3==1)
{beep=1
delay_us(166);
beep=0;
delay_us(166);
}
while(k4==1)
{beep=1
delay_us(166);
beep=0;
delay_us(166);
}
void delay(unsigned int i)//电子表会动 能中断且设置时间
{
while(i--);
}
void main()
{
zhongduan();
while(1)
{
naoshizhong();
keykongzhi();
LedDriver();
}
}
void naoshizhong()
{
P0 = SMG[ss];P2 = are[0]; delay(500); P2 = 0Xff;
P0 = SMG[sg];P2 = are[1]; delay(500); P2 = 0Xff;
P0 = SMG[10];P2 = are[2]; delay(500); P2 = 0Xff;
P0 = SMG[fs];P2 = are[3]; delay(500); P2 = 0Xff;
P0 = SMG[fg];P2 = are[4]; delay(500); P2 = 0Xff;
P0 = SMG[10];P2 = are[5]; delay(500); P2 = 0Xff;
P0 = SMG[ms];P2 = are[6]; delay(500); P2 = 0Xff;
P0 = SMG[mg];P2 = are[7]; delay(500); P2 = 0Xff;
}
void keykongzhi()
{
if(k2 == 0 && kz1 == 0)
{
kz1 = 1;
}
else if(k2 == 1 && kz1 == 1)
{
kz1 = 0;
w++;
w &= 0x03;
}
if(k3 == 0 && kz2 == 0)
{
kz2 = 1;
}
else if(k3 == 1 && kz2 == 1)
{
kz2 = 0;
switch(w)
{
case 1: mg = 0; ms = 0; break;
case 2: fg ++; break;
case 3: sg ++; break;
}
}
if(k4 == 0 && kz3 == 0)
{
kz3 = 1;
}
else if(k4 == 1 && kz3 == 1)
{
kz3 = 0;
switch(w)
{
case 1: mg = 0; ms = 0; break;
case 2: fg --; break;
case 3: sg --; break;
}
}
if(w == 1 && nz == 0) //时钟调秒
{
P0 = SMG[ms]+128;P2 = are[6]; delay(800); P2 = 0Xff;
P0 = SMG[mg]+128;P2 = are[7]; delay(800); P2 = 0Xff;
}
if(w == 2 && nz == 0) //时钟调分
{
P0 = SMG[fs]+128;P2 = are[3]; delay(800); P2 = 0Xff;
P0 = SMG[fg]+128;P2 = are[4]; delay(800); P2 = 0Xff;
}
if(w == 3 && nz == 0) //时钟调时
{
P0 = SMG[ss]+128;P2 = are[0]; delay(800); P2 = 0Xff;
P0 = SMG[sg]+128;P2 = are[1]; delay(800); P2 = 0Xff;
}
}
void zhongduan()
{
TMOD=0X01;
TH0=0X3C;//50ms
TL0=0XB0;
ET0=1;
TR0=1;
EA=1;
}
void LedDriver()
{
if (k >= 40)
{
k = 0;
mg ++;
}
if (mg >= 10)
{
mg = 0;
ms ++;
}
if (ms >= 6)
{
ms = 0;
fg ++;
}
if (fg >= 10)
{
fg = 0;
fs ++;
}
if (fs >= 6)
{
fs = 0;
sg ++;
}
if (sg >= 10)
{
sg = 0;
ss ++ ;
}
if (ss ==2 && sg == 4)
{
ss = 0;
sg = 0;
}
}
void time0() interrupt 1 using 0
{
TH0=0X3C;
TL0=0XB0;
k ++;
}
void key()//设置闹钟函数 以及设置闹钟
{
if(k2==0)
{
delay(2);
if(k2==0)
{
while(!k2);
TR0=0;
setflag=0;
if(MODE == 3) MODE = 1;
else MODE ++;
}
}
if(k3==0)
{
delay(2);
if(k3==0)
{
while(!k3);
if(MODE == 1) H_Increase() ;
if(MODE == 2) M_Increase() ;
if(MODE == 3) S_Increase() ;
if(SET_MODE==1)
{
set_hour++;
if(set_hour==24)set_hour=0;
}
if(SET_MODE==2)
{
set_min++;
if(set_min==60)set_min=0;
}
}
}
if(k4==0)
{
delay(2);
if(k4==0)
{
while(!k4);
if(MODE == 1) H() ;
if(MODE == 2) M() ;
if(MODE == 3) S() ;
if(SET_MODE==1)
{
set_hour--;
if(set_hour==0)set_hour=23;
}
if(SET_MODE==2)
{
set_min--;
if(set_min==0)set_min=59;
}
}
}