#include
#define uchar unsigned char
#define uint unsigned int
sbit E=P3^4;
sbit RS=P3^5;
sbit key1=P2^4;
sbit key2=P2^5;
sbit key3=P2^6;
sbit key4=P2^7;
sbit mbkey=P2^2;
sbit beep=P2^3;
uchar count,shi=00,fen=00,miao=00,key1num,flag,flag1,xqnum;//flag闹钟
uchar key2num,jinzhi=3,naonum=1,ms,mbmiao,mbfen,mbkeynum,num; //ms秒表进数,mbmiao.mbfen 秒表的秒. 分 key2num 是key5的计数 jinzhi 进制转换参数
uint nian=2010,yue=12,ri=8,count2;
uchar code table[]=" 2010-12-8THU";
uchar code table1[]="24d 00:00:00 ON";
uchar code table2[]="MON,TUE,WED,THU,FRI,SAT,SUN";
uchar code table3[]="am ,pm ,24d";
uchar code table4[]="ON ,OFF";
uchar code table5[]=" 00:00:00 mb ";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void di(uint x) //蜂鸣器发声函数
{
beep=0;
delay(x);
beep=1;
}
void write_com(uchar com)//给液晶写命令
{
RS=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
void write_date(uchar date)//给液晶写数据
{
RS=1;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
void init() //初始化函数
{
uchar num;
E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);//清零
write_com(0x80);
for(num=0;num
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40); //第二行
for(num=0;num
{
write_date(table1[num]);
delay(20);
}
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
ET1=0;
TR1=0;
}
void write_nian(uchar add , uint date) //年显示函数
uchar qian,bai,shi,ge;
qian=date/1000;
bai=(date-1000*qian)/100;
shi=(date-qian*1000-bai*100)/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_yue(uchar add , uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_ri(uchar add , uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_sfm(uchar add ,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
//月显示函数//日显示函数 //秒显示函数
void write_week(uchar week) //星期显示函数 {
uchar week_num;
week_num=week;
switch(week_num)
{
case 1: write_com(0x80+13);
write_date(table2[0]);
write_date(table2[1]);
write_date(table2[2]);
write_com(0x80+13);
break;
case 2: write_com(0x80+13);
write_date(table2[4]);
write_date(table2[5]);
write_date(table2[6]);
write_com(0x80+13);
break;
case 3: write_com(0x80+13);
write_date(table2[8]);
write_date(table2[9]);
write_date(table2[10]);
write_com(0x80+13);
break;
case 4: write_com(0x80+13);
write_date(table2[12]);
write_date(table2[13]);
write_date(table2[14]);
write_com(0x80+13);
break;
case 5: write_com(0x80+13);
write_date(table2[16]);
write_date(table2[17]);
write_date(table2[18]);
write_com(0x80+13);
break;
case 6: write_com(0x80+13);
write_date(table2[20]);
write_date(table2[21]);
write_date(table2[22]);
write_com(0x80+13);
break;
case 7: write_com(0x80+13);
write_date(table2[24]);
write_date(table2[25]);
write_date(table2[26]);
write_com(0x80+13);
break;
}
}
void write_jinzhi(uchar jinzhi)
{
uchar jznum;
jznum=jinzhi;
switch(jznum)
{
case 1: write_com(0x80+0x40+0);
write_date(table3[0]);
write_date(table3[1]);
write_date(table3[2]);
write_com(0x80+0x40+0);
break;
case 2: write_com(0x80+0x40+0);
write_date(table3[4]);
write_date(table3[5]);
write_date(table3[6]);
write_com(0x80+0x40+0);
break;
case 3: write_com(0x80+0x40+0);
write_date(table3[8]);
write_date(table3[9]);
write_date(table3[10]);
write_com(0x80+0x40+0);
break;
}
}
//jinzhi进制显示函数
void write_nao(uchar nao) //闹钟开关显示函数 {
uchar naonum;
naonum=nao;
switch(naonum)
{
case 1: write_com(0x80+0x40+13);
write_date(table4[0]);
write_date(table4[1]);
write_date(table4[2]);
write_com(0x80+0x40+13);
break;
case 2: write_com(0x80+0x40+13);
write_date(table4[4]);
write_date(table4[5]);
write_date(table4[6]);
write_com(0x80+0x40+13);
break;
}
}
void keyboard() //按键扫描函数
{
if(flag==1)
{
//闹钟暂停函数
if(key4==0)
{
delay(5);
if(key4==0)
{
while(!key4);
beep=1;
flag=0;
}
}
}
if(key1==0)
{
delay(5);//消斗
if(key1==0)
{
key1num++; while(!key1); di(1); if(key1num==1) { TR0=0; write_com(0x80+0x40+10); write_com(0x0f);//光标闪烁 } if(key1num==2) { write_com(0x80+0x40+7); } if(key1num==3) { write_com(0x80+0x40+4); } if(key1num==4) { write_com(0x80+0x40); } if(key1num==5) { write_com(0x80+2); } if(key1num==6) { write_com(0x80+7); } if(key1num==7) { write_com(0x80+10); } if(key1num==8) { write_com(0x80+13); } if(key1num==9) { write_com(0x80+0x40+13); } if(key1num==10) { key1num=0;
} } write_com(0x0c);//光标停止闪烁 TR0=1;//打开定时器 } if(key1num!=0) { if(key2==0) { delay(5); if(key2==0) { while(!key2);//等待松手 di(100); if(key1num==1) { miao++; if(miao==60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); } if(key1num==2) { fen++; if(fen==60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); } if(key1num==3) { shi++; if(jinzhi==3) { if(shi==24) shi=0; } else { if(shi>12) shi=shi-12; }
write_com(0x80+0x40+4); } if(key1num==4) { jinzhi++; if(jinzhi==4) jinzhi=1; write_jinzhi(jinzhi); } if(key1num==5) { nian++; write_nian(2,nian); write_com(0x80+2); } if(key1num==6) { yue++; if(yue==13) yue=1; write_yue(7,yue); write_com(0x80+7); } if(key1num==7) { ri++; if(ri==32) ri=1; write_ri(10,ri); write_com(0x80+10); } if(key1num==8) { xqnum++; if(xqnum==8) xqnum=1; write_week(xqnum); } if(key1num==9) { naonum++; if(naonum==3) naonum=1;
} if(key1num==10) { key1num=0; write_com(0x0c);//光标停止闪烁 TR0=1;//打开定时器 } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); di(100); if(key1num==1) { miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); } if(key1num==2) { fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); } if(key1num==3) { shi--; if(shi==-1) shi=23; if(jinzhi==3) {
if(shi==-1) shi=23; } else { if(shi
write_week(xqnum);
write_com(0x80+10);
}
if(key1num==9)
{
naonum--;
if(naonum==0)
naonum=2;
write_nao(naonum);
write_com(0x80+0X40+13);
}
}
}
}
}
}
void mbiao( ) //秒表函数
{
if(mbkey==0)
{
mbkeynum++;
while(!mbkey);
if(mbkeynum==1) //关闭时钟定时器
{
TR0=0;
ET0=0;
write_com(0x80+0x40);
for(num=0;num
write_date(table5[num]);
ms=0;
mbmiao=0;
mbfen=0;
TR1=0;
ET1=0;
}
if(mbkeynum==2) //打开秒表定时器关闭时钟定时器 {
TR1=1;
ET1=1;
TR0=0;
ET0=0;
}
if(mbkeynum==3) //关闭秒表定时器 {
TR1=0;
ET1=0;
TR0=0;
ET0=0;
}
if(mbkeynum==4)
{
TR0=1;
ET0=1;
TR1=0;
ET1=0;
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
write_jinzhi(jinzhi);
write_com(0x80+0x40+13);
write_date(' ');
write_date('O');
write_date('N');
mbkeynum=0;
}
}
}
void main()
{
init();
while(1)
{
keyboard();
mbiao();
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0; //显示时钟状态打开时钟定时器 //液晶变化
fen++; if(fen==60) { fen=0; shi++; if(jinzhi==3) //24进制时钟 { if(shi==24) shi=0; } else { if(shi>12) //12进制时钟 { shi=shi-12; jinzhi++; if(jinzhi==3) jinzhi=1; } } write_sfm(4,shi); write_jinzhi(jinzhi); } write_sfm(7,fen); } write_sfm(10,miao); if(miao==0&&fen==0&&shi==0||(jinzhi==2&&shi==12&&fen==0&&miao==0))//日期和星期递变 { write_com(0x80+9); ri++; if(ri==32) { ri=1; yue++; if(yue==13) { yue=1; nian++; write_nian(2,nian); } write_yue(7,yue); } write_ri(10,ri);
xqnum++;
write_week(xqnum); }
if(fen==0&&miao>=0&&miao
{
flag=1;
beep=~beep;
}
if(naonum==1&&fen==0&&miao==30) {
flag=1;
beep=0;
}
if(miao==6)
beep=1;
}
}
}
void timer0() interrupt 1 //时钟定时器 {
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
void timer1() interrupt 3 //秒表定时器 {
//TL1=([1**********])%256;
//TH1=([1**********])/256;
TL1=(65536 - 50000)%256;
TH1=(65536 - 50000)/256;
ms++;
write_sfm(10,ms);
if(ms==1*30)
{
mbmiao++;
write_sfm(7,mbmiao);
ms=0;
if(mbmiao==60)
{
mbmiao=0; //闹钟
} } } mbfen++; write_sfm(4,mbfen);
#include
#define uchar unsigned char
#define uint unsigned int
sbit E=P3^4;
sbit RS=P3^5;
sbit key1=P2^4;
sbit key2=P2^5;
sbit key3=P2^6;
sbit key4=P2^7;
sbit mbkey=P2^2;
sbit beep=P2^3;
uchar count,shi=00,fen=00,miao=00,key1num,flag,flag1,xqnum;//flag闹钟
uchar key2num,jinzhi=3,naonum=1,ms,mbmiao,mbfen,mbkeynum,num; //ms秒表进数,mbmiao.mbfen 秒表的秒. 分 key2num 是key5的计数 jinzhi 进制转换参数
uint nian=2010,yue=12,ri=8,count2;
uchar code table[]=" 2010-12-8THU";
uchar code table1[]="24d 00:00:00 ON";
uchar code table2[]="MON,TUE,WED,THU,FRI,SAT,SUN";
uchar code table3[]="am ,pm ,24d";
uchar code table4[]="ON ,OFF";
uchar code table5[]=" 00:00:00 mb ";
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void di(uint x) //蜂鸣器发声函数
{
beep=0;
delay(x);
beep=1;
}
void write_com(uchar com)//给液晶写命令
{
RS=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
void write_date(uchar date)//给液晶写数据
{
RS=1;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
void init() //初始化函数
{
uchar num;
E=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);//清零
write_com(0x80);
for(num=0;num
{
write_date(table[num]);
delay(20);
}
write_com(0x80+0x40); //第二行
for(num=0;num
{
write_date(table1[num]);
delay(20);
}
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
TH1=(65536-10000)/256;
TL1=(65536-10000)%256;
ET1=0;
TR1=0;
}
void write_nian(uchar add , uint date) //年显示函数
uchar qian,bai,shi,ge;
qian=date/1000;
bai=(date-1000*qian)/100;
shi=(date-qian*1000-bai*100)/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+qian);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_yue(uchar add , uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_ri(uchar add , uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
void write_sfm(uchar add ,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
//月显示函数//日显示函数 //秒显示函数
void write_week(uchar week) //星期显示函数 {
uchar week_num;
week_num=week;
switch(week_num)
{
case 1: write_com(0x80+13);
write_date(table2[0]);
write_date(table2[1]);
write_date(table2[2]);
write_com(0x80+13);
break;
case 2: write_com(0x80+13);
write_date(table2[4]);
write_date(table2[5]);
write_date(table2[6]);
write_com(0x80+13);
break;
case 3: write_com(0x80+13);
write_date(table2[8]);
write_date(table2[9]);
write_date(table2[10]);
write_com(0x80+13);
break;
case 4: write_com(0x80+13);
write_date(table2[12]);
write_date(table2[13]);
write_date(table2[14]);
write_com(0x80+13);
break;
case 5: write_com(0x80+13);
write_date(table2[16]);
write_date(table2[17]);
write_date(table2[18]);
write_com(0x80+13);
break;
case 6: write_com(0x80+13);
write_date(table2[20]);
write_date(table2[21]);
write_date(table2[22]);
write_com(0x80+13);
break;
case 7: write_com(0x80+13);
write_date(table2[24]);
write_date(table2[25]);
write_date(table2[26]);
write_com(0x80+13);
break;
}
}
void write_jinzhi(uchar jinzhi)
{
uchar jznum;
jznum=jinzhi;
switch(jznum)
{
case 1: write_com(0x80+0x40+0);
write_date(table3[0]);
write_date(table3[1]);
write_date(table3[2]);
write_com(0x80+0x40+0);
break;
case 2: write_com(0x80+0x40+0);
write_date(table3[4]);
write_date(table3[5]);
write_date(table3[6]);
write_com(0x80+0x40+0);
break;
case 3: write_com(0x80+0x40+0);
write_date(table3[8]);
write_date(table3[9]);
write_date(table3[10]);
write_com(0x80+0x40+0);
break;
}
}
//jinzhi进制显示函数
void write_nao(uchar nao) //闹钟开关显示函数 {
uchar naonum;
naonum=nao;
switch(naonum)
{
case 1: write_com(0x80+0x40+13);
write_date(table4[0]);
write_date(table4[1]);
write_date(table4[2]);
write_com(0x80+0x40+13);
break;
case 2: write_com(0x80+0x40+13);
write_date(table4[4]);
write_date(table4[5]);
write_date(table4[6]);
write_com(0x80+0x40+13);
break;
}
}
void keyboard() //按键扫描函数
{
if(flag==1)
{
//闹钟暂停函数
if(key4==0)
{
delay(5);
if(key4==0)
{
while(!key4);
beep=1;
flag=0;
}
}
}
if(key1==0)
{
delay(5);//消斗
if(key1==0)
{
key1num++; while(!key1); di(1); if(key1num==1) { TR0=0; write_com(0x80+0x40+10); write_com(0x0f);//光标闪烁 } if(key1num==2) { write_com(0x80+0x40+7); } if(key1num==3) { write_com(0x80+0x40+4); } if(key1num==4) { write_com(0x80+0x40); } if(key1num==5) { write_com(0x80+2); } if(key1num==6) { write_com(0x80+7); } if(key1num==7) { write_com(0x80+10); } if(key1num==8) { write_com(0x80+13); } if(key1num==9) { write_com(0x80+0x40+13); } if(key1num==10) { key1num=0;
} } write_com(0x0c);//光标停止闪烁 TR0=1;//打开定时器 } if(key1num!=0) { if(key2==0) { delay(5); if(key2==0) { while(!key2);//等待松手 di(100); if(key1num==1) { miao++; if(miao==60) miao=0; write_sfm(10,miao); write_com(0x80+0x40+10); } if(key1num==2) { fen++; if(fen==60) fen=0; write_sfm(7,fen); write_com(0x80+0x40+7); } if(key1num==3) { shi++; if(jinzhi==3) { if(shi==24) shi=0; } else { if(shi>12) shi=shi-12; }
write_com(0x80+0x40+4); } if(key1num==4) { jinzhi++; if(jinzhi==4) jinzhi=1; write_jinzhi(jinzhi); } if(key1num==5) { nian++; write_nian(2,nian); write_com(0x80+2); } if(key1num==6) { yue++; if(yue==13) yue=1; write_yue(7,yue); write_com(0x80+7); } if(key1num==7) { ri++; if(ri==32) ri=1; write_ri(10,ri); write_com(0x80+10); } if(key1num==8) { xqnum++; if(xqnum==8) xqnum=1; write_week(xqnum); } if(key1num==9) { naonum++; if(naonum==3) naonum=1;
} if(key1num==10) { key1num=0; write_com(0x0c);//光标停止闪烁 TR0=1;//打开定时器 } } } if(key3==0) { delay(5); if(key3==0) { while(!key3); di(100); if(key1num==1) { miao--; if(miao==-1) miao=59; write_sfm(10,miao); write_com(0x80+0x40+10); } if(key1num==2) { fen--; if(fen==-1) fen=59; write_sfm(7,fen); write_com(0x80+0x40+7); } if(key1num==3) { shi--; if(shi==-1) shi=23; if(jinzhi==3) {
if(shi==-1) shi=23; } else { if(shi
write_week(xqnum);
write_com(0x80+10);
}
if(key1num==9)
{
naonum--;
if(naonum==0)
naonum=2;
write_nao(naonum);
write_com(0x80+0X40+13);
}
}
}
}
}
}
void mbiao( ) //秒表函数
{
if(mbkey==0)
{
mbkeynum++;
while(!mbkey);
if(mbkeynum==1) //关闭时钟定时器
{
TR0=0;
ET0=0;
write_com(0x80+0x40);
for(num=0;num
write_date(table5[num]);
ms=0;
mbmiao=0;
mbfen=0;
TR1=0;
ET1=0;
}
if(mbkeynum==2) //打开秒表定时器关闭时钟定时器 {
TR1=1;
ET1=1;
TR0=0;
ET0=0;
}
if(mbkeynum==3) //关闭秒表定时器 {
TR1=0;
ET1=0;
TR0=0;
ET0=0;
}
if(mbkeynum==4)
{
TR0=1;
ET0=1;
TR1=0;
ET1=0;
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
write_jinzhi(jinzhi);
write_com(0x80+0x40+13);
write_date(' ');
write_date('O');
write_date('N');
mbkeynum=0;
}
}
}
void main()
{
init();
while(1)
{
keyboard();
mbiao();
if(count==20)
{
count=0;
miao++;
if(miao==60)
{
miao=0; //显示时钟状态打开时钟定时器 //液晶变化
fen++; if(fen==60) { fen=0; shi++; if(jinzhi==3) //24进制时钟 { if(shi==24) shi=0; } else { if(shi>12) //12进制时钟 { shi=shi-12; jinzhi++; if(jinzhi==3) jinzhi=1; } } write_sfm(4,shi); write_jinzhi(jinzhi); } write_sfm(7,fen); } write_sfm(10,miao); if(miao==0&&fen==0&&shi==0||(jinzhi==2&&shi==12&&fen==0&&miao==0))//日期和星期递变 { write_com(0x80+9); ri++; if(ri==32) { ri=1; yue++; if(yue==13) { yue=1; nian++; write_nian(2,nian); } write_yue(7,yue); } write_ri(10,ri);
xqnum++;
write_week(xqnum); }
if(fen==0&&miao>=0&&miao
{
flag=1;
beep=~beep;
}
if(naonum==1&&fen==0&&miao==30) {
flag=1;
beep=0;
}
if(miao==6)
beep=1;
}
}
}
void timer0() interrupt 1 //时钟定时器 {
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
}
void timer1() interrupt 3 //秒表定时器 {
//TL1=([1**********])%256;
//TH1=([1**********])/256;
TL1=(65536 - 50000)%256;
TH1=(65536 - 50000)/256;
ms++;
write_sfm(10,ms);
if(ms==1*30)
{
mbmiao++;
write_sfm(7,mbmiao);
ms=0;
if(mbmiao==60)
{
mbmiao=0; //闹钟
} } } mbfen++; write_sfm(4,mbfen);