📄 ʦ
字号:
#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:时间设置模式
sbit irq=P3^2; //moshi2:闹钟设置模式
sbit cs=P3^4; //moshi3:秒表设置模式
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 液晶显示实时时间 =1暂停显示
uchar code table2[]=" SET ALARM "; //flag1=0闹钟响 =1不响
uchar code table3[]=" MIAO BIAO "; //flag2=0读并显示上次闹钟设定的时间 =1不读不显示
uchar code table4[]=" 00:00:00 "; //flag3=0液晶显示秒表 =1不显示
void delay(uint z) //flag4=0响一段时间停 再响 =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); //延时
en=1; //使能 高
delay(1); //延时
en=0; //使能 低
}
void write_date(uchar date) //写数据
{
rs=1; //选择数据端 rs为1
en=0; //使能 低
P1=date; //送数据
delay(1); //延时
en=1; //使能 高
delay(1); //延时
en=0; //使能 低
}
void write_ds(uchar add,uchar date) //写时钟芯片
{
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) //读时钟芯片
{
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); //开显示 无光标 不闪烁
write_com(0x06); //指针加1 整屏不移动
write_com(0x01); //清屏
write_com(0x80); //指针指向第一行第一个
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功能设置,开启时钟振荡
}
void interrupt_init()
{
TMOD=1;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
EA=1;
EX0=1;
IT0=1;//下降沿出发方式
ET0=1;
}
void set_time() //设定时间
{
write_ds(0x0b,0x26); //设置寄存器B
write_ds(9,0); // 年
write_ds(8,1); // 月
write_ds(7,1); // 日
write_ds(6,1); // 星期
write_ds(4,23); // 时
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) //显示 时分秒
{
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; //关闭闹钟
TR0=0;
}
if(moshi1==0)
{
if(s1==0)
{
delay(2);
if(s1==0)
{
moshi2=1;
moshi3=1;
s1num++; //S1按下一次
flag=1; //暂停显示时间
while(!s1);
if(s1num==1)
{
write_com(0x80+0x40+11); //指针指向 秒的个位
write_com(0x0f); //开显示 开光标 开闪烁
}
if(s1num==2)
{
write_com(0x80+0x40+8); //指针指向 分的个位
}
if(s1num==3)
{
write_com(0x80+0x40+5); //指针指向 时的个位
}
if(s1num==5)
{
write_com(0x80+8); //指针指向 月的个位
}
if(s1num==4)
{
write_com(0x80+11); //指针指向 日的个位
}
if(s1num==6)
{
write_com(0x80+5); //指针指向 年的个位
}
if(s1num==7)
{
write_com(0x80+13); //指针指向 星期的第一位
}
if(s1num==8)
{
s1num=0;
write_com(0x0c); //开显示 无光标 不闪烁
write_ds(9,year); // 年
write_ds(8,month); // 月
write_ds(7,date); // 日
write_ds(6,day); // 星期
write_ds(4,hour); // 时
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); //指针还原到秒的个位
}
if(s1num==2) //分+
{
minute++;
if(minute>=60)
minute=0;
display_sfm(8,minute);
write_com(0x80+0x40+8); //指针还原到分的个位
}
if(s1num==3) //时+
{
hour++;
if(hour>=24)
hour=0;
display_sfm(5,hour);
write_com(0x80+0x40+5); //指针还原到时的个位
}
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); //指针还原到日的个位
}
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); //指针还原到日的个位
}
}
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); //指针指向日的个位
display_nyr(11,date);
write_com(0x80+8); //指针还原到月的个位
}
if(s1num==6) //年+
{
year++;
if(year==100)
year=0;
display_nyr(5,year);
write_com(0x80+5); //指针还原到年的个位
}
if(s1num==7) //星期+
{
day++;
if(day==8)
day=1;
display_week(13,day);
write_com(0x80+13); //指针还原到年的个位
}
}
}
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); //指针还原到秒的个位
} //分-
if(s1num==2)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -