📄 8051-ds12887--.c
字号:
#include<reg52.h>
#include <SoundPlay.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P1^0;
sbit rw=P1^1;
sbit e=P1^2;
sbit dscs=P1^3;
sbit dsas=P1^4;
sbit dsrw=P1^5;
sbit dsds=P1^6;
sbit dsirq=P3^2;
sbit k1=P3^5;
sbit k2=P3^6;
sbit k3=P3^7;
sbit buzzer=P1^7;
uchar flag=0,flag1;
char k1num=0;
char nian,yue,ri,zhou;
char i;
char shi,fen,miao;
uchar code table[]=" 20-------- ";//年月日中间有"-",开始全写空格就ok
uchar code table1[]=" : : ";
uchar code table2[7][3]={"MON","TUE","WEN","THU","FRI","SAT","SUN"};
void delay(uchar z)
{
uchar i,j;
for(i=0;i<z;i++)
for(j=120;j>0;j--);
}
void write_com_1602(uchar com)
{
rs=0;
e=0;
P2=com;
delay(1);
e=1;
delay(1);
e=0;
}
void write_date_1602(uchar date)
{
rs=1;
e=0;
P2=date;
delay(1);
e=1;
delay(1);
e=0;
}
void write_sfm(uchar shi,uchar fen,uchar miao)
{
uchar shis,shig,fens,feng,miaos,miaog;//个位和十位
shis=shi/10;
shig=shi%10;
fens=fen/10;
feng=fen%10;
miaos=miao/10;
miaog=miao%10;
write_com_1602(0x80+0x40+4);
write_date_1602(shis+0x30);
write_date_1602(shig+0x30);
write_com_1602(0x80+0x40+7);
write_date_1602(fens+0x30);
write_date_1602(feng+0x30);
write_com_1602(0x80+0x40+10);
write_date_1602(miaos+0x30);
write_date_1602(miaog+0x30);
}
void write_nyrz(uchar nian,uchar yue,uchar ri,uchar zhou)//写年月日周**注意年时int型
{ //年的范围2000-2099!!nian 00-99设成uchar ok
int i;
write_com_1602(0x80+4);
write_date_1602(nian/10+0x30);
//write_com_1602(0x80+5);
write_date_1602(nian%10+0x30);
write_com_1602(0x80+7);//
write_date_1602(yue/10+0x30);
//write_com_1602(0x80+8);
write_date_1602(yue%10+0x30);
write_com_1602(0x80+10);//
write_date_1602(ri/10+0x30);
//write_com_1602(0x80+11);
write_date_1602(ri%10+0x30);
write_com_1602(0x80+13);
for(i=0;i<3;i++)
write_date_1602(table2[zhou-1][i]);//写完一个字母后指针自己加一
}
void write_ds12887(uchar add,uchar date)
{
dscs=0;
dsas=0;
dsds=1;
dsrw=1;
dsas=1;
P0=add;
dsas=0;
dsrw=0;
P0=0xff;
P0=date;
dsrw=1;
dsas=1;
dscs=1;
}
uchar read_ds12887(uchar add)
{
uchar dat;
dsas=0;
dsds=1;
dsrw=1;
dsas=1;
dscs=0;
P0=add;
dsas=0;
dsds=0;
P0=0xff;
dat=P0;
dsds=1;
dsas=1;
dscs=1;
return dat;
}
void init()
{ uchar i;
rw=0;
buzzer=0;
EA=1;
EX0=1;
flag1=0;
write_com_1602(0x38);
write_com_1602(0x0c);//0x0e 光标不闪烁
write_com_1602(0x01);
write_com_1602(0x80);
write_ds12887(0x0a,0x20);//一开始问题出在这里,特特特特别注意,,可能第一次用的时候要设置
write_ds12887(0x0b,0x86);//write_ds(0x0B,0x26);read_ds(0x0c);
write_ds12887(0x0b,0x06);
write_ds12887(0x0b,0x26);//闹钟中断使能
read_ds12887(0x0c);//清除闹钟中断标志位
for(i=0;table[i];i++)
{
write_date_1602(table[i]);
}
write_com_1602(0x80+0x40);
for(i=0;table1[i];i++)
{
write_date_1602(table1[i]);
}
}
//设置时间年月日周时分秒
void settime_12887(uchar nian,uchar yue,uchar ri,uchar zhou,uchar shi,uchar fen,uchar miao)
{
write_ds12887(0x00,miao);
write_ds12887(0x02,fen);
write_ds12887(0x04,shi);
write_ds12887(0x06,zhou);
write_ds12887(0x07,ri);
write_ds12887(0x08,yue);
write_ds12887(0x09,nian);
}
void set_alarm(uchar shi,uchar fen,uchar miao)
{
write_ds12887(0x01,miao);
write_ds12887(0x03,fen);
write_ds12887(0x05,shi);
}
void alarm()
{
buzzer=1;
delay(200);
buzzer=0;
delay(1000);
buzzer=1;
delay(200);
buzzer=0;
}
void xianshi_all()//显示年月日周时分秒
{
write_com_1602(0x0c);//指针不闪烁不显示
nian=read_ds12887(9);
yue=read_ds12887(8);
ri=read_ds12887(7);
zhou=read_ds12887(6);
write_nyrz(nian,yue,ri,zhou);//显示年月日周
shi=read_ds12887(4);
fen=read_ds12887(2);
miao=read_ds12887(0);
write_sfm(shi,fen,miao);//显示时分秒
}
void keyscan()
{
if(k1==0)
{
delay(5);
if(k1==0)
{
while(k1==0);
k1num++;
flag1=1;
write_ds12887(0x0a,0x80);//ds12887停止
if(k1num==1)
{ write_com_1602(0x0f);//显示光标,闪烁
write_com_1602(0x80+0x40+11);
//settime_12887(1,4,5,7,22,55,37);
}
if(k1num==2)
{ write_com_1602(0x80+0x40+8);
}
if(k1num==3)
{ write_com_1602(0x80+0x40+5);
}
if(k1num==4)
{ write_com_1602(0x80+15);
}
if(k1num==5)
{ write_com_1602(0x80+11);
}
if(k1num==6)
{ write_com_1602(0x80+8);
}
if(k1num==7)
{ write_com_1602(0x80+5);
}
if(k1num==8)
{ k1num=0;
flag1=0;
write_ds12887(0x0a,0x20);//ds12887开启
write_com_1602(0x0c);//指针停止闪烁
settime_12887(nian,yue,ri,zhou,shi,fen,miao);
}
}
}
if(k1num!=0)
{
if(k2==0)
{
delay(5);
if(k2==0)
{
while(k2==0);
if(k1num==1)
{
miao++;
if(miao==60)
miao=0;
write_com_1602(0x80+0x40+10);//在液晶上面显示秒
write_date_1602(miao/10+0x30);
write_date_1602(miao%10+0x30);
//xianshi_all();
write_com_1602(0x80+0x40+11);//把闪烁的指针调回来。否则在write_sfm()写完后指针跑后面去了
//settime_12887(5,4,5,7,22,55,37);
}
if(k1num==2)
{
fen++;
if(fen==60)
fen=0;
write_com_1602(0x80+0x40+7);//在液晶上面显示分
write_date_1602(fen/10+0x30);
write_date_1602(fen%10+0x30);
//xianshi_all();
write_com_1602(0x80+0x40+8);
}
if(k1num==3)
{
shi++;
if(shi==24)
shi=0;
write_com_1602(0x80+0x40+4);//在液晶上面显示shi
write_date_1602(shi/10+0x30);
write_date_1602(shi%10+0x30);
//xianshi_all();
write_com_1602(0x80+0x40+5);
}
if(k1num==4)
{
zhou++;
if(zhou==8)
zhou=1;
write_com_1602(0x80+13);//在液晶上面显示shi
for(i=0;i<3;i++)
write_date_1602(table2[zhou-1][i]);
//xianshi_all();
write_com_1602(0x80+15);
}
if(k1num==5)
{
ri++;
if(ri==32)
ri=1;
write_com_1602(0x80+10);//在液晶上面显示shi
write_date_1602(ri/10+0x30);
write_date_1602(ri%10+0x30);
//xianshi_all();
write_com_1602(0x80+11);
}
if(k1num==6)
{
yue++;
if(yue==13)
yue=0;
write_com_1602(0x80+7);//在液晶上面显示shi
write_date_1602(yue/10+0x30);
write_date_1602(yue%10+0x30);
//xianshi_all();
write_com_1602(0x80+8);
}
if(k1num==7)
{
nian++;
if(nian==100)
nian=0;
write_com_1602(0x80+4);//在液晶上面显示shi
write_date_1602(nian/10+0x30);
write_date_1602(nian%10+0x30);
//xianshi_all();
write_com_1602(0x80+5);
}
}
}
}
if(k1num!=0)
{
if(k3==0)
{
delay(5);
if(k3==0)
{
while(k3==0);
if(k1num==1)
{
miao--;
if(miao==-1)
miao=59;
write_com_1602(0x80+0x40+10);//在液晶上面显示秒
write_date_1602(miao/10+0x30);
write_date_1602(miao%10+0x30);
//xianshi_all();
write_com_1602(0x80+0x40+11);//把闪烁的指针调回来。否则在write_sfm()写完后指针跑后面去了
}
if(k1num==2)
{
fen--;
if(fen==-1)
fen=59;
write_com_1602(0x80+0x40+7);//在液晶上面显示分
write_date_1602(fen/10+0x30);
write_date_1602(fen%10+0x30);
//xianshi_all();
write_com_1602(0x80+0x40+8);
}
if(k1num==3)
{
shi--;
if(shi==-1)
shi=23;
write_com_1602(0x80+0x40+4);//在液晶上面显示shi
write_date_1602(shi/10+0x30);
write_date_1602(shi%10+0x30);
//xianshi_all();
write_com_1602(0x80+0x40+5);
}
if(k1num==4)
{
zhou--;
if(zhou==0)
zhou=7;
write_com_1602(0x80+13);//在液晶上面显示
for(i=0;i<3;i++)
write_date_1602(table2[zhou-1][i]);
//xianshi_all();
write_com_1602(0x80+15);
}
if(k1num==5)
{
ri--;
if(ri==-1)
ri=31;
write_com_1602(0x80+10);//在液晶上面显示
write_date_1602(ri/10+0x30);
write_date_1602(ri%10+0x30);
//xianshi_all();
write_com_1602(0x80+11);
}
if(k1num==6)
{
yue--;
if(yue==-1)
yue=12;
write_com_1602(0x80+7);//在液晶上面显示
write_date_1602(yue/10+0x30);
write_date_1602(yue%10+0x30);
//xianshi_all();
write_com_1602(0x80+8);
}
if(k1num==7)
{
nian--;
if(nian==-1)
nian=99;
write_com_1602(0x80+4);//在液晶上面显示i
write_date_1602(nian/10+0x30);
write_date_1602(nian%10+0x30);
//xianshi_all();
write_com_1602(0x80+5);
}
}
}
}
}
void main()
{
init();
//set_alarm(19,13,20);
//settime_12887(9,4,7,2,12,18,37);
while(1)
{
keyscan();
if(flag==1)
{
alarm();
}
if(flag1==0)
xianshi_all();
}
}void int0() interrupt 0
{
uchar a;
a=read_ds12887(0x0c);//清除闹钟中断标志位
flag=1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -