📄 gongcheng28.c
字号:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P2^7;
sbit io = P2^6;
sbit res = P2^5;
sbit rs=P2^0; //rs1602
sbit rw=P2^1; //rw
sbit en=P2^2; //en
sbit key0=P3^0;
sbit key1=P3^1;
sbit key2=P3^2;
sbit key3=P3^3;
sbit beep=P3^5;
uchar time_date[7] ={12,4,1,7,17,55,30};//年,yue ,日,星期, 时,分,秒
uchar write_add[7] ={0x8c,0x88,0x86,0x8a,0x84,0x82,0x80}; //写的地址
uchar read_add[7] ={0x8d,0x89,0x87,0x8b,0x85,0x83,0x81}; //读的地址
uchar disp[13],dispb[8];
uchar nian,nian1,nian2,yue,yue1,yue2,ri,ri1,ri2,zhou1,zhou2,shi,shi1,shi2,fen1,fen2;
uchar an_num;
void delay(int z)
{
int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_cmd(uchar cmd) //1602
{
rs=0;
P0=cmd;
delay(5);
en=1;
delay(5);
en=0;
}
void write_date(uchar date) //1602
{
rs=1;
P0=date;
delay(5);
en=1;
delay(5);
en=0;
}
void init() //1602初始化
{
rw=0 ;
rs=0 ;
en=0;
write_cmd(0x38); //16X2
write_cmd(0x0c); //
write_cmd(0x06); //
write_cmd(0x01); //清屏
}
void write_ds1302_byte(uchar date);
void write_ds1302(uchar add,uchar date);
uchar read_ds1302(uchar add); //返回的为十六进制数
void set_rtc(void);
void read_rtc(void);
void time_pros(void);
void time_pros0(void);
void display1(void);
void write_ds1302_byte(uchar date) //单字节写
{
uchar i;
for(i=0;i<8;i++ )
{
sck=0;
io=date&0x01;
date=date>>1;
sck=1;
}
}
void write_ds1302(uchar add,uchar date)
{
res =0;
_nop_();
sck = 0;
_nop_();
res = 1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(date);
res =0;
_nop_();
io = 1;
sck = 1;
}
uchar read_ds1302(uchar add)
{
uchar i,value;
res = 0;
_nop_();
sck = 0;
_nop_();
res = 1;
_nop_();
write_ds1302_byte(add);
for(i = 0;i<8;i++ )
{
value = value>>1; //value是字符型
sck = 0;
if(io == 1)
value = value|0x80;
sck = 1;
}
res = 0;
_nop_();
sck = 0;
_nop_();
sck = 1;
io = 0;
_nop_();
return value;
}
void set_rtc(void) //设置初始时间
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_date[i]/10; //十进制转化为十六进制
time_date[i]=time_date[i]%10;
time_date[i]=time_date[i]+j*16;
}
write_ds1302(0x8e,0x00); //去除写保护 ,0x8e是写保护寄存器的地址
for(i =0;i<7;i++)
{
write_ds1302(write_add[i],time_date[i]);
}
write_ds1302(0x8e,0x80); //加写保护
}
void read_rtc(void) //读出时间,存入数组中,十六进制形式
{
uchar i;
for(i= 0;i<7;i++)
{
time_date[i]=read_ds1302(read_add[i]);
}
}
void time_pros0(void) //把读出的时间转化十位个位
{
nian1=time_date[0]/16;
nian2=time_date[0]%16;
nian=nian1*10+nian2;
yue1=time_date[1]/16;
yue2=time_date[1]%16;
yue=yue1*10+yue2;
ri1=time_date[2]/16;
ri2=time_date[2]%16;
ri=ri1*10+ri2;
zhou1=time_date[3]/16;
zhou2=time_date[3]%16;
shi1=time_date[4]/16;
shi2=time_date[4]%16;
shi=shi1*10+shi2;
fen1=time_date[5]/16;
fen2=time_date[5]%16;
}
void time_pros(void) //存入数组
{
//年
disp[0]=nian1+'0'; //十位
disp[1]=nian2+'0'; //个位
disp[2]='-';
//月
disp[3]=yue1+'0'; //十位
disp[4]=yue2+'0'; //个位
disp[5]='-';
disp[6]=ri1+'0'; //日
disp[7]=ri2+'0';
disp[8]='-';
disp[9]='D';
disp[10]='a';
disp[11]='y';
//disp[12]=zhou1+'0'; //星期
disp[12]=zhou2+'0';
//disp[11]='-';
dispb[0]=shi1+'0'; //时
dispb[1]=shi2+'0';
dispb[2]=':';
dispb[3]=fen1+'0'; //fen
dispb[4]=fen2+'0';
dispb[5]=':';
//------> disp[6]=time_date[6]/16+'0'; //miao 这是我写程序时的错误,
//------> disp[7]=time_date[6]%16+'0'; //被网友电之子发现的,太粗心了我
//------> disp[8]='-';
dispb[6]=time_date[6]/16+'0'; //miao
dispb[7]=time_date[6]%16+'0';
//dispb[8]='-';
}
void display1(void)
{
uchar i;
//init();
write_cmd(0x80);
for(i=0;i<13;i++)
{
write_date(disp[i]);
delay(5);
}
write_cmd(0x80+0x40);
for(i=0;i<8;i++)
{
write_date(dispb[i]);
delay(5);
}
delay(210);
}
//按键检测
void keyscan()
{
if(key0==0)
{
delay(10);
if(key0==0)
{
beep=0;
delay(40);
beep=1;
an_num++;
if(an_num==1) // fen
{
write_cmd(0x80+0x40+4);
write_cmd(0x0f);
}
if(an_num==2) // shi
{
write_cmd(0x80+0x40+1);
write_cmd(0x0f);
}
if(an_num==3) //zhou
{
write_cmd(0x80+12);
write_cmd(0x0f);
}
if(an_num==4) //ri
{
write_cmd(0x80+7);
write_cmd(0x0f);
}
if(an_num==5) //yue
{
write_cmd(0x80+4);
write_cmd(0x0f);
}
if(an_num==6) //nian
{
write_cmd(0x80+1);
write_cmd(0x0f);
}
if(an_num==7)
{
an_num=0;
write_cmd(0x0c);
}
while(!key0);
write_cmd(0x0c);
}
}//第一个if结束
if(an_num!=0)
{
if(key1==0) //增判断
{
delay(10);
if(key1==0)
{
beep=0;
delay(40);
beep=1;
while(!key1);
switch(an_num)
{
case 1:{ write_cmd(0x80+0x40+4);
write_cmd(0x0f);
fen2++;
if(fen2>9)
{
fen2=0;
fen1++;
if(fen1>5)
fen1=0;
}
time_date[5]=fen2+fen1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[5],time_date[5]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 2:{write_cmd(0x80+0x40+1); //时
write_cmd(0x0f);
shi++;
if(shi>23)
{
shi=0;
}
shi1=shi/10;
shi2=shi%10;
time_date[4]=shi2+shi1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[4],time_date[4]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 3:{write_cmd(0x80+12); //周
write_cmd(0x0f);
zhou2++;
if(zhou2>7)
{
zhou2=1;
}
time_date[3]=zhou2+zhou1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[3],time_date[3]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 4:{write_cmd(0x80+7); //日
write_cmd(0x0f);
ri++;
if(ri>31)
{
ri=1;
}
ri1=ri/10;
ri2=ri%10;
time_date[2]=ri2+ri1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[2],time_date[2]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 5:{write_cmd(0x80+4); //月
write_cmd(0x0f);
yue++;
if(yue>12)
{
yue=1;
}
yue1=yue/10;
yue2=yue%10;
time_date[1]=yue2+yue1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[1],time_date[1]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 6:{write_cmd(0x80+1);
write_cmd(0x0f);
nian++;
if(nian>99)
{
nian=0;
}
nian1=nian/10;
nian2=nian%10;
time_date[0]=nian2+nian1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[0],time_date[0]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
default: break;
}
delay(200);
write_cmd(0x0c);
}
}//增判断结束
if(key2==0) //减判断
{
delay(10);
if(key2==0)
{
beep=0; //短暂声音提示
delay(40);
beep=1;
while(!key1);
switch(an_num)
{
case 1:{ write_cmd(0x80+0x40+4);
write_cmd(0x0f);
fen2--;
if(fen2<0)
{
fen2=9;
fen1--;
if(fen1<0)
fen1=5;
}
time_date[5]=fen2+fen1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[5],time_date[5]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 2:{write_cmd(0x80+0x40+1); //时
write_cmd(0x0f);
shi--;
if(shi<0)
{
shi=23;
}
shi1=shi/10;
shi2=shi%10;
time_date[4]=shi2+shi1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[4],time_date[4]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 3:{write_cmd(0x80+12); //周
write_cmd(0x0f);
zhou2--;
if(zhou2<1)
{
zhou2=7;
}
time_date[3]=zhou2+zhou1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[3],time_date[3]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 4:{write_cmd(0x80+7); //日
write_cmd(0x0f);
ri--;
if(ri<1)
{
ri=31;
}
ri1=ri/10;
ri2=ri%10;
time_date[2]=ri2+ri1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[2],time_date[2]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 5:{write_cmd(0x80+4); //月
write_cmd(0x0f);
yue--;
if(yue<1)
{
yue=12;
}
yue1=yue/10;
yue2=yue%10;
time_date[1]=yue2+yue1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[1],time_date[1]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
case 6:{write_cmd(0x80+1);
write_cmd(0x0f);
nian--;
if(nian<0)
{
nian=99;
}
nian1=nian/10;
nian2=nian%10;
time_date[0]=nian2+nian1*16;
write_ds1302(0x8e,0x00); //去除写保护
write_ds1302(write_add[0],time_date[0]);
write_ds1302(0x8e,0x80); //加写保护
}
break;
default: break;
}
delay(200);
write_cmd(0x0c);
}
}//减判断结束
}
}
void main()
{
beep=1;
init(); //1602初始化
//set_rtc();
while(1)
{
read_rtc();
time_pros0();
keyscan();
time_pros();
display1();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -