?? ?
字號(hào):
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^0;
sbit en=P2^1;
sbit s1=P2^2;
sbit s2=P2^3;
sbit s3=P2^4;
sbit s4=P2^5;
sbit beep=P2^7; //moshi1:時(shí)間設(shè)置模式
sbit irq=P3^2; //moshi2:鬧鐘設(shè)置模式
sbit cs=P3^4; //moshi3:秒表設(shè)置模式
sbit as=P3^5;
sbit rw=P3^6;
sbit ds=P3^7;
uchar num,c,s1num,s3num,s4num,flag,flag1=1,flag2,flag3=1,flag4=1,moshi1,moshi2,moshi3;
uchar second=0,minute=0,hour=0,day=1,date=1,month=1,year=1;
uchar a_second,a_minute,a_hour;
uint tt;
unsigned long shu;
uchar miaobiao_shifen,miaobiao_fen,miaobiao_shimiao,miaobiao_miao,miaobiao_baihao,miaobiao_shihao;
uchar code week[8][3]={" ","MON","TUS","WEN","THU","FRI","SAT","SUN"};
uchar code table[]=" 20 - - ";
uchar code table1[]=" : : "; //flag=0 液晶顯示實(shí)時(shí)時(shí)間 =1暫停顯示
uchar code table2[]=" SET ALARM "; //flag1=0鬧鐘響 =1不響
uchar code table3[]=" MIAO BIAO "; //flag2=0讀并顯示上次鬧鐘設(shè)定的時(shí)間 =1不讀不顯示
uchar code table4[]=" 00:00:00 "; //flag3=0液晶顯示秒表 =1不顯示
void delay(uint z) //flag4=0響一段時(shí)間停 再響 =1不響
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com) //寫指令
{
rs=0; //選擇指令端 rs為0
en=0; //使能 低
P1=com; //送指令
delay(1); //延時(shí)
en=1; //使能 高
delay(1); //延時(shí)
en=0; //使能 低
}
void write_date(uchar date) //寫數(shù)據(jù)
{
rs=1; //選擇數(shù)據(jù)端 rs為1
en=0; //使能 低
P1=date; //送數(shù)據(jù)
delay(1); //延時(shí)
en=1; //使能 高
delay(1); //延時(shí)
en=0; //使能 低
}
void write_ds(uchar add,uchar date) //寫時(shí)鐘芯片
{
cs=0;
ds=1;
rw=1;
as=1;
P0=add;
as=0;
rw=0;
P0=date;
rw=1;
as=1;
cs=1;
}
uchar read_ds(uchar addr) //讀時(shí)鐘芯片
{
uchar ds_date;
cs=0;
rw=1;
ds=1;
as=1;
P0=addr;
as=0;
ds=0;
P0=0xFF;
ds_date=P0;
ds=1;
as=1;
cs=1;
return ds_date;
}
void lcd_init() //液晶初始化
{
en=0;
write_com(0x38);
write_com(0x0c); //開顯示 無光標(biāo) 不閃爍
write_com(0x06); //指針加1 整屏不移動(dòng)
write_com(0x01); //清屏
write_com(0x80); //指針指向第一行第一個(gè)
for(num=0;num<16;num++)
{
write_date(table[num]);
delay(1);
}
write_com(0x80+0x40); //指針指向第二行
for(num=0;num<12;num++)
{
write_date(table1[num]);
delay(1);
}
}
void ds_init() //DS12CR887初始化
{
as=0;
ds=0;
rw=0;
write_ds(0x0a,0x20); //DS12CR887寄存器A功能設(shè)置,開啟時(shí)鐘振蕩
}
void interrupt_init()
{
TMOD=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
EX0=1;
IT0=1;//下降沿出發(fā)方式
ET0=1;
}
void set_time() //設(shè)定時(shí)間
{
write_ds(0x0b,0x26); //設(shè)置寄存器B
write_ds(9,0); // 年
write_ds(8,1); // 月
write_ds(7,1); // 日
write_ds(6,1); // 星期
write_ds(4,23); // 時(shí)
write_ds(2,59); // 分
write_ds(0,59); // 秒
}
void set_alarm()
{
write_ds(5,0);
write_ds(3,0);
write_ds(1,0);
}
void display_sfm(uchar add,uchar date) //顯示 時(shí)分秒
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x04); //指針減1
write_com(0x80+0x40+add);
write_date(0x30+ge);
write_date(0x30+shi);
}
void display_nyr(uchar add,uchar date) //顯示 年月日
{
uchar shi,ge;
shi=date/10;
ge=date%10;
write_com(0x04); //指針減1
write_com(0x80+add);
write_date(0x30+ge);
write_date(0x30+shi);
}
void display_week(uchar add,uchar date) //顯示星期
{
uchar num;
write_com(0x06); //指針加1
write_com(0x80+add);
for(num=0;num<3;num++)
{
write_date(week[date][num]);
delay(1);
}
}
void display_miaobiao(uchar add)
{
miaobiao_shifen =shu/100000;
miaobiao_fen =shu%100000/10000;
miaobiao_shimiao=shu%100000%10000/1000;
miaobiao_miao =shu%100000%10000%1000/100;
miaobiao_baihao =shu%100000%10000%1000%100/10;
miaobiao_shihao =shu%10;
write_com(0x04); //指針減1
write_com(0x80+0x40+add);
write_date(0x30+miaobiao_shihao);
write_date(0x30+miaobiao_baihao);
write_date(':');
write_date(0x30+miaobiao_miao);
write_date(0x30+miaobiao_shimiao);
write_date(':');
write_date(0x30+miaobiao_fen);
write_date(0x30+miaobiao_shifen);
}
void time_keyscan()
{
if(s2==0)
{
flag1=1; //關(guān)閉鬧鐘
TR0=0;
}
if(moshi1==0)
{
if(s1==0)
{
delay(2);
if(s1==0)
{
moshi2=1;
moshi3=1;
s1num++; //S1按下一次
flag=1; //暫停顯示時(shí)間
while(!s1);
if(s1num==1)
{
write_com(0x80+0x40+11); //指針指向 秒的個(gè)位
write_com(0x0f); //開顯示 開光標(biāo) 開閃爍
}
if(s1num==2)
{
write_com(0x80+0x40+8); //指針指向 分的個(gè)位
}
if(s1num==3)
{
write_com(0x80+0x40+5); //指針指向 時(shí)的個(gè)位
}
if(s1num==5)
{
write_com(0x80+8); //指針指向 月的個(gè)位
}
if(s1num==4)
{
write_com(0x80+11); //指針指向 日的個(gè)位
}
if(s1num==6)
{
write_com(0x80+5); //指針指向 年的個(gè)位
}
if(s1num==7)
{
write_com(0x80+13); //指針指向 星期的第一位
}
if(s1num==8)
{
s1num=0;
write_com(0x0c); //開顯示 無光標(biāo) 不閃爍
write_ds(9,year); // 年
write_ds(8,month); // 月
write_ds(7,date); // 日
write_ds(6,day); // 星期
write_ds(4,hour); // 時(shí)
write_ds(2,minute); // 分
write_ds(0,second); // 秒
flag=0;
moshi2=0;
moshi3=0;
}
}
}
}
if(s1num!=0) //s1有按下
{
if(s2==0)
{
delay(2);
if(s2==0)
{
while(!s2);
if(s1num==1)
{
second++;
if(second>=60) //秒+
second=0;
display_sfm(11,second);
write_com(0x80+0x40+11); //指針還原到秒的個(gè)位
}
if(s1num==2) //分+
{
minute++;
if(minute>=60)
minute=0;
display_sfm(8,minute);
write_com(0x80+0x40+8); //指針還原到分的個(gè)位
}
if(s1num==3) //時(shí)+
{
hour++;
if(hour>=24)
hour=0;
display_sfm(5,hour);
write_com(0x80+0x40+5); //指針還原到時(shí)的個(gè)位
}
if(s1num==4) //日+
{
date++;
if(month!=2)
{
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:if(date>=32)
{
date=1;
}
break;
case 4:
case 6:
case 9:
case 11:if(date>=31)
{
date=1;
}
break;
}
display_nyr(11,date);
write_com(0x80+11); //指針還原到日的個(gè)位
}
else
{
if(year%4==0)
{
if(date>=30) //閏年29天
{
date=1;
}
else
{
if(date>=29)
{
date=1;
}
}
}
display_nyr(11,date);
write_com(0x80+11); //指針還原到日的個(gè)位
}
}
if(s1num==5) //月+
{
month++;
switch(month)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12: break;
case 13: month=1; break;
case 4:
case 6:
case 9:
case 11: if(date>=31)date=1;break;
case 2: if(year%4==0)
{
if(date>=30)date=1;
}
else
{
if(date>=29)date=1;
}
}
display_nyr(8,month);
write_com(0x80+11); //指針指向日的個(gè)位
display_nyr(11,date);
write_com(0x80+8); //指針還原到月的個(gè)位
}
if(s1num==6) //年+
{
year++;
if(year==100)
year=0;
display_nyr(5,year);
write_com(0x80+5); //指針還原到年的個(gè)位
}
if(s1num==7) //星期+
{
day++;
if(day==8)
day=1;
display_week(13,day);
write_com(0x80+13); //指針還原到年的個(gè)位
}
}
}
if(s3==0)
{
delay(2);
if(s3==0)
{
while(!s3);
if(s1num==1)
{
second--;
if(second==255) //秒-
second=59;
display_sfm(11,second);
write_com(0x80+0x40+11); //指針還原到秒的個(gè)位
} //分-
if(s1num==2)
{
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -