STC89C52 DS12C887 1602液晶引脚连接以及C程序DOCWord下载.docx
《STC89C52 DS12C887 1602液晶引脚连接以及C程序DOCWord下载.docx》由会员分享,可在线阅读,更多相关《STC89C52 DS12C887 1602液晶引脚连接以及C程序DOCWord下载.docx(25页珍藏版)》请在冰点文库上搜索。
sbitrd=P3^6;
sbitcs=P2^4;
sbitas=P2^0;
sbitwr=P2^1;
sbitds=P2^2;
ucharcodesz1[]={"
20--"
};
//初始化时候显示
ucharcodesz2[]={"
:
"
ucharcodeaa[10]={"
0123456789"
//定义一个液晶的数字字符数组
ucharcodedd[]={"
MONTUEWEDTHUFRISATSUN"
//定义一个星期显示数组
ucharcodezz[]={0,1,2,1,0,1,0,1,1,0,1,0,1};
//定义一个区别大月小月和二月的数组
ucharnum,bb;
//定义全局变量
uintcc;
//该变量用于功能键的自动退出
charshi,fen,miao,yue,ri,xq,nian1,yue1,ri1,wc,hh,nian,nm,tnnd;
//定义带符号的变量
voidds_write(uchara,ucharb)//向DS12C887写入数据
{
cs=0;
as=1;
ds=1;
wr=1;
P1=a;
as=0;
wr=0;
P1=b;
cs=1;
}
voidys(uintx)//延时函数
{
uintz,y;
for(z=x;
z>
0;
z--)
for(y=110;
y>
y--);
voidxqsd(chara)//星期设定函数,在调整月份和年份的时候刷新星期的数字
if(a==8)
xq=1;
elseif(a==9)
xq=2;
elseif(a==10)
xq=3;
elseif(a==11)
xq=4;
elseif(a==12)
xq=5;
elseif(a==13)
xq=6;
elseif(a==0)
xq=7;
elseif(a==-1)
elseif(a==-2)
elseif(a==-3)
elseif(a==-4)
elseif(a==-5)
elseif(a==-6)
ri1=1;
voidfmq()//蜂鸣器小小的响一下函数
fm=0;
ys(100);
fm=1;
voidlcdsd(uchartemp)//设定子函数
lcdrs=0;
//当lcdrs=0时,允许写入指令
P0=temp;
ys(5);
lcden=1;
lcden=0;
voidlcdxs(uchartemp)//显示子函数
lcdrs=1;
//当lcdrs=1时,允许写入显示
//lcden高脉冲将P0口数据读走
voidsr_sj(uchara,ucharb)//输入时间函数,第一个参数为光标指针,第二个为数字
lcdsd(0x80+0x40+a-1);
lcdxs(aa[b/10]);
lcdxs(aa[b%10]);
voidsr_rq(uchara,ucharb)//输入日期函数
lcdsd(0x80+a-1);
voidsr_xq(uchara,ucharb)//输入星期
{
if(b==1)
b=0;
elseif(b==2)
b=3;
elseif(b==3)
b=6;
elseif(b==4)
b=9;
elseif(b==5)
b=12;
elseif(b==6)
b=15;
elseif(b==7)
b=18;
lcdxs(dd[b]);
lcdxs(dd[b+1]);
lcdxs(dd[b+2]);
voidkey()//按键检测函数
if(s1==0)//检测功能键是否被按下
{
ys(5);
//去抖延时
if(s1==0)//再次检测功能键是否被按下
{
bb++;
//记录功能键被按下多少次
cc=0;
//当有按键按下时将cc清零
tnnd=1;
//有按键按下的时候让tnnd等于1,等退出时间设定的时候向时钟芯片写入数据
while(!
s1)//按键松手检测
{
ys(10);
//去抖延时
}
fmq();
//蜂鸣器小小的响一下
if(bb==1)//当功能键被按下一次时
TR0=0;
//关闭定时器
lcdsd(0x80+0x40+0x0b);
//光标指针指向秒的个位
lcdsd(0x0f);
//显示光标并且闪烁
if(bb==2)//当功能键被按下两次时
lcdsd(0x80+0x40+0x08);
//光标指针指向分的个位
if(bb==3)//当功能键被按下三次时
lcdsd(0x80+0x40+0x05);
//光标指针指向时的个位
if(bb==4)//当功能键被按下四次时
lcdsd(0x80+0x0a);
//光标指针指向日的个位
if(bb==5)//当功能键被按下五次时
lcdsd(0x80+0x07);
//光标指针指向月的个月
if(bb==6)//当功能键被按下六次时
lcdsd(0x80+0x04);
//光标指针指向年的个位
if(bb==7)//当功能键被按下七次时
lcdsd(0x0c);
//不显示光标
TR0=1;
//启动定时器
bb=0;
//将bb清零
}
}
}
if(bb!
=0)//当检测到功能键被按下时进入,才能检测到加减按钮
if(s1&
&
s2&
s3==1)//定时自动退出功能键
cc++;
//每进入一次cc自加一
if(cc==65535)//当cc被加到65535的时候
cc=0;
//将cc清零
if(s2==0)//检测(加)是否被按下
ys(5);
//去抖延时
if(s2==0)//再次检测(加)是否被按下
//当有按键按下时将cc清零
while(!
s2)//松手检测
{
ys(10);
//去抖延时
}
fmq();
//蜂鸣器小小的响一下
if(bb==1)//当功能键被按下一次时
miao++;
//miao加一
if(miao==60)//当miao被加到60的时候将其清零
miao=0;
sr_sj(0x0b,miao);
//改变秒的数字
lcdsd(0x80+0x40+0x0b);
//设定光标指针位置
if(bb==2)//当功能键被按下两次时
fen++;
//fen加一
if(fen==60)//当fen被加到60的时候将其清零
fen=0;
sr_sj(0x08,fen);
//改变分的数字
lcdsd(0x80+0x40+0x08);
if(bb==3)//当功能键被按下三次时
shi++;
//shi加一
if(shi==24)//当shi被加到24的时候将其清零
shi=0;
sr_sj(0x05,shi);
//改变时的数字
lcdsd(0x80+0x40+0x05);
if(bb==4)//当功能键被按下三次时
hh=ri;
//记录ri的初值
ri++;
//ri加一
if((zz[yue]==0)&
(ri==31)==1)//当小月ri被加到了31时,还原ri的值
{
ri=hh;
}
if((zz[yue]==1)&
(ri==32)==1)//当大月ri被加到32时,还原ri的值
if((zz[yue]==2)&
(nian%4==0)&
(ri==30)==1)//当闰年二月ri被加到30时,还原ri的值
(nian%4!
=0)&
(ri==29)==1)//当平年二月ri被加到29时,还原ri的值
if(hh!
=ri)//当ri发生改变时
xq++;
//xq(星期)加一
if(xq==8)//当xq被加到8的时候将其置一
xq=1;
ri1=1;
//在显示日期函数中刷新一下液晶上ri的数字
if(bb==5)//当功能键被按下五次时
wc=yue;
//先将yue的值记录下来
yue++;
//yue加一
yue1=1;
//在显示日期函数中刷新一下液晶上yue的数字
if(yue==13)//当yue被加到13时,还原yue的值
yue=wc;
(ri>
30)==1)//当小月ri大于30时
//还原yue的值
yue1=0;
//禁止液晶的刷新
29)==1)//当闰年二月ri大于29时
28)==1)//当平年二月ri大于28时
if(wc!
=yue)//检测yue的值是否发生改变
if(zz[wc]==0)//改变前是小月
{
xq=xq+2;
//星期加二
}
if(zz[wc]==1)//改变前是大月
xq=xq+3;
//星期加三
if((zz[wc]==2)&
(nian%4==0)==1)//改变前是闰年二月
xq=xq+1;
//星期加一
xqsd(xq);
//设定一下星期的值(因为有可能是星期天再加上N天)
if(bb==6)//当功能键被按下六次时
nm=nian;
//先将nian的值记录下来
nian++;
//nian加一
nian1=1;
//在显示日期函数中刷新一下液晶上nian的数字
nian=nm;
//还原nian的值
nian1=0;
//禁止液晶的刷新
if(nm!
=nian)//如果nian的值发生了改变
if(nm%4==0)//改变前是闰年
if(nm%4!
=0)//改变前是平年
//设定一下星期的值
}
if(s3==0)//检测(减)是否被按下
if(s3==0)//再次检测减是否被按下
s3)//松手检测
miao--;
//miao减一
if(miao<
0)//当miao被减过头的时候(嘿嘿),给它重新赋值
miao=59;
//改变miao的数字
//设定光标位置
fen--;
//fen减一
if(fen<
0)//当fen被减过头的时候(嘿嘿),给它重新赋值
fen=59;
//改变fen的数字
shi--;
//shi减一
if(shi<
0)//当shi被剪过头的时候(嘿嘿),给它重新赋值
shi=23;
//改变shi的数字
if(bb==4)
ri--;
(ri==0)==1)
=ri)
xq--;
if(xq==0)
xq=7;
if(bb==5)
yue--;
if(yue==0)
30)==1)
29)==1)
28)==1)
=yue)
if(zz[yue]==0)
xq=xq-2;
if(zz[yue]==1)
xq=xq-3;
if((zz[yue]==2)&
(nian%4==0)==1)
xq=xq-1;
if(bb==6)
nian--;
=nian)
if(nian%4==0)
if(nian%4!
=0)
}
uchards_read(uchara)//读取时钟芯片数据
ucharbbb;
ds=0;