📄 naozong.c
字号:
#include <reg52.h>
#include <intrins.h>
void naozhong();
unsigned int num,sec,min,hour,date,month,year,naohour,naomin;
unsigned char n=0;
void int1() interrupt 3 //采用中断3 控制节拍//10ms
{ TH1=0xd8;
TL1=0xef;
n--;
}
Timer() interrupt 1
{ unsigned int mon;
TH0=0x3c;
TL0=0xb0;
num++;
if (num==20)
{sec++;
num=0;}
if (sec==60)
{min++;
sec=0;
if(hour==naohour)
if(min==naomin)
{naozhong();}
}
if(min==60)
{hour++;
min=0;
}if(hour==24)
{hour=0;
date++;
if((month==1)||(month==3)||(month==5)||(month==7)||
(month==8)||(month==10)||(month==12))
mon=32;
else if ((month==2)&&(year%4==0 && (year%400==0 || year%
100!=0)))
{
mon=30;
}else if ((month==2)&&(!(year%4==0 && (year%400==0 || year%
100!=0)))){
mon=29; }
else
{mon=31; }
if(date==mon)
{date=1;
month++;
if(month==13)
{month=0;
year++;
}}}
}
void dlmsl(void)
{
unsigned int i;
for(i=25000;i>0;i--)
{}
}
void dlms(void)
{
unsigned int j;
for(j=500;j>0;j--)
{}
}
unsigned char kbscan(void)
{unsigned char sccode,recode;
P1=0xf0;
if((P1&0xf0)!=0xf0)
{ dlms();
if((P1&0xf0)!=0xf0)
{sccode=0xfe;
while((sccode&0x10)!=0)
{
P1=sccode;
if((P1&0xf0)!=0xf0)
{recode=P1&0xf0;
sccode=sccode&0x0f;
return(sccode+recode);
}
else
sccode=(sccode<<1)|0x01;
}
}
}
return(0) ;
}
void dispshijian()
{unsigned int a,b;
unsigned char code tab[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
if(sec%2==0)
{P0=0x0;
P2=0x81;
dlms();}
else{
P0=0x80;
P2=0x81;
dlms();
}
a=min/10;
P0=tab[a];
P2=0x82;
dlms();
b=min%10;
P0=tab[b];
P2=0x83;
dlms();
a=hour/10;
P0=tab[a];
P2=0x80;
dlms();
b=hour%10;
P0=tab[b];
P2=0x81;
dlms();
}
void dispyueri()
{ unsigned int a,b;
unsigned char code tab[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
a=date/10;
P0=tab[a];
P2=0x82;
dlms();
b=date%10;
P0=tab[b];
P2=0x83;
dlms();
a=month/10;
P0=tab[a];
P2=0x80;
dlms();
b=month%10;
P0=tab[b];
P2=0x81;
dlms();
}
void dispnian()
{ unsigned int a,b,year1,year2;
unsigned char code tab[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
year1=year/100;
year2=year%100;
a=year1/10;
P0=tab[a];
P2=0x80;
dlms();
b=year1%10;
P0=tab[b];
P2=0x81;
dlms();
a=year2/10;
P0=tab[a];
P2=0x82;
dlms();
b=year2%10;
P0=tab[b];
P2=0x83;
dlms();
}
dispnao()
{unsigned int a,b;
unsigned char code tab[10]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
a=naomin/10;
P0=tab[a];
P2=0x82;
dlms();
b=naomin%10;
P0=tab[b];
P2=0x83;
dlms();
a=naohour/10;
P0=tab[a];
P2=0x80;
dlms();
b=naohour%10;
P0=tab[b];
P2=0x81;
dlms();
}
disp()
{unsigned int i,key;
for(i=0;i<200;i++)
{dispnian();
key=kbscan();
if(key!=0)
return;
}
for(i=0;i<200;i++)
{dispyueri();
key=kbscan();
if(key!=0)
return;
}
for(i=0;i<200;i++)
{dispshijian();
key=kbscan();
if(key!=0)
return;
}
}
void delay (unsigned char m) //控制频率延时,基本延时为1ms
{
unsigned i=m;
while(--i);
}
void delayms(unsigned char a) //毫秒延时子程序
{
while(--a); //采用while(--a) 不要采用while(a--); 各位可编译一下看看汇编结果就知道了!
}
void naozhong()
{ //n为节拍常数变量
unsigned char code music_code[]={
0x26,0x20,0x20,0x20,0x20,0x20,0x26,0x10,0x20,0x10,0x20,0x80,0x26,0x20,0x30,0x20,
0x30,0x20,0x39,0x10,0x30,0x10,0x30,0x80,0x26,0x20,0x20,0x20,0x20,0x20,0x1c,0x20,
0x20,0x80,0x2b,0x20,0x26,0x20,0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x80,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x60,0x40,0x10,0x39,0x10,0x26,0x20,
0x30,0x20,0x30,0x20,0x39,0x10,0x26,0x10,0x26,0x80,0x26,0x20,0x2b,0x10,0x2b,0x10,
0x2b,0x20,0x30,0x10,0x39,0x10,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x20,
0x20,0x10,0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x18,0x20,0x18,0x20,0x26,0x20,
0x20,0x20,0x20,0x40,0x26,0x20,0x2b,0x20,0x30,0x20,0x30,0x20,0x1c,0x20,0x20,0x20,
0x20,0x80,0x1c,0x20,0x1c,0x20,0x1c,0x20,0x30,0x20,0x30,0x60,0x39,0x10,0x30,0x10,
0x20,0x20,0x2b,0x10,0x26,0x10,0x2b,0x10,0x26,0x10,0x26,0x10,0x2b,0x10,0x2b,0x80,
0x18,0x20,0x18,0x20,0x26,0x20,0x20,0x20,0x20,0x60,0x26,0x10,0x2b,0x20,0x30,0x20,
0x30,0x20,0x1c,0x20,0x20,0x20,0x20,0x80,0x26,0x20,0x30,0x10,0x30,0x10,0x30,0x20,
0x39,0x20,0x26,0x10,0x2b,0x10,0x2b,0x20,0x2b,0x40,0x40,0x10,0x40,0x10,0x20,0x10,
0x20,0x10,0x2b,0x10,0x26,0x30,0x30,0x80,0x00
};
unsigned char p,m,key; //m为频率常数变量
unsigned char i=0;
ET1=1;
ET0=1;
TH1=0xd8;TL1=0xef;
play:
while(1)
{
a: p=music_code[i];
if(p==0x00)
{ i=0;
delayms(1000);
goto play;
} //如果碰到结束符,延时1秒,回到开始再来一遍
else if(p==0xff)
{ i=i+1;
delayms(100);
TR1=0;
goto a;
} //若碰到休止符,延时100ms,继续取下一音符
else
{
m=music_code[i++];
n=music_code[i++];
} //取频率常数 和 节拍常数
TR1=1; //开定时器1
while(n!=0)
{
P3=~P3;
delay(m);
key=kbscan();
if(key!=0)
{ET1=0;
return; }
} //等待节拍完成, 通过P2口输出音频(p2口任何一个口均可接蜂鸣器的输入端)
TR1=0; //关定时器1
}
}
void main()
{unsigned char key,shikey,rikey,niankey,naokey,mon;
P3=0;
year=2008;
TMOD=0x11;
TH0=0x3c;
TL0=0xb0;
IP=0x08;
TH1=0xd8;TL1=0xef;
EA=1;
ET0=1;
ET1=0;
TR0=1;
while(1)
{
key=kbscan();
if(key==0xd7)
{while(1)
{shikey=kbscan();
if((shikey==0xe7)||(shikey==0xeb)||(shikey==0xdb)||(shikey==0xed))
break;
if(shikey==0xb7)
{hour++;
if(hour==24)
hour=0;}
else if(shikey==0x77)
{min++;
if(min==60)
{min=0;
}}
dispshijian();
dispshijian();
dispshijian();
dispshijian();
dispshijian();
}
}
if(key==0xe7)
{while(1)
{rikey=kbscan();
if((rikey==0xd7)||(rikey==0xeb)||(rikey==0xdb)||(rikey==0xed))
break;
if(rikey==0xbb)
{month++;
if(month==13)
month=1;}
else if(rikey==0x7b)
{date++;
if((month==1)||(month==3)||(month==5)||(month==7)||
(month==8)||(month==10)||(month==12))
mon=32;
else if ((month==2)&&(year%4==0 && (year%400==0 || year%
100!=0)))
{
mon=30;
}else if ((month==2)&&(!(year%4==0 && (year%400==0 || year%
100!=0)))){
mon=29; }
else
{mon=31; }
if(date==mon)
{date=1;
}}
dispyueri();
dispyueri();
dispyueri();
dispyueri();
dispyueri();
}
}
if(key==0xeb)
{while(1)
{niankey=kbscan();
if((niankey==0xe7)||(niankey==0xd7)||(niankey==0xdb)||(niankey==0xed))
break;
if(niankey==0xbd)
{year++; }
else if(niankey==0x7d)
{year--; }
dispnian();
dispnian();
dispnian();
dispnian();
dispnian();
}
}
if(key==0xed)
{while(1)
{naokey=kbscan();
if((naokey==0xe7)||(naokey==0xd7)||(naokey==0xdb)||(naokey==0xeb))
break;
if(naokey==0xee)
{naohour++;
if(naohour==24)
naohour=0; }
else if(naokey==0xde)
{naomin++;
if(naomin==60)
naomin=0;
}
dispnao();
dispnao();
dispnao();
dispnao();
dispnao();
}
}
disp();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -