#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define busy 0x80
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
sbit RS=P2^5;
sbit RW=P2^6;
sbit E=P2^7;
sbit led=P2^0;
sbit sound=P3^7;
uchar code tableee[]=" 20:00 20:00";
uchar code tablee[]=" 10:00 10:00";
uchar code table[]=" 05:00 05:00";
uchar code table1[]={'0','1','2','3','4','5','6','7','8','9'};
uchar code table3[]="14 dao ji shi";
uchar code table2[]="888888888888";
uchar code table5[]=" 05:00";
uchar code table4[]=" TIME OUT! ";
uchar d,e,num,t,shishi,shige,fenshi,fenge,miaoshi,miaoge,b,b1,a,aa;
uint counter=0;
uchar code array[]= {0x18, 0x30, 0x1C, 0x10, 0x20, 0x40, 0x1C, 0x10,
0x18, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x18, 0x40,
0x1C, 0x20, 0x20, 0x20, 0x1C, 0x20, 0x18, 0x20,
0x20, 0x80, 0xFF, 0x20, 0x30, 0x1C, 0x10, 0x18,
0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x26,
0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20, 0x20,
0x20, 0x30, 0x80, 0xFF, 0x20, 0x20, 0x1C, 0x10,
0x18, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20,
0x30, 0x20, 0x2B, 0x40, 0x20, 0x20, 0x1C, 0x10,
0x18, 0x10, 0x20, 0x20, 0x26, 0x20, 0x2B, 0x20,
0x30, 0x20, 0x2B, 0x40, 0x20, 0x30, 0x1C, 0x10,
0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20,
0x26, 0x40, 0x20, 0x20, 0x2B, 0x20, 0x26, 0x20,
0x20, 0x20, 0x30, 0x80, 0x20, 0x30, 0x1C, 0x10,
0x20, 0x10, 0x1C, 0x10, 0x20, 0x20, 0x26, 0x20,
0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40, 0x20, 0x15,
0x1F, 0x05, 0x20, 0x10, 0x1C, 0x10, 0x20, 0x20,
0x26, 0x20, 0x2B, 0x20, 0x30, 0x20, 0x2B, 0x40,
0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20,
0x1C, 0x20, 0x20, 0x20, 0x26, 0x40, 0x20, 0x20,
0x2B, 0x20, 0x26, 0x20, 0x20, 0x20, 0x30, 0x30,
0x20, 0x30, 0x1C, 0x10, 0x18, 0x40, 0x1C, 0x20,
0x20, 0x20, 0x26, 0x40, 0x13, 0x60, 0x18, 0x20,
0x15, 0x40, 0x13, 0x40, 0x18, 0x80, 0x00
};
char shi,fen,miao;
void LCD_init();
bit lcd_busy();
void write_1602cmd(uchar cmd); //写命令
void write_1602Data(uchar Data); //写数据
void sound_delay(uchar n);
void playmusic();
void delay(uchar z);
void init()
{
t=0,led=1;
TMOD=0X11; //设置定时器0,置定时器1在工作方式1
TH0=0xff;
TL0=0xff;
TH1=(65536-50000)/256; //给定时器1装初值
TL1=(65536-50000)%256;
EA=1; //开启总中断
ET0=1; // 开启外部中断0中断
ET1=1;// 开启定时器1中断
TR0=0;
TR1=0;
LCD_init();
write_1602cmd(0x80);
for(num=0;num<14;num++)
{
write_1602Data(table3[num]);
delay(5);
}
write_1602cmd(0x80+0x40);
for(num=0;num<12;num++)
{
write_1602Data(table2[num]);
delay(5);
}
}
void key_check()
{
if(k2==0) //5min
{
delay(10);
if(k2==0)
{
write_1602cmd(0x80+0x40);
for(num=0;num<12;num++)
{
write_1602Data(table[num]);
delay(5);
}
TR1=1;fen=5;miao=0;
}
}
if(k3==0) //10min
{
delay(10);
if(k3==0)
{
write_1602cmd(0x80+0x40);
for(num=0;num<12;num++)
{
write_1602Data(tablee[num]);
delay(5);
}
TR1=1;fen=10;miao=0;
}
}
if(k4==0) //20min
{
delay(10);
if(k4==0)
{
write_1602cmd(0x80+0x40);
for(num=0;num<12;num++)
{
write_1602Data(tableee[num]);
delay(5);
}
TR1=1;fen=20;miao=0;
}
}
if(k1==0)
{
delay(10);
if(k1==0)
{
write_1602cmd(0x80+0x40);
for(num=0;num<12;num++)
{
write_1602Data(table5[num]);
delay(5);
}
fen = 5;
while(k4 != 0)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
fen++;
fenge=fen%10;
fenshi=fen/10;
write_1602cmd(0x80+0x40+2);
write_1602Data(table1[fenge]);
write_1602cmd(0x80+0x40+1);
write_1602Data(table1[fenshi]);
write_1602cmd(0x0f); //打开光标闪烁
while(k2==0);
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
fen--;
fenge=fen%10;
fenshi=fen/10;
write_1602cmd(0x80+0x40+2);
write_1602Data(table1[fenge]);
write_1602cmd(0x80+0x40+1);
write_1602Data(table1[fenshi]);
write_1602cmd(0x0f); //打开光标闪烁
while(k3==0);
}
}
}
TR1=1;
write_1602cmd(0x0c); //关闭光标闪烁
}
}
}
void main()
{
a=0,aa=0,d=0;e=0;
init();
delay(100);
while(1)
{
if(TR1 == 0) key_check();
while(TR0==1&&TR1==0)
{
playmusic();
}
}
}
void time1() interrupt 3 //定时器1中断
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
a++;
aa++;
if(a==20) //定时达到1s
{
a=0;
if(fen==0 && miao==0) //到达了指定时间
{
TR1=0;TR0=1;led=0;
write_1602cmd(0x80+0x40);
for(num=0;num<15;num++)
{
write_1602Data(table4[num]);
delay(5);
}
goto end; //直接跳出定时器中断
}
if(miao==0)
{
miao = 59;
fen--;
fenge=fen%10;
fenshi=fen/10;
write_1602cmd(0x80+0x40+8);
write_1602Data(table1[fenge]);
write_1602cmd(0x80+0x40+7);
write_1602Data(table1[fenshi]);
}
miaoge = miao%10;
miaoshi = miao/10;
write_1602cmd(0x80+0x40+11);
write_1602Data(table1[miaoge]);
write_1602cmd(0x80+0x40+10);
write_1602Data(table1[miaoshi]);
miao--;
}
if(aa==10) //开启流水灯,让它随时间的流动
{
aa=0;
led=~led;
write_1602cmd(0x80+0x40+9);
if(led ==1)
{
write_1602Data(':');
}else{
write_1602Data(' ');
}
}
end: //结束了直接跳到这里来
;
}
//*********************************************
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=200;y>0;y--);
}
bit lcd_busy() //测试LCD忙碌状态
{
bit result;
E= 0;
RS= 0; //指令
RW= 1; //读出
E= 1;
delay(4);//高电平读出 1us
result = (bit)(P0 & busy);
E= 0;
return result;
}
void write_1602cmd(uchar cmd) //写命令
{
while(lcd_busy());
RS=0;
delay(5);
RW=0;
delay(5);
E=0;
delay(5);
P0=cmd;
E=1;
delay(10);
E=0;
}
void write_1602Data(uchar Data) //写数据
{while(lcd_busy());
RS=1;
delay(5);
RW=0;
delay(5);
E=0;
P0=Data;
delay(5);
E=1;
delay(10);
E=0;
}
//lcd初始化
void LCD_init()
{
write_1602cmd(0x01); //清屏
delay(5);
write_1602cmd(0x38); //功能设定
delay(5);
write_1602cmd(0x0c); //光标不闪烁
delay(5);
write_1602cmd(0x06); //lcd模式设定,
delay(5);
}
void sound_delay(uchar n)
{
uchar i;
while(n--)
{
for(i=0;i<2;i++);
}
}
void time0() interrupt 1 //定时器0中断
{
counter=counter+1;//节拍次数计数
TH0=0xd8; //定义单位节拍的延时大小
TL0=0xef;
}
void playmusic()
{
uint i;
uchar sound_signal;//定义音符大小
uchar sound_pace;
while(1)
{
i=0;
while(array[i]!=0x00)
{ //如果是休止符,延时100ms,并终止本次循环,进入下一个循环
if(array[i]==0xff)
{
TR0=0;
i++;
delay(100);
continue;
} //从表中取得音符�
sound_signal=array[i];
i=i+1; //从表中取得节拍大小
sound_pace=array[i];
TR0=1; //当节拍数未达到时候,继续循环,产生该音调的声音
while(counter!=sound_pace)
{
sound=~sound;
sound_delay(sound_signal);
}
评论0