问题遇到的现象和发生背景
请问这个宏定义99是什么意思,程序的功能就是完成数码管显示时分秒和闹钟的时,分,秒
程序是网上找的上面的注释是这个 “//99是任意一个数,用于后面条件检测”,但是我没看懂,所以想请教一下各位
#define SHISHE shi,99,99
#define FENSHE 99,fen,99
#define MIAOSHE 99,99,miao
#define NAO_S nao_s,99,99
#define NAO_F 99,nao_f,99
#define NAO_M 99,99,nao_m
这是全部代码
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define XIANSHI shi,fen,miao
#define SHISHE shi,99,99 //99是任意一个数,用于后面条件检测
#define FENSHE 99,fen,99
#define MIAOSHE 99,99,miao
#define NAO_S nao_s,99,99 //闹钟的宏
#define NAO_F 99,nao_f,99
#define NAO_M 99,99,nao_m //宏定义结束
sbit key1=P3^0; //定义按键所连51单片机的引脚
sbit key2=P3^1;
sbit key3=P3^2;
sbit duan_1 =P2^0; //虽然声明是duan但是其实是用来位选的
sbit duan_2 =P2^1;
sbit duan_3 =P2^2;
sbit duan_4 =P2^3;
sbit duan_5 =P2^4;
sbit duan_6 =P2^5;
sbit huxiled=P2^6; //呼吸灯
sbit nzled=P3^3; //D2灯用来指示设置的闹钟时间到
sbit BEEP=P1^5;
uchar shijian[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar shi,fen,miao,nao_s=0,nao_f=0,nao_m=15,num_1=0,num_2=0,b=1,c=0;
uchar a=0,n=0;
void delayms(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--); //延时1ms
}
void xianshi(uchar S,F,M) //时间和闹钟显示函数
{
uchar shi_1,shi_2,fen_1,fen_2,miao_1,miao_2;
shi_1=S/10;shi_2=S%10;
fen_1=F/10;fen_2=F%10;
miao_1=M/10;miao_2=M%10;
if(S==99) {shi_1=10;shi_2=10;}//和设置按键有关,为了单独显示某一时或者分、秒。
if(F==99) {fen_1=10;fen_2=10;}
if(M==99) {miao_1=10;miao_2=10;}
duan_1=1;P0=shijian[shi_1];delayms(5);duan_1=0; //位选
duan_2=1;P0=shijian[shi_2];delayms(5);duan_2=0;
duan_3=1;P0=shijian[fen_1];delayms(5);duan_3=0;
duan_4=1;P0=shijian[fen_2];delayms(5);duan_4=0;
duan_5=1;P0=shijian[miao_1];delayms(5);duan_5=0;
duan_6=1;P0=shijian[miao_2];delayms(5);duan_6=0;
}
void keyscan()
{
uint time=0;
if(key1==0)
{
while(!key1)
{
time++;
if(time>40000){a=5;break;} //这是一个长按进入闹钟模式设置键
}
if(time<39999)
a++;
}
if(key2==0) //key2控制时间加
{
delayms(90);
if(key2==0)
{
if(a==1) {delayms(90);shi++;if(shi==24) shi=0;}
if(a==2) {delayms(90);fen++;if(fen==60) fen=0;}
if(a==3) {delayms(90);miao++;if(miao==60) miao=0;}
if(a==6) {delayms(90);nao_s++;if(nao_s==24) nao_s=0;}
if(a==7) {delayms(90);nao_f++;if(nao_f==60) nao_f=0;}
if(a==8) {delayms(90);nao_m++;if(nao_m==60) nao_m=0;}
}while(!key2);
}
if(key3==0) //key3控制时间减
{
delayms(90);
if(key3==0)
{
if(a==1) {delayms(90);shi--;if(shi>=0&&shi<24);else shi=23;}
if(a==2) {delayms(90);fen--;if(fen>=0&&fen<60);else fen=59;}
if(a==3) {delayms(90);miao--;if(miao>=0&&miao<60);else miao=59;}
if(a==6) {delayms(90);nao_s--;if(nao_s>=0&&nao_s<24);else nao_s=23;}
if(a==7) {delayms(90);nao_f--;if(nao_f>=0&&nao_f<60);else nao_f=59;}
if(a==8) {delayms(90);nao_m--;if(nao_m>=0&&nao_m<60);else nao_m=59;}
}while(!key3);
}
if(a==4||a==9){a=0;} //归零
}
void init()
{
nzled=0; //给D2灯一个预设熄灭
TMOD=0x01; //工作方式1
TH0=0x4C; //定时器T0 定时19ms
TL0=0x00;
ET0=1;
ET1=1;
TH1=0xc0; //定时器T1 定时56ms
TL1=0x00;
ET0=1;
ET1=1;
TR1=1;
EA=1; //总中断
}
void nzhongled() //闹钟和时间一致时让数码管和D2一起在将近10秒内频闪不断
{
uint g;
for(g=0;g<23;g++)
{
nzled=1; //闹钟显示灯开始闪烁
delayms(200);
xianshi(XIANSHI);
nzled=0;
delayms(200);
xianshi(XIANSHI);
BEEP=~BEEP; //取反输出到喇叭的信号
}
}
void main()
{
init();
while(1)
{
switch(a)
{
case 0:TR0=1;keyscan();xianshi(XIANSHI);break;
case 1:TR0=0;keyscan();xianshi(SHISHE);break;//中断关闭,时间停止
case 2:keyscan();xianshi(FENSHE);break;
case 3:keyscan();xianshi(MIAOSHE);break;
case 5:;
case 6:keyscan();xianshi(NAO_S);break;
case 7:keyscan();xianshi(NAO_F);break;
case 8:keyscan();xianshi(NAO_M);break;
}
if(a==0&&(nao_s==shi&&nao_f==fen&&nao_m==miao))
{
nzhongled(); //闹钟与时间一致进入nzhongled函数
}
}
}
void zhongduan1() interrupt 1 //精确计时 定时器中断T0
{
TH0=0x4C;
TL0=0x00;
num_1++;
if(num_1==20)
{
num_1=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24) shi=0;
}
}
}
}
void zhongduan2() interrupt 3
//呼吸灯程序,具体体现为D1灯,
//在proteus中无呼吸效果猜测是因为proteus模拟时每次刷新每帧是0.05秒太久
{
TH1=0xc0;
TL1=0x00;
num_2++;
if(b<=6)
{
if(num_2<b) huxiled=1;
else huxiled=0;
}
else
{
if((num_2+6)<b) huxiled=0;
else huxiled=1;
}
if(num_2==6)
{
num_2=0;c++;
if(c==4)
{
b++;c=0;
if(b==13) b=0;
}
}
}