STC89C52 DS12C887 1602液晶引脚连接以及C程序DOC.docx
- 文档编号:24674863
- 上传时间:2023-05-31
- 格式:DOCX
- 页数:25
- 大小:233.53KB
STC89C52 DS12C887 1602液晶引脚连接以及C程序DOC.docx
《STC89C52 DS12C887 1602液晶引脚连接以及C程序DOC.docx》由会员分享,可在线阅读,更多相关《STC89C52 DS12C887 1602液晶引脚连接以及C程序DOC.docx(25页珍藏版)》请在冰豆网上搜索。
STC89C52DS12C8871602液晶引脚连接以及C程序DOC
一:
系统整体框图
二:
1602液晶的引脚介绍
三:
DS12C887的引脚图
引脚连接:
DS12C887与单片机的连接:
MOT与GND接地;Vcc与RESET接+5V;cs接P2.4;as接P2.0;ds接P2.2;wr接P2.1;
AD0到AD7接P1口;IRQ必须接P3.3;
1602液晶与单片机的连接;
En接P3.4;rs接P3.5;rw接P3.6;D0到D7接P0口
电子时钟整体C语言程序;
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitfm=P2^3;
sbitduan=P2^6;
sbitwei=P2^7;
sbits1=P3^0;
sbits2=P3^1;
sbits3=P3^2;
sbitirq=P3^3;
sbitlcden=P3^4;
sbitlcdrs=P3^5;
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;
wr=1;
as=1;
cs=1;
}
voidys(uintx)//延时函数
{
uintz,y;
for(z=x;z>0;z--)
for(y=110;y>0;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)
xq=6;
elseif(a==-2)
xq=5;
elseif(a==-3)
xq=4;
elseif(a==-4)
xq=3;
elseif(a==-5)
xq=2;
elseif(a==-6)
xq=1;
ri1=1;
}
voidfmq()//蜂鸣器小小的响一下函数
{
fm=0;
ys(100);
fm=1;
}
voidlcdsd(uchartemp)//设定子函数
{
lcdrs=0;//当lcdrs=0时,允许写入指令
P0=temp;
ys(5);
lcden=1;
ys(5);
lcden=0;
}
voidlcdxs(uchartemp)//显示子函数
{
lcdrs=1;//当lcdrs=1时,允许写入显示
P0=temp;
ys(5);
lcden=1;//lcden高脉冲将P0口数据读走
ys(5);
lcden=0;
}
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);
lcdxs(aa[b/10]);
lcdxs(aa[b%10]);
}
voidsr_xq(uchara,ucharb)//输入星期
{
lcdsd(0x80+a-1);
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的时候
{
bb=0;//将bb清零
cc=0;//将cc清零
lcdsd(0x0c);//不显示光标
TR0=1;//启动定时器
}
}
if(s2==0)//检测(加)是否被按下
{
ys(5);//去抖延时
if(s2==0)//再次检测(加)是否被按下
{
cc=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的值
{
ri=hh;
}
if((zz[yue]==2)&&(nian%4==0)&&(ri==30)==1)//当闰年二月ri被加到30时,还原ri的值
{
ri=hh;
}
if((zz[yue]==2)&&(nian%4!
=0)&&(ri==29)==1)//当平年二月ri被加到29时,还原ri的值
{
ri=hh;
}
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;
if((zz[yue]==0)&&(ri>30)==1)//当小月ri大于30时
{
yue=wc;//还原yue的值
yue1=0;//禁止液晶的刷新
}
if((zz[yue]==2)&&(nian%4==0)&&(ri>29)==1)//当闰年二月ri大于29时
{
yue=wc;//还原yue的值
yue1=0;//禁止液晶的刷新
}
if((zz[yue]==2)&&(nian%4!
=0)&&(ri>28)==1)//当平年二月ri大于28时
{
yue=wc;//还原yue的值
yue1=0;//禁止液晶的刷新
}
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的数字
if((zz[yue]==2)&&(nian%4!
=0)&&(ri>28)==1)//当平年二月ri大于28时
{
nian=nm;//还原nian的值
nian1=0;//禁止液晶的刷新
}
if(nm!
=nian)//如果nian的值发生了改变
{
if(nm%4==0)//改变前是闰年
{
xq=xq+2;//星期加二
}
if(nm%4!
=0)//改变前是平年
{
xq=xq+1;//星期加一
}
xqsd(xq);//设定一下星期的值
}
}
}
}
if(s3==0)//检测(减)是否被按下
{
ys(5);//去抖延时
if(s3==0)//再次检测减是否被按下
{
cc=0;
while(!
s3)//松手检测
{
ys(10);//去抖延时
}
fmq();//蜂鸣器小小的响一下
if(bb==1)//当功能键被按下一次时
{
miao--;//miao减一
if(miao<0)//当miao被减过头的时候(嘿嘿),给它重新赋值
miao=59;
sr_sj(0x0b,miao);//改变miao的数字
lcdsd(0x80+0x40+0x0b);//设定光标位置
}
if(bb==2)//当功能键被按下两次时
{
fen--;//fen减一
if(fen<0)//当fen被减过头的时候(嘿嘿),给它重新赋值
fen=59;
sr_sj(0x08,fen);//改变fen的数字
lcdsd(0x80+0x40+0x08);//设定光标位置
}
if(bb==3)//当功能键被按下三次时
{
shi--;//shi减一
if(shi<0)//当shi被剪过头的时候(嘿嘿),给它重新赋值
shi=23;
sr_sj(0x05,shi);//改变shi的数字
lcdsd(0x80+0x40+0x05);//设定光标位置
}
if(bb==4)
{
hh=ri;
ri--;
if((zz[yue]==0)&&(ri==0)==1)
{
ri=hh;
}
if((zz[yue]==1)&&(ri==0)==1)
{
ri=hh;
}
if((zz[yue]==2)&&(nian%4==0)&&(ri==0)==1)
{
ri=hh;
}
if((zz[yue]==2)&&(nian%4!
=0)&&(ri==0)==1)
{
ri=hh;
}
if(hh!
=ri)
{
xq--;
if(xq==0)
xq=7;
ri1=1;
}
}
if(bb==5)
{
wc=yue;
yue--;
yue1=1;
if(yue==0)
yue=wc;
if((zz[yue]==0)&&(ri>30)==1)
{
yue=wc;
yue1=0;
}
if((zz[yue]==2)&&(nian%4==0)&&(ri>29)==1)
{
yue=wc;
yue1=0;
}
if((zz[yue]==2)&&(nian%4!
=0)&&(ri>28)==1)
{
yue=wc;
yue1=0;
}
if(wc!
=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;
}
xqsd(xq);
}
}
if(bb==6)
{
nm=nian;
nian--;
nian1=1;
if((zz[yue]==2)&&(nian%4!
=0)&&(ri>28)==1)
{
nian=nm;
nian1=0;
}
if(nm!
=nian)
{
if(nian%4==0)
{
xq=xq-2;
}
if(nian%4!
=0)
{
xq=xq-1;
}
xqsd(xq);
}
}
}
}
}
}
uchards_read(uchara)//读取时钟芯片数据
{
ucharbbb;
as=1;
ds=1;
wr=1;
cs=0;
P1=a;
as=0;
ds=0;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STC89C52 DS12C887 1602液晶引脚连接以及C程序DOC 1602 液晶 引脚 连接 以及 程序 DOC