DS12C887电子时钟详细教程Word格式.docx
《DS12C887电子时钟详细教程Word格式.docx》由会员分享,可在线阅读,更多相关《DS12C887电子时钟详细教程Word格式.docx(20页珍藏版)》请在冰豆网上搜索。
//闹铃查看键
sbitbeep=P2^3;
//蜂鸣器
sbitdscs=P1^4;
sbitdsas=P1^5;
sbitdsrw=P1^6;
sbitdsds=P1^7;
sbitdsirq=P3^3;
//中断
bitflag1,flag_ri;
//定义标志位flag1设置闹铃
ucharcount,s1num,flag,t0_num;
charmiao,shi,fen,year,month,day,week,amiao,afen,ashi;
charcodetable[]="
20--"
;
//20--
ucharcodetable1[]="
:
"
//:
voidwrite_ds(uchar,uchar);
ucharread_ds(uchar);
voidset_time();
voidread_alarm();
voidset_alarm(uchar,uchar,uchar);
voiddelayms(uintz)//延时毫秒的程序
{
uintx,y;
for(x=z;
x>
0;
x--)
for(y=112;
y>
y--);
}
voiddi()
beep=0;
delayms(100);
beep=1;
voidwrite_cmd(ucharcmd)
lcden=0;
lcdrs=0;
P0=cmd;
_nop_();
lcden=1;
delayms
(1);
voidwrite_dat(uchardat)
lcdrs=1;
P0=dat;
voidlcdint()
write_cmd(0x38);
//显示模式设置
write_cmd(0x0c);
//开显示,不显示光标,不闪烁
write_cmd(0x06);
//写一个字符后地址加1,屏幕不移
write_cmd(0x01);
//清屏
voidinit()
ucharnum;
EA=1;
//开总中断
EX1=1;
//开外部中断1
IT1=1;
//外部中断下降沿触发
flag1=0;
t0_num=0;
s1num=0;
week=1;
lcdint();
write_cmd(0x80);
for(num=0;
num<
15;
num++)
{
write_dat(table[num]);
}
write_cmd(0xc0);
11;
write_dat(table1[num]);
voidwrite_sfm(ucharadd,chardate)//写时间,2位一起写
charshi,ge;
shi=date/10;
ge=date%10;
write_cmd(0xc0+add);
write_dat(0x30+shi);
write_dat(0x30+ge);
}
voidwrite_nyr(ucharadd,chardate)//年月日
write_cmd(0x80+add);
voidwrite_week(charwe)//星期
write_cmd(0x80+12);
switch(we)
{
case1:
write_dat('
M'
);
write_dat('
O'
N'
break;
case2:
T'
U'
E'
case3:
W'
D'
case4:
H'
case5:
F'
R'
I'
case6:
S'
A'
case7:
}
voidkeyscan()
if(flag_ri==1)
if((s1==0)||(s2==0)||(s3==0)||(s4==0))//按任意键取消闹钟报警
delayms(5);
if((s1==0)||(s2==0)||(s3==0)||(s4==0))
{
while(!
(s1&
&
s2&
s3&
s4));
di();
flag_ri=0;
}
}
if(s1==0)//如果功能按键1按下
delayms(5);
//去抖动
if(s1==0)
{
while(!
s1);
//等待松手
s1num++;
//记下次数
di();
//蜂鸣器响
if(flag1==1)//设置闹铃为1时才对s1num调整,只调秒,分,时
if(s1num>
3)
{
s1num=1;
}
flag=1;
//在调整时间时标志位flag为1,不进行正常操作
switch(s1num)
case1:
write_cmd(0xc0+10);
write_cmd(0x0f);
break;
//按一下秒钟指针显示闪烁
case2:
write_cmd(0xc0+7);
case3:
write_cmd(0xc0+4);
case4:
write_cmd(0x80+12);
case5:
write_cmd(0x80+9);
case6:
write_cmd(0x80+6);
case7:
write_cmd(0x80+3);
default:
//用default可以解决s1num跑飞
s1num=0;
write_cmd(0x0c);
//按了8次关闪烁,flag=0,退出调整,显示时间
flag=0;
write_ds(0,miao);
//将调整后的时间写入ds12c887
write_ds(2,fen);
write_ds(4,shi);
write_ds(6,week);
write_ds(7,day);
write_ds(8,month);
write_ds(9,year);
break;
if(s1num!
=0)//S1有按下过,检测S2,S3
if(s2==0)//如果按键2按下执行加
if(s2==0)
s2);
switch(s1num)
case1:
miao++;
if(miao>
59)
{
miao=0;
}
write_sfm(10,miao);
write_cmd(0x80+0x40+10);
break;
case2:
fen++;
if(fen>
fen=0;
write_sfm(7,fen);
write_cmd(0x80+0x40+7);
case3:
shi++;
if(shi>
23)
shi=0;
write_sfm(4,shi);
write_cmd(0x80+0x40+4);
case4:
week++;
if(week>
7)
week=1;
write_week(week);
write_cmd(0x80+12);
case5:
day++;
if(day>
31)
day=1;
write_nyr(9,day);
write_cmd(0x80+9);
case6:
month++;
if(month>
12)
month=1;
write_nyr(6,month);
write_cmd(0x80+6);
case7:
year++;
if(year>
99)
year=0;
write_nyr(3,year);
write_cmd(0x80+3);
}
if(s3==0)
if(s3==0)
s3);
miao--;
if(miao<
0)
miao=59;
fen--;
if(fen<
fen=59;
shi--;
if(shi<
shi=23;
week--;
if(week<
1)
week=7;
day--;
if(day<
day=31;
month--;
if(month<
month=12;
year--;
if(year<
year=99;
}
if(s4==0)
if(s4==0)
s4);
flag1=~flag1;
//闹铃调好后再按一次键返回
if(flag1==0)//退出闹钟设置保存数值
//启动时间显示
write_cmd(0x80+0x40);
write_dat('
'
//清屏下,否则光标乱跳(闹铃调时间时)
write_ds(1,miao);
write_ds(3,fen);
write_ds(5,shi);
else//设置闹钟
read_alarm();
//读原始数据
miao=amiao;
fen=afen;
shi=ashi;
write_cmd(0xc0);
i'
write_sfm(4,ashi);
write_sfm(7,afen);
write_sfm(10,amiao);
}
voidwrite_ds(ucharadd,uchardate)//写12c887函数
dscs=0;
dsas=1;
dsds=1;
dsrw=1;
P0=add;
//写地址
dsas=0;
dsrw=0;
P0=date;
//写数据
dscs=1;
ucharread_ds(ucharadd)//读12c887
uchards_date;
dsds=0;
P0=0xff;
ds_date=P0;
returnds_date;
voidset_time()//初始化
write_ds(0,0);
//秒
write_ds(1,10);
//秒闹铃
write_ds(2,34);
//分钟
write_ds(3,34);
//分钟闹铃
write_ds(4,15);
//小时
write_ds(5,15);
//小时闹铃
write_ds(6,5);
//星期
write_ds(7,20);
//日
write_ds(8,5);
//月
write_ds(9,11);
//年
voidread_alarm()
amiao=read_ds
(1);
afen=read_ds(3);
ashi=read_ds(5);
voidmain()
init();
while
(1)
keyscan();
//键盘不断扫描
if(flag_ri==1)//如果闹铃时间到
delayms(100);
delayms(500);
if(flag==0&
flag1==0)
keyscan();
year=read_ds(9);
month=read_ds(8);
day=read_ds(7);
week=read_ds(6);
shi=read_ds(4);
fen=read_ds
(2);
miao=read_ds(0);
write_sfm(10,miao);
write_sfm(7,fen);
write_sfm(4,shi);
write_week(week);
write_nyr(3,year);
write_nyr(6,month);
write_nyr(9,day);
}
voidexter()interrupt2//闹铃外部中断1
ucharc;
//闹铃时间到
flag_ri=1;
c=read_ds(0x0c);
//读C寄存器表示响应中断
下面是管脚和时序图
寄存器的定义如下
我爱帮帮,啵!
嘻嘻